OpenCV找出图片中的圆并标注圆心
一、概述
案例:输入一张图片找到图片中的一个圆,并标注圆心
实现步骤:
1.输入原图
2.图像图像灰度化
3.图像二值化
4.执行形态学操作去除噪点
5.边缘检测
6.轮廓发现
7.根据面积和纵横比过滤目标轮廓
8.找出圆心并绘制圆心
9.在原图上也绘制圆心并输出
二、代码示例
//【1】载入图像 Mat src = imread(filePath); Mat src_clone = src.clone(); if(src.empty()){ qDebug()<<"图片为空"; return; } imshow("src",src); //21】转灰度图 Mat gray; cvtColor(src,gray,COLOR_BGR2GRAY); //【3】图像二值化 threshold(gray,gray,0,255,THRESH_BINARY|THRESH_OTSU); imshow("threshold",gray); //【4】执行形态学开操作去除噪点 Mat kernel = getStructuringElement(MORPH_RECT,Size(20,20),Point(-1,-1)); morphologyEx(gray,gray,MORPH_OPEN,kernel,Point(-1,-1),1); imshow("morphologyEx",gray); //【5】边缘检测 Canny(gray,gray,0,255); imshow("canny",gray); //【6】轮廓发现 vector<vector<Point>> contours; vector<Vec4i> her; findContours(gray,contours,her,RETR_TREE,CHAIN_APPROX_SIMPLE); Mat resultImage = Mat::zeros(gray.size(),CV_8UC3); RNG rng(12345); double area = 0.0; Point pRadius; for(size_t i = 0;i<contours.size();i++){ double area = contourArea(contours[i],false); //【7】根据面积及纵横比过滤轮廓 if(area>200){ Rect rect = boundingRect(contours[i]); float scale = float(rect.width)/float(rect.height); if(scale<1.1&&scale>0.9){ drawContours(resultImage,contours,i,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),-1); int x = rect.width/2; int y = rect.height/2; //【8】找出圆心并绘制 pRadius=Point(rect.x+x,rect.y+y); circle(resultImage,pRadius,2,Scalar(0,0,255),2); } } } imshow("resultImage",resultImage); //【9】在原图上绘制圆心,这一步要不要都行,因为坐标都找出来了,可以随便标注 circle(src_clone,pRadius,2,Scalar(0,0,255),2); imshow("src_clone",src_clone);
三、图片示例
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!