核心内容摘要
极乐净土或修罗场?一场“剧烈”扑克局的生死对决
在轮廓分析中获取轮廓的中心点质心是目标定位、尺寸测量的核心步骤。
本文通过 OpenCV 的图像矩cv.moments()实现轮廓中心点的精准计算与可视化新手可直接复用完整流程。
核心代码实现import cv2 as cv import numpy as np #
读取图像并校验 src cv.imread(./image/
bmp) if src is None: print(图像读取失败请检查路径) exit() #
预处理高斯滤波去噪 二值化 dst cv.GaussianBlur(src, (3,
,
# 高斯滤波去除噪点避免伪轮廓干扰 grays cv.cvtColor(dst, cv.COLOR_BGR2GRAY) # 转灰度图 # 二值化分离前景轮廓与背景阈值200可根据图像调整 ret, binary cv.threshold(grays, 200, 255, cv.THRESH_BINARY) #
查找轮廓CCOMP模式检索内外层轮廓适配有孔洞的目标 contours, hierarchy cv.findContours(binary, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE) #
遍历轮廓计算并绘制每个轮廓的中心点 for i, contour in enumerate(contours): # 绘制轮廓蓝色线宽5便于直观查看轮廓范围 cv.drawContours(src, contours, i, (255, 0,
,
# 计算轮廓的图像矩核心通过矩获取中心点 M cv.moments(contour) # 修正原代码使用当前轮廓contour而非固定contours[1] # 避免除零错误过滤无效小轮廓m00为零表示轮廓无有效像素 if M[m00] ! 0: # 计算中心点坐标x m10/m00y m01/m00 center_x int(M[m10] / M[m00]) center_y int(M[m01] / M[m00]) # 绘制中心点绿色圆形半径10线宽2醒目易见 cv.circle(src, (center_x, center_y), 10, (0, 255,
,
# 打印中心点坐标便于数据分析 print(f轮廓{i} 中心点坐标x{center_x}, y{center_y}) else: print(f轮廓{i} 为无效轮廓跳过中心点计算) #
显示结果图像 cv.namedWindow(src, cv.WINDOW_NORMAL) cv.resizeWindow(src, 600,
cv.imshow(src, src) cv.waitKeyEx(
cv.destroyAllWindows()关键知识点解析
核心流程拆解步骤核心 API作用说明图像矩计算cv.moments(contour)计算轮廓的几何矩包含轮廓的位置、面积等信息中心点求解center_x m10/m
center_y m01/m00m00是轮廓面积矩m10/m01是一阶矩通过比值求解中心点中心点可视化cv.circle()用圆形标注中心点直观验证计算结果无效轮廓过滤M[m00] ! 0避免小噪点轮廓导致的除零报错提升代码健壮性
核心概念说明图像矩Moments描述图像轮廓几何特征的数值集合OpenCV 中cv.moments()返回的矩包含多个关键字段核心用于中心点计算的仅有 3 个M[m00]零阶矩对应轮廓的面积非零表示轮廓有效M[m10]一阶矩用于计算中心点 x 坐标M[m01]一阶矩用于计算中心点 y 坐标。
轮廓索引原代码固定使用contours[1]仅能计算第 2 个轮廓的中心点改为contour遍历每个轮廓适配多轮廓场景。