OpenCV二值图像Blob检测无法正常着色标注关键点问题咨询
问题根因
代码里存在3处直接导致着色标注失效的逻辑错误:
drawKeypoints传入的画布尺寸完全错误:定义的blank = np.zeros((20, 20))是20×20的极小单通道矩阵,和待标注的mask图尺寸完全不匹配,OpenCV无法在尺寸不匹配的画布上绘制关键点,要么直接报错要么输出完全错乱的图像。- Blob检测器输入与检测逻辑不匹配:OpenCV自带的
SimpleBlobDetector默认检测黑色背景上的白色连通域,对黄色mask做反色之后,原本的黄色目标区域变成黑色、背景变成白色,如果不修改检测器的blobColor参数,根本检测不到目标黄色区域的关键点;另外额外把单通道二值图转成RGB三通道的操作完全多余,反而会干扰检测器内部的二值化处理逻辑。 - 关键点绘制的传参逻辑错误:
drawKeypoints要求传入的输出画布必须和输入原图的尺寸、通道数对齐,传入的20×20单通道矩阵和处理后的mask尺寸、通道数都不匹配,根本无法正常绘制红色标注。
修正后的可运行代码
## 提取黄色区域mask mask_yellow = cv2.inRange(Img, (0, 180, 240), (20, 255, 255)) # 定义形态学操作核 kernel = np.ones((15,15), np.uint8) # 对mask做闭运算、开运算去除噪点 mask_yellow = cv2.morphologyEx(mask_yellow, cv2.MORPH_CLOSE, kernel) mask_yellow = cv2.morphologyEx(mask_yellow, cv2.MORPH_OPEN, kernel) # 缩放显示原始mask mask_yellow_view = cv2.resize(mask_yellow, dsize) cv2.imshow('Yellow mask', mask_yellow_view) # 配置Blob检测器参数 params = cv2.SimpleBlobDetector_Params() params.filterByArea = True params.minArea = 10000 # mask中黄色区域为白色(255)、背景为黑色(0),直接检测亮域即可,无需反色 params.blobColor = 255 detector = cv2.SimpleBlobDetector_create(params) # 直接传入单通道二值mask做检测,不需要转RGB keypoints = detector.detect(mask_yellow) # 生成和mask同尺寸的三通道全黑画布,用于绘制关键点 blank = np.zeros((mask_yellow.shape[0], mask_yellow.shape[1], 3), dtype=np.uint8) blobs = cv2.drawKeypoints(mask_yellow, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) # 显示标注结果 cv2.imshow("Keypoints", blobs) cv2.waitKey(0) cv2.destroyAllWindows()
补充说明
- 如果确实需要检测反色后的黑色连通域,只要把
params.blobColor参数值改为0即可,不需要做多余的颜色空间转换。 - 调用
cv2.imshow之后必须搭配cv2.waitKey事件监听,否则窗口会一闪而过,无法正常查看结果。
内容的提问来源于stack exchange,提问作者raven tramper
相关产品推荐
相关产品推荐

