如何使用OpenCV在图像上标注数值并绘制更大尺寸的识别圆圈
管道计数代码标记圈放大调整方案
你当前代码绘制的标记圆圈过小,是由drawKeypoints参数配置错误导致的,按以下步骤修改即可实现需求:
修改点说明
- 替换绘制标志
你第二段自定义参数检测后的绘制代码使用了cv2.DRAW_MATCHES_FLAGS_DEFAULT,该参数只会绘制固定尺寸的小标记点,替换为cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS即可根据管道的实际尺寸自动匹配标记圆圈大小。
- 替换绘制标志
- 可选:手动控制标记圈放大倍数
如果自动匹配的尺寸还是不符合需求,可以遍历检测到的关键点手动画圆,自定义放大系数调整标记大小。
- 可选:手动控制标记圈放大倍数
调整后完整代码
# 导入依赖库 import cv2 import numpy as np # 加载图像 image = cv2.imread("enhanced.sample3.png") cv2.waitKey(0) # 创建默认参数的blob检测器 detector = cv2.SimpleBlobDetector_create() keypoints = detector.detect(image) blank = np.zeros((1,1)) blobs = cv2.drawKeypoints(image, keypoints, blank, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len(keypoints) text = "总blob数量: " + str(number_of_blobs) cv2.putText(blobs, text, (2, 55), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 2) cv2.waitKey(0) # 配置自定义blob检测参数 params = cv2.SimpleBlobDetector_Params() # 面积过滤 params.filterByArea = True params.minArea = 100 # 圆度过滤 params.filterByCircularity = True params.minCircularity = 0.4 # 凸度过滤 params.filterByConvexity = True params.minConvexity = 0.3 # 惯性比过滤 params.filterByInertia = True params.minInertiaRatio = 0.01 detector = cv2.SimpleBlobDetector_create(params) keypoints = detector.detect(image) number_of_blobs = len(keypoints) print("圆形blob数量: " + str(number_of_blobs)) # ========== 此处为修改部分 ========== # 方案1:仅替换绘制标志,自动适配管道尺寸画圈 # blobs = cv2.drawKeypoints(image, keypoints, np.zeros((1,1)), (0,200,222), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) # 方案2:手动画圈,可自定义放大倍数,scale参数按需调整 blobs = image.copy() scale = 1.8 # 标记圈放大系数,数值越大圈越大 for kp in keypoints: x, y = int(kp.pt[0]), int(kp.pt[1]) radius = int(kp.size/2 * scale) cv2.circle(blobs, (x, y), radius, (0,200,222), 2) # ==================================== text = "圆形管道数量: " + str(number_of_blobs) cv2.putText(blobs, text, (1, 55), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 2) cv2.imshow("检测结果", blobs) cv2.waitKey(0) cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Sumukh Jadhav
相关产品推荐
相关产品推荐

