如何用OpenCV通过鼠标点击取4坐标掩码图像并获取掩码区域中心
解决方案
首先,原代码中counter变量存在作用域问题,需要调整为全局变量才能正常计数。接下来我们在收集到4个坐标后,自动完成掩码生成和中心计算功能:
修改后的完整代码
import cv2 import numpy as np # 用于存储坐标的变量 refPt = [] counter = 0 # 点击事件函数 def click_event(event, x, y, flags, param): global counter, refPt, img if event == cv2.EVENT_LBUTTONDOWN: print(f"{x}, {y}") refPt.append([x, y]) font = cv2.FONT_HERSHEY_SIMPLEX strXY = f"{x}, {y}" cv2.putText(img, strXY, (x, y), font, 0.5, (255, 255, 0), 2) cv2.imshow("image", img) counter += 1 # 收集到4个点后执行掩码和中心计算 if counter == 4: # 生成与原图同尺寸的空掩码 mask = np.zeros_like(img[:, :, 0]) # 转换坐标为OpenCV多边形要求的格式 pts = np.array(refPt, np.int32).reshape((-1, 1, 2)) # 填充多边形区域为白色(255) cv2.fillPoly(mask, [pts], 255) # 计算掩码区域的质心 M = cv2.moments(mask) if M["m00"] != 0: cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) else: # 极端情况:掩码无面积,用四个点的几何均值 cX = int(np.mean([p[0] for p in refPt])) cY = int(np.mean([p[1] for p in refPt])) print(f"掩码区域中心坐标:({cX}, {cY})") # 可视化结果 img_result = img.copy() # 用半透明绿色标记掩码区域 img_result[mask == 255] = [0, 255, 0] # 绘制中心标记 cv2.circle(img_result, (cX, cY), 5, (0, 0, 255), -1) cv2.putText(img_result, f"Center: ({cX}, {cY})", (cX-60, cY-10), font, 0.5, (0, 0, 255), 2) cv2.imshow("Result", img_result) if event == cv2.EVENT_RBUTTONDOWN: blue = img[y, x, 0] green = img[y, x, 1] red = img[y, x, 2] font = cv2.FONT_HERSHEY_SIMPLEX strBGR = f"{blue}, {green}, {red}" cv2.putText(img, strBGR, (x, y), font, 0.5, (0, 255, 255), 2) cv2.imshow("image", img) # 读取图像 img = cv2.imread("C:/Users/FK8ROME/Desktop/Defrost/Scripts/images/example.jpg") cv2.imshow("image", img) # 设置鼠标回调 cv2.setMouseCallback("image", click_event) cv2.waitKey(0) cv2.destroyAllWindows()
关键功能说明
- 坐标收集修复:将
counter声明为全局变量,解决原代码中计数失效的问题。 - 掩码生成:通过
cv2.fillPoly将4个点围成的多边形区域填充为白色,生成单通道掩码,确保只保留目标区域。 - 中心计算:
- 优先使用**图像矩(cv2.moments)**计算质心,这是基于像素分布的真实中心,适合不规则多边形区域。
- 极端场景下(掩码无面积),使用4个顶点的几何均值作为备选中心。
- 结果可视化:在新窗口中显示叠加了绿色掩码区域和红色中心标记的图像,同时在控制台输出中心坐标。
使用步骤
- 运行代码后,在图像窗口按顺时针/逆时针顺序左键点击4次,选择多边形的4个顶点。
- 点击第4个点后,自动生成掩码并弹出结果窗口。
- 按任意键关闭所有窗口。
内容的提问来源于stack exchange,提问作者TimmyFourSeven
相关产品推荐
相关产品推荐

