如何解决Python逻辑语句弃用警告及Basler相机GUI运行问题
问题修复方案
1 弃用警告修复
原因:代码中if(image[CamIdx] != [])是将numpy格式的图像数组与空列表直接比较,该用法已被numpy弃用,触发警告。
修复方法:将该行替换为
if image[CamIdx].size != 0:
即可消除警告。
2 cv2.imwrite报错修复
原因:你调用cv2.imwrite时使用的image[CamIdx]已经被转换为ImageTk.PhotoImage类型,而cv2.imwrite仅支持传入numpy数组格式的图像数据,类型不匹配导致报错。
同时你现有代码中存在两个影响功能的逻辑问题:
- 预览Panel重复创建:同一个相机索引下你两次实例化
tk.Label赋值给panel[CamIdx],会覆盖第一个预览Label,无法实现上下双预览的效果 - 子线程直接操作Tk控件:Tkinter不是线程安全的,在子线程中直接更新Label控件内容会概率性引发程序崩溃
完整修改后的核心代码逻辑
# 提前声明两个预览面板数组,分别存上下位预览 panel_top = [None]*4 panel_bottom = [None]*4 # 单独声明数组保存原始cv2格式图像,用于存储 raw_image = [None]*4 def LiveThread(strIdx): CamIdx = int(strIdx) try: panel_top[CamIdx] = None panel_bottom[CamIdx] = None raw_image[CamIdx] = None # 开始取流 camera[CamIdx].StartGrabbing(pylon.GrabStrategy_LatestImageOnly) print("Cam",CamIdx,': 开始取流') iterator = 0 while bLiveThraed[CamIdx]: grabResult = camera[CamIdx].RetrieveResult(5000, pylon.TimeoutHandling_ThrowException) if grabResult.GrabSucceeded(): img = converter[CamIdx].Convert(grabResult).GetArray() if img.size != 0: # 先转换为cv2可用的格式,保存原始数组用于写盘 raw_image[CamIdx] = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) resized_img = cv2.resize(raw_image[CamIdx], (345,270)) # 转换为tk预览用的图像 tk_img = ImageTk.PhotoImage(image = Image.fromarray(resized_img)) # 将UI更新操作抛到主线程执行 def update_ui(cam_id, tk_image): if panel_top[cam_id] is None: # 初始化上位预览 panel_top[cam_id] = tk.Label(image=tk_image) panel_top[cam_id].image = tk_image panel_top[cam_id].place(x=(345*cam_id)+(20*cam_id)+20, y=100) # 初始化下位预览 panel_bottom[cam_id] = tk.Label(image=tk_image) panel_bottom[cam_id].image = tk_image panel_bottom[cam_id].place(x=(345*cam_id)+(20*cam_id)+20, y=400) else: # 更新两个预览的图像 panel_top[cam_id].configure(image=tk_image) panel_top[cam_id].image = tk_image panel_bottom[cam_id].configure(image=tk_image) panel_bottom[cam_id].image = tk_image # 用after方法通知主线程执行UI更新,root替换为你自己的Tk实例变量名 root.after(0, update_ui, CamIdx, tk_img) # 需要保存图像时调用以下代码,用raw_image而不是转换后的tk图像 # cv2.imwrite(f'./trial/camera{CamIdx}{iterator}.jpg', cv2.cvtColor(raw_image[CamIdx], cv2.COLOR_RGB2BGR)) # iterator +=1 else: print("报错: ", grabResult.ErrorCode) grabResult.Release() except genicam.GenericException as e: print("触发异常", e.GetDescription())
内容的提问来源于stack exchange,提问作者Kimwaga Makono
相关产品推荐
相关产品推荐

