千家信息网

C++ OpenCV标记点检测怎么实现

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍"C++ OpenCV标记点检测怎么实现"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"C++ OpenCV标记点检测怎么实现"文章能帮助大家解
千家信息网最后更新 2025年01月16日C++ OpenCV标记点检测怎么实现

这篇文章主要介绍"C++ OpenCV标记点检测怎么实现"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"C++ OpenCV标记点检测怎么实现"文章能帮助大家解决问题。

效果如下:

1.导入原图:

2.截取ROI

3.进行自适应阈值化与Canny边缘提取

4.进行闭运算,然后轮廓检测,然后计算点集面积,通过面积阈值去除杂点

5.再次进行轮廓检测,拟合椭圆

代码如下:

#include #include #include #include #define scale 2//图像缩放因子#define cannythreshold 80typedef struct _ROIStruct{        cv::Point2d ROIPoint;        cv::Mat ROIImage;}ROIStruct;ROIStruct getROI(cv::Mat src,bool flag = false){        ROIStruct ROI_Struct;        cv::Rect2d ROIrect = selectROI(src);        ROI_Struct.ROIPoint = ROIrect.tl();//获取ROI区域左上角的点        ROI_Struct.ROIImage = src(ROIrect);        if (flag == true)        {                cv::imshow("ROI", ROI_Struct.ROIImage);        }        return ROI_Struct;}int main(){        cv::Mat srcImage = cv::imread("7.jpg");//读取待处理的图片        cv::resize(srcImage, srcImage, cv::Size(srcImage.cols / scale, srcImage.rows / scale));//图像缩放,否则原来图像会在ROI时显示不下                ROIStruct ROI = getROI(srcImage);//选择ROI区域                cv::Mat DetectImage, thresholdImage;        ROI.ROIImage.copyTo(DetectImage);        cv::imshow("ROI", DetectImage);        cv::cvtColor(DetectImage, thresholdImage, CV_RGB2GRAY);        cv::adaptiveThreshold(thresholdImage, thresholdImage, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY,11,35);//自适应阈值        cv::Canny(thresholdImage, thresholdImage, cannythreshold, cannythreshold * 3, 3);                cv::imshow("thresholdImage", thresholdImage);                std::vector> contours1;        std::vector hierarchy1;        cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3));        cv::morphologyEx(thresholdImage, thresholdImage, cv::MORPH_CLOSE, element,cv::Point(-1,-1),2);        cv::Mat findImage = cv::Mat::zeros(thresholdImage.size(), CV_8UC3);        cv::findContours(thresholdImage, contours1, hierarchy1,CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);        for (int i = 0; i > contours2;        std::vector hierarchy2;        cv::Mat resultImage(CircleImage.size(), CV_8UC3);        cv::findContours(CircleImage, contours2, hierarchy2, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);        std::vector points1, points2;                cv::Mat compareImage;        DetectImage.copyTo(compareImage);        for (int j = 0; j 

关于"C++ OpenCV标记点检测怎么实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0