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

为何我的OpenCV滑块初始值为None?类型转换报错求助

OpenCV滑块值获取错误解决方法

问题核心:你错误地把cv2.createTrackbar()的返回值当成了滑块的当前值,但这个函数返回的是滑块的ID(部分环境下可能返回None),并非实际的数值,所以后续尝试将其转为整数时触发了*TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'*。

修正方案

不要直接使用createTrackbar的返回值作为滑块数值,而是在循环中调用cv2.getTrackbarPos()实时获取滑块的当前值(该值本身就是整数类型),同时规范窗口创建流程:

import cv2
from mss import mss

def on_change(value):
    pass

windowname = 'settings'  
# 规范创建窗口,确保滑块能正常挂载
cv2.namedWindow(windowname)
# 创建滑块,无需保存返回值(若需操作滑块可保存为ID)
cv2.createTrackbar('fov x', windowname, 640, 1920, on_change)
cv2.createTrackbar('fov y', windowname, 640, 1080, on_change)

while True:
    # 实时获取滑块的整数型当前值
    WINDOW_SIZEX = cv2.getTrackbarPos('fov x', windowname)
    WINDOW_SIZEY = cv2.getTrackbarPos('fov y', windowname)
    
    with mss() as sct:
        dimensions = sct.monitors[1] 
        # 直接使用获取到的整数,无需额外转换
        monitor = {
            "top": int((dimensions['height'] / 2) - (WINDOW_SIZEY / 2)),
            "left": int((dimensions['width'] / 2) - (WINDOW_SIZEX / 2)),
            "width": WINDOW_SIZEX,
            "height": WINDOW_SIZEY
        }
    
    # 按ESC键退出循环,避免程序无限运行
    if cv2.waitKey(1) & 0xFF == 27:
        break

# 关闭窗口释放系统资源
cv2.destroyAllWindows()

关键改动说明

  • 用cv2.namedWindow()替代cv2.imshow(windowname, 0),更规范地创建滑块所属窗口;
  • 循环内通过getTrackbarPos()获取实时滑块值,确保拿到的是整数类型;
  • 移除了多余的int()转换操作,避免无效转换;
  • 添加了退出逻辑和窗口销毁代码,保证程序能正常终止。

内容的提问来源于stack exchange,提问作者joergttv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:13:20