运行OpenCV红色目标测距代码触发NameError变量未定义错误咨询
报错根因定位
- 直接触发NameError的核心逻辑:主循环里存储目标宽度的
genislik变量只有在识别到合格红色目标时才会赋值。只要某一帧没检测到符合面积要求的目标,genislik完全没被初始化,后面调用距离计算函数读取这个变量的时候就会报未定义。 - 轮廓判断逻辑完全写反:原代码里遍历轮廓的时候,只要面积≥500的有效目标出现,就会触发
exit直接退出程序,根本没法持续做实时检测。 - 校准流程的隐藏坑:
foto_cevirme函数如果加载的参考图resim.jpg不存在,或者图里没找到有效红色目标,face_width根本不会被赋值,函数直接返回未定义值,后面计算焦距的时候一样会报NameError。 - 函数代码顺序写错:
foto_cevirme里把return face_width写在了图像画框、掩码生成的前面,后面的可视化代码永远跑不到。
可落地修复方案
- 进入摄像头主循环之前,先给
genislik设个初始值0,就算某一帧没检测到目标也不会报未定义。 - 把原来错误的
else: exit删掉,只保留“轮廓面积小于500就跳过”的判断,符合要求的轮廓才提取对应的像素宽度。 - 给
foto_cevirme函数加兜底:函数一开始就设face_width = 0,要是参考图没检测到目标,直接弹出“校准图未识别到红色目标”的提示,别返回个未定义的值让后面代码报错。 - 把
foto_cevirme里的return face_width挪到所有图像绘制、掩码生成、窗口显示的代码后面,保证参考图的检测预览能正常出来。 - 加个无目标判断:如果检测到的目标宽度是0,直接在画面上显示“未检测到红色目标”,别硬跑距离计算,省得报除零或者变量未定义的错。
内容的提问来源于stack exchange,提问作者Mustafa Kendigüzel
相关产品推荐
相关产品推荐

