由于没有人发布完整的 OpenCV 解决方案,这里有一个简单的方法:
获取二值图像。我们加载图像,转换为灰度,然后使用Otsu的阈值得到二值图像
寻找外轮廓。我们使用找到轮廓findContours
,然后使用提取边界框坐标boundingRect
找到中心坐标。由于我们有轮廓,我们可以使用矩找到中心坐标来提取轮廓的质心
这是一个边界框和中心点以绿色突出显示的示例
输入图像->
输出
Center: (100, 100)
Center: (200, 200)
Center: (300, 300)
回顾一下:
给定一个纯白色背景上的对象,有人知道 OpenCV 是否提供了从捕获的帧中轻松检测对象的功能吗?
首先获得二值图像(Canny 边缘检测、简单阈值、Otsu 阈值或自适应阈值),然后使用findContours
. 要获取边界矩形坐标,您可以使用boundingRect
which 将为您提供x,y,w,h
. 要绘制矩形,您可以使用 绘制它rectangle
。这将为您提供轮廓的 4 个角点。如果要获取中心点,请使用
moments
提取轮廓的质心
代码
import cv2
import numpy as np
# Load image, convert to grayscale, and Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Find contours and extract the bounding rectangle coordintes
# then find moments to obtain the centroid
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
# Obtain bounding box coordinates and draw rectangle
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
# Find center coordinate and draw center point
M = cv2.moments(c)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
cv2.circle(image, (cx, cy), 2, (36,255,12), -1)
print('Center: ({}, {})'.format(cx,cy))
cv2.imshow('image', image)
cv2.waitKey()