opencv 识别圆环_opencv之圆的检测识别-CSDN博客
是这位博主给我的思路,现在分享一下复刻过程
代码讲解
-
导入库
python复制代码
import cv2 # OpenCV库,用于图像处理
import numpy as np # NumPy库,用于数组和矩阵运算
-
定义函数
ython复制代码
def detect_circle_center(image_path):
这个函数接受一个参数
image_path
,它是要处理的图像的路径。 -
读取图像
python复制代码
img = cv2.imread(image_path)
if img is None:
print("Error: Unable to load image.")
return
使用
cv2.imread
从指定路径加载图像。如果图像无法加载(例如,路径不正确或文件不存在),则打印错误消息并退出函数。 -
转换为灰度图
python复制代码
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
使用
cv2.cvtColor
将彩色图像转换为灰度图。这是因为在许多图像处理任务中,灰度图比彩色图像更容易处理。 -
高斯模糊去噪
python复制代码
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
使用
cv2.GaussianBlur
对灰度图进行高斯模糊处理,以减少图像中的噪声。(5, 5)
是高斯核的大小,0
是标准差(在这个函数中,如果标准差为0,则根据核大小自动计算)。 -
图像二值化
python复制代码
_, thresh = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
使用
cv2.threshold
对模糊后的图像进行二值化处理。这里使用了cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU
作为阈值类型,其中cv2.THRESH_BINARY_INV
表示反二值化(即,将高于阈值的像素点设置为黑色,其余设置为白色),cv2.THRESH_OTSU
表示使用大津算法自动计算阈值。 -
寻找轮廓
python复制代码
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
使用
cv2.findContours
在二值化图像中寻找轮廓。cv2.RETR_EXTERNAL
表示只检索外部轮廓,cv2.CHAIN_APPROX_SIMPLE
表示压缩水平方向、垂直方向、对角方向的冗余点,只保留它们的终点。 -
遍历轮廓并拟合椭圆
python复制代码
for cnt in contours:
if len(cnt) > 5:
ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(img, ellipse, (0, 255, 0), 2)
center_x, center_y = ellipse[0][0], ellipse[0][1]
cv2.circle(img, (int(center_x), int(center_y)), 3, (0, 0, 255), -1)
print(f"Circle center: ({center_x}, {center_y})")
遍历找到的轮廓。只有当轮廓的点数大于5时,才使用
cv2.fitEllipse
拟合椭圆。然后,在原始图像上绘制椭圆和圆心。椭圆用绿色((0, 255, 0)
)绘制,线宽为2;圆心用红色((0, 0, 255)
)绘制,半径为3,填充绘制(-1
表示填充)。 -
显示结果图像
python复制代码
cv2.imshow("Detected Circle Center", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用
cv2.imshow
显示处理后的图像。cv2.waitKey(0)
表示等待用户按键(这里等待任意键),然后cv2.destroyAllWindows
关闭所有OpenCV窗口。
使用示例
在函数的最后,提供了一个使用示例,它加载名为2.jpg
的图像并调用detect_circle_center
函数进行处理。
python复制代码
image_path = "2.jpg" | |
detect_circle_center(image_path) |
确保将2.jpg
替换为您要处理的图像的实际路径。运行此代码后,您应该会看到一个包含检测到的椭圆和圆心的窗口,并且圆心坐标会被打印到控制台。