You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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个顶点的几何均值作为备选中心。
  • 结果可视化:在新窗口中显示叠加了绿色掩码区域和红色中心标记的图像,同时在控制台输出中心坐标。

使用步骤

  1. 运行代码后,在图像窗口按顺时针/逆时针顺序左键点击4次,选择多边形的4个顶点。
  2. 点击第4个点后,自动生成掩码并弹出结果窗口。
  3. 按任意键关闭所有窗口。

内容的提问来源于stack exchange,提问作者TimmyFourSeven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:40:40