美文网首页
C++ opencv-3.4.1 提取不规则物体的轮廓

C++ opencv-3.4.1 提取不规则物体的轮廓

作者: yanghedada | 来源:发表于2019-06-20 10:38 被阅读0次

    在学习opencv的时候,对一张照片,需要标注照片上物体的不规则轮廓。

    如图:


    使用opencv进行物体的轮廓处理,关键在于对照片的理解,前期的照片处理的越好最后调用api出来的结果就越接近理想值。

    提取照片中物体分如下三步:

    1. 图像去噪,高斯模糊
    2. 二值化
    3. 去除噪点,形态学操作,去除较小的噪点
    4. 进行轮廓查找
    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <math.h>
    
    using namespace cv;
    using namespace std;
    Mat src, dst, gray_src;
    char input_image[] = "input image";
    char output_image[] = "output image";
    
    int main(int argc, char ** argv){
    
        src = imread("case6.jpg");
        if (src.empty()){
            printf("colud not load image ..\n");
            return -1;
        }
    
        namedWindow(input_image, CV_WINDOW_AUTOSIZE);
        namedWindow(output_image, CV_WINDOW_AUTOSIZE);
        imshow(input_image, src);
    
        // 均值降噪
        Mat blurImg;
        GaussianBlur(src, blurImg, Size(15, 15), 0, 0);
        imshow("input image", src);
    
        // 二值化
        Mat binary;
        cvtColor(blurImg, gray_src, COLOR_BGR2GRAY);
        threshold(gray_src, binary, 0, 255, THRESH_BINARY | THRESH_TRIANGLE);
        imshow("binary", binary);
    
        // 闭操作进行联通物体内部
        Mat morphImage;
        Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
        morphologyEx(binary, morphImage, MORPH_CLOSE, kernel, Point(-1, -1), 2);
        imshow("morphology", morphImage);
    
        // 获取最大轮廓
        vector<vector<Point>> contours;
        vector<Vec4i> hireachy;
        findContours(morphImage, contours, hireachy, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
        Mat connImage = Mat::zeros(src.size(), CV_8UC3);
        for (size_t t = 0; t < contours.size(); t++){
            Rect rect = boundingRect(contours[t]);
            if (rect.width < src.cols / 2) continue;
            if (rect.width > src.cols - 20) continue;
    
            double area = contourArea(contours[t]);
            double len = arcLength(contours[t], true);
    
    
            drawContours(connImage, contours, t, Scalar(0, 0, 255), 1, 8, hireachy);
            printf("area of star could : %f \n", area);
            printf("lenght of star could : %f \n", len);
        }
        imshow(output_image, connImage);
    
    
    
        waitKey(0);
        return 0;
    }
    

    二值化

    形态学操作

    最终的轮廓

    参考:

    gloomyfish1998

    相关文章

      网友评论

          本文标题:C++ opencv-3.4.1 提取不规则物体的轮廓

          本文链接:https://www.haomeiwen.com/subject/ezfdqctx.html