分块统计图像白像素调用cv.countNonZero触发cn==1断言错误
错误原因
cv2.error: (-215:Assertion failed) cn == 1 断言失败的核心原因是:
cv.countNonZero()函数仅支持单通道矩阵(灰度图、二值掩膜)作为输入,要求输入的通道数cn=1- 你代码中切片的
self.n1/self.n2/self.n3来自三通道BGR图res(res是三通道彩色图经掩膜运算得到的结果,保留了3个颜色通道),不符合入参要求 - 额外笔误:你写的
cv.countNonzero函数名大小写错误,正确写法是cv.countNonZero(Z大写),不修的话后续会触发属性不存在的报错
修复方法
你需要统计的是符合HSV阈值范围的目标像素数量,直接对cv.inRange输出的单通道二值mask做切片统计即可,不需要用三通道的res图:
将原代码中切片、统计非零像素的部分替换为以下内容:
# 直接对单通道二值mask做分区切片 self.n1 = mask[0:480, 0:213] self.n2 = mask[0:480, 214:427] self.n3 = mask[0:480, 428:640] # 修正函数名大小写,统计每个分区的非零(目标色)像素数 nnz1 = cv.countNonZero(self.n1) nnz2 = cv.countNonZero(self.n2) nnz3 = cv.countNonZero(self.n3)
可选优化建议
- 硬编码切片边界容易出现越界、适配性差的问题,可以根据图像实际宽度自动均分3个分区:
img_height, img_width = mask.shape[:2] block_width = img_width // 3 self.n1 = mask[:, 0:block_width] self.n2 = mask[:, block_width:2*block_width] self.n3 = mask[:, 2*block_width:]
- 现有转向判断逻辑存在分支遗漏:当两个分区的非零像素数相等且同为最大值时,不会匹配任何判断分支,
yaw_rate会沿用上一次的数值,建议补充兜底逻辑避免异常。
内容的提问来源于stack exchange,提问作者Ben Freeman
相关产品推荐
相关产品推荐

