OpenCV查找图片中的圆形

本篇博客是《OpenCV系列教程》的一部分,重点介绍了如何利用OpenCV的HoughCircles函数在图像中查找圆形。通过提供的代码示例27-FindCircles.py,可以实现对圆形的检测,展示效果显著。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《OpenCV系列教程》
项目位置:OpenCV-Sample
代码位置:27-FindCircles.py

import cv2 as cv
import numpy as np


src = cv.imread('./res/board.jpg', cv.IMREAD_COLOR)
img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
img = cv.medianBlur(img, 5)
cimg = src.copy()

circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1, 10, np.array([]), 100, 30, 1, 20)
if circles is not None:
    a, b, c = circles.shape
    print(str(circles))
    for i in range(b):
        cv.circle(cimg, (circles[0][i][0], circles[0][i][1]), circles[0][i][2], (0, 0, 255), 3, cv.LINE_AA)
        cv.circle(cimg, (circles[0][i][0], circles[0][i][1]), 2, (0, 255, 0), 3, cv.LINE_AA)  # draw center of circle

    cv.imshow("detected circles", cimg)

cv.waitKey(0)

主要就是个cv.HoughCircles函数
效果如下:
在这里插入图片描述

### 使用 C++ 和 OpenCV 检测图像中的圆形轮廓 为了实现这一目标,可以采用以下方法来处理图像并识别其中的圆形物体: #### 图像预处理 首先读取输入图片,并将其转换成灰度图以便后续操作更加高效。接着利用高斯模糊减少噪声干扰,这有助于提高边缘检测的效果。 ```cpp Mat src, gray; src = imread("path_to_image", IMREAD_COLOR); // 加载原始彩色图像 if(src.empty()){ cerr << "无法打开或找到该图像!" << endl; } cv::cvtColor(src, gray, COLOR_BGR2GRAY); GaussianBlur(gray, gray, Size(9, 9), 2, 2); ``` #### 边缘提取与形态学变换 通过Canny算子获取二值化后的边缘信息;随后可能还需要执行一些膨胀腐蚀等形态学运算以优化形状特征。 ```cpp Mat edges; Canny(gray, edges, 50, 150, 3); morphologyEx(edges, edges, MORPH_CLOSE, Mat()); ``` #### 查找轮廓及其近似多边形 基于上述得到的二值图寻找所有封闭区域即为轮廓对象,再进一步简化这些复杂曲线成为简单的几何图形表示形式——这里特别关注接近于周率π的比例关系作为判断依据之一。 ```cpp vector<vector<Point>> contours; findContours(edges.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); for(size_t i=0;i<contours.size();i++){ double area = contourArea(contours[i]); if(area < MIN_AREA) continue; vector<Point> approxCurve; arcLength(contours[i], true, perimeter); approxPolyDP(contours[i], approxCurve, 0.02*perimeter, true); Rect boundRect = boundingRect(approxCurve); Point center(boundRect.x + boundRect.width / 2, boundRect.y + boundRect.height / 2); int radius = min(boundRect.width,boundRect.height)/2; drawContours(src, contours, static_cast<int>(i), Scalar(0, 255, 0), FILLED, LINE_8, hierarchy, INT_MAX, Point()); circle(src,center,radius,Scalar(0,0,255)); } imshow("Detected Circles", src); waitKey(); destroyAllWindows(); ``` 此段代码实现了对给定路径下图像文件内可能存在圆形轮廓的有效定位标记工作[^3]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值