You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:54:04