计算机视觉手指宽度计算:遍历x轴为何无法输出宽度结果?
问题分析与解决方案
你的代码无法输出宽度,主要有几个关键问题,我来逐一拆解并给出修复方案:
1. 变量未初始化导致的未定义错误
如果在y=156这条水平线上,没有出现完整的黑→白→黑过渡(比如这条线刚好没切到手指,或者二值化效果有问题),b2w或w2b就不会被赋值。当执行width = w2b - b2w时,Python会抛出NameError,程序直接终止,自然看不到print(width)的输出。
2. 循环起始索引越界
你的循环从range(x, xD)开始,第一次迭代时i=x,此时访问thresh[i-1][156]相当于访问thresh[x-1][156]。如果x=0,就会出现负索引错误,程序直接崩溃,根本跑不到打印步骤。
3. 未处理多过渡/覆盖问题
如果这条线上有多个手指(多个黑→白→黑段),你的代码会不断覆盖b2w和w2b的值,最终得到的可能不是你想要的第一个手指的宽度,甚至逻辑混乱。
修复后的代码
# 初始化变量为None,避免未定义错误 b2w = None w2b = None # 从x+1开始循环,避免i-1越界 for i in range(x + 1, xD): # 只记录第一个黑转白的点 if b2w is None and thresh[i-1][156] == 0 and thresh[i][156] == 255: b2w = i # 找到黑转白后,再找第一个白转黑的点,找到后提前退出循环 elif b2w is not None and thresh[i-1][156] == 255 and thresh[i][156] == 0: w2b = i break # 只有当两个边缘点都找到时,才计算并打印宽度 if b2w is not None and w2b is not None: width = w2b - b2w print(width) else: print("在y=156的线上未找到完整的手指边缘(缺少黑→白或白→黑过渡)")
关键修复点说明
- 变量初始化:用
None初始化b2w和w2b,后续可以判断是否成功找到边缘点,避免未定义错误。 - 调整循环起始点:从
x+1开始,确保i-1不会出现负索引,避免越界崩溃。 - 增加条件过滤:只记录第一个完整的黑→白→黑过渡段,找到后立即
break提升效率,同时避免变量被覆盖。 - 有效性判断:打印前先确认两个边缘点都已找到,否则输出提示信息,方便排查问题。
内容的提问来源于stack exchange,提问作者y0un35
相关产品推荐
相关产品推荐

