C++如何用OpenCV中实现图像的边缘检测和轮廓提取?

这篇具有很好参考价值的文章主要介绍了C++如何用OpenCV中实现图像的边缘检测和轮廓提取?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近有个项目需要做细孔定位和孔距测量,需要做边缘检测和轮廓提取,先看初步效果图:

opencv图像轮廓提取,Opencv,opencv,人工智能,计算机视觉,c++

主要实现代码:文章来源地址https://www.toymoban.com/news/detail-728184.html


int MainWindow::Test()
{
    // 2.9 单个像素长度um  5倍
    double dbUnit = 2.9/(1000*5);

    // 定义显示窗口
    namedWindow("src", WINDOW_NORMAL|WINDOW_KEEPRATIO);
    namedWindow("threshold", WINDOW_NORMAL|WINDOW_KEEPRATIO);
    namedWindow("morphologyEx x1", WINDOW_NORMAL|WINDOW_KEEPRATIO);
    namedWindow("morphologyEx x2", WINDOW_NORMAL|WINDOW_KEEPRATIO);
    namedWindow("canny", WINDOW_NORMAL|WINDOW_KEEPRATIO);
    namedWindow("dst", WINDOW_NORMAL|WINDOW_KEEPRATIO);
    resizeWindow("src", 1080,720);
    resizeWindow("threshold", 1080,720);
    resizeWindow("morphologyEx x1", 1080,720);
    resizeWindow("morphologyEx x2", 1080,720);
    resizeWindow("canny", 1080,720);
    resizeWindow("dst", 1080,720);

    //【1】载入图像
    Mat src = imread("0.28um+5x.jpg");  
    Mat src_clone = src.clone();
    if(src.empty()){
        qDebug()<<"图片为空";
        return 1;
    }
    imshow("src",src);
    //【2】转灰度图
    Mat gray;
    cvtColor(src,gray,COLOR_BGR2GRAY);

    //imshow("gray",gray);

    //【3】图像二值化
    threshold(gray,gray,130,190,THRESH_BINARY);
    imshow("threshold",gray);

    //【4】执行形态学开操作去除噪点
    Mat kernel = getStructuringElement(MORPH_RECT,Size(15,15),Point(-1,-1));
    morphologyEx(gray,gray,MORPH_CLOSE,kernel,Point(-1,-1),1);
    imshow("morphologyEx x1",gray);

    //【4】执行形态学开操作去除噪点
    Mat kernel1 = getStructuringElement(MORPH_RECT,Size(10,10),Point(-1,-1));
    morphologyEx(gray,gray,MORPH_CLOSE,kernel1,Point(-1,-1),1);
    imshow("morphologyEx x2",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 srcImg = src;
    //拟合椭圆:fitEllipse()
    vector<RotatedRect> box(contours.size());
    Point2f rect[4];
    for (int i = 0; i<contours.size(); i++)
    {
        Rect rect = boundingRect(contours[i]);

        Point2f pRadius;
        if(contours[i].size()>105){
            box[i] = fitEllipse(Mat(contours[i]));

            //条件过滤
            if( box[i].size.aspectRatio()<0.8||box[i].size.area()>10000000||rect.width<300 )
                continue;

            float majorAxis = std::max(box[i].size.width, box[i].size.height);

            rectangle(srcImg,rect,Scalar(0, 0, 255));

            ellipse(srcImg, box[i], Scalar(255, 0, 0), 1, 8);

            float x = rect.width/2.0;
            float y = rect.height/2.0;
            //【8】找出圆心并绘制
            pRadius=Point2f(rect.x+x,rect.y+y);
           
            cv::String det_info = cv::format("[%d] %.1f,%.1f(%dx%d),%.5f mm, %.5f mm",i,
            pRadius.x, pRadius.y, rect.width, rect.height,dbUnit*rect.width, dbUnit*majorAxis);


            cv::Point bbox_points;
            bbox_points = cv::Point(rect.x, rect.y);
            bbox_points = cv::Point(rect.x + det_info.size() * 11, rect.y);
            bbox_points = cv::Point(rect.x + det_info.size() * 11, rect.y - 15);
            bbox_points = cv::Point(rect.x, rect.y - 15);

            cv::putText(srcImg, det_info, bbox_points, cv::FONT_HERSHEY_DUPLEX, 0.4, cv::Scalar(255, 255, 255), 1, cv::LINE_AA);

            circle(srcImg,pRadius,1,Scalar(0,0,255),1);

            pRadius=box[i].center;
            circle(srcImg,pRadius,1,Scalar(255,0,0),1);

        }
    }
    // 绘制结果
    imshow("dst", srcImg);
    // 保存结果
    imwrite("dst.png", srcImg);
}

到了这里,关于C++如何用OpenCV中实现图像的边缘检测和轮廓提取?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(45)
  • 【OpenCv • c++】图像识别边缘检测 图像差分运算

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪 边缘检测是图像处理与计算机视觉中最重要的技术之一,其目的是检

    2024年02月03日
    浏览(26)
  • OpenCV数字图像处理基于C++:边缘检测

    边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许多

    2024年02月05日
    浏览(39)
  • OpenCV基础之边缘检测与轮廓描绘

    边缘检测:主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向于图像中像素点的变化。 轮廓检测:指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程。主

    2024年02月06日
    浏览(25)
  • 【OpenCV-Python】——边缘和轮廓&Laplacian/Sobel/Canny边缘检测&查找/绘制轮廓及轮廓特征&霍夫直线/圆变换

    目录 前言: 1、边缘检测 1.1 Laplacian边缘检测  1.2 Sobel边缘检测  1.3 Canny边缘检测 2、图像轮廓 2.1 查找轮廓  2.2 绘制轮廓 2.3 轮廓特征 3、霍夫变换 3.1 霍夫直线变换  3.2 霍夫圆变换 总结: 图像的边缘是指图像中灰度值急剧变化的位置,边缘检测的目的是为了绘制边缘线条。

    2024年01月23日
    浏览(39)
  • 如何在OpenCV中实现图像边缘保持和去除?

    图像边缘保持和去除是图像处理中的常见任务,用于增强图像的边缘特征或去除图像中的噪声和不必要的边缘信息。在OpenCV中,可以使用各种滤波器和技术来实现图像边缘保持和去除。本文将介绍在OpenCV中实现图像边缘保持和去除的方法,并提供相应的代码示例。 图像边缘保

    2024年02月03日
    浏览(31)
  • C++opencv找圆心?看着一篇,一定有你要(边缘轮廓检测,拟合,凸包)找出相应的轮廓或者全部轮廓画外界圆轮廓并且标出轮廓中心

    注意这种面积筛选有一个弊端就是比如有两个轮廓, A轮廓为500 B轮廓为300 当面积设置为 area400时就可以筛选出面积小于300的所有轮廓 反之大于300的轮廓 如果有两个圆轮廓一大一小,可能就只能保留一个了 如果知道这两个形状的轮廓面积,或许可以利用 逻辑与  进行筛选。

    2024年02月11日
    浏览(30)
  • OpenCV 图像轮廓检测

            本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式、轮廓逼近算子等操作。         图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检测和识别中很有用。图像轮廓的作用

    2024年01月25日
    浏览(39)
  • opencv图像轮廓检测

    效果展示: 代码部分:

    2024年02月12日
    浏览(38)
  • OpenCV图像处理——轮廓检测

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包