opencv 轮廓区域检测

直线检测

cpp 复制代码
void LineDetect(const cv::Mat &binaryImage)
{
    cv::Mat xImage,yImage,binaryImage1,binaryImage2;
    // 形态学变化,闭操作  先膨胀,再腐蚀 可以填充小洞,填充小的噪点
    cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 3)); 
    morphologyEx(binaryImage, binaryImage1, cv::MORPH_CLOSE, element);
    cv::imwrite("close1.jpg",binaryImage1);
    cv::Sobel(binaryImage1, xImage, CV_8U, 1, 0);

    element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 15)); 
    morphologyEx(binaryImage1, binaryImage2, cv::MORPH_CLOSE, element);
    cv::imwrite("close2.jpg",binaryImage2);
    cv::Sobel(binaryImage2, yImage, CV_8U, 0, 1);

    vector<cv::Vec4i> lines;
    cv::HoughLinesP(xImage,lines, 1, CV_PI / 180, 10,100,50);
    for (size_t i = 0; i < lines.size(); i++)
    {
        cv::Vec4i l = lines[i];
        line(xImage, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar(255), 3, cv::LINE_AA);
    }
    // drawLine(xImage, lines, xImage.rows, xImage.cols, cv::Scalar(255),1);

    cv::imwrite("xImage.jpg",xImage);
    cv::imwrite("yImage.jpg",yImage);
}

轮廓检测

cpp 复制代码
void ContourDetect(const cv::Mat &binaryImage,vector<vector<cv::Point>> &contours)
{
    int closeSize = 25;
    float areaRatio = 0.005;
    int imgArea = binaryImage.cols * binaryImage.rows;
    cv::Mat closeImg;
    // 形态学变化,闭操作  先膨胀,再腐蚀 可以填充小洞,填充小的噪点
    cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(closeSize, closeSize));
    morphologyEx(binaryImage, closeImg, cv::MORPH_CLOSE, element);
    cv::imwrite("closeImg.jpg",closeImg);

    cv::Mat edges_image;
    // 应用Canny边缘检测算法
    Canny(closeImg, edges_image, 100, 200);
    cv::imwrite("edges_image.jpg",edges_image);

    // 寻找轮廓
    vector<vector<cv::Point>> allContours;
    cv::findContours(edges_image, allContours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
    cout << "allContours size is: " <<allContours.size()<< endl;
    // 轮廓过滤
    for (auto contour:allContours)
    {
        cv::Rect rect = cv::boundingRect(contour);
        // cout << rect.area()  <<" "<< imgArea * areaRatio <<endl;
        if (rect.area() > imgArea * areaRatio)
        {
            contours.push_back(contour);
        }
    }

    // 绘制轮廓
    cv::Mat contourImg = cv::Mat::zeros(binaryImage.size(), binaryImage.type());
    cout << "contours size is: " <<contours.size()<< endl;
    for (int i = 0; i < contours.size(); i++)
    {
        cv::drawContours(contourImg, contours, i, cv::Scalar(255), 2);
    }
    cv::imwrite("contours.jpg", contourImg);
}

连通区域检测

cpp 复制代码
void ConnectedComponentRect(const cv::Mat &binaryImage,vector<cv::Rect> &rects)
{
    int closeSize = 25;
    float areaRatio = 0.001;
    int imgArea = binaryImage.cols * binaryImage.rows;
    cv::Mat closeImg;
    // 形态学变化,闭操作  先膨胀,再腐蚀 可以填充小洞,填充小的噪点
    cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(closeSize, closeSize));
    morphologyEx(binaryImage, closeImg, cv::MORPH_CLOSE, element);
    cv::imwrite("closeImg.jpg",closeImg);

    cv::Mat labels, stats, centroids;
    int num_objects = cv::connectedComponentsWithStats(closeImg, labels, stats, centroids);

    for (int i = 1; i < num_objects; i++) {
        // 获取连通组件的统计信息
        int* stat = stats.ptr<int>(i);
        int left = stat[cv::CC_STAT_LEFT];
        int top = stat[cv::CC_STAT_TOP];
        int width = stat[cv::CC_STAT_WIDTH];
        int height = stat[cv::CC_STAT_HEIGHT];
        int area = stat[cv::CC_STAT_AREA];
        if (area > imgArea * areaRatio)
        {
            rects.push_back(cv::Rect(left, top, width, height));
        }
    }
    cout << num_objects << " rect size is:"<< rects.size() <<endl;
}
相关推荐
阿坡RPA12 小时前
手搓MCP客户端&服务端:从零到实战极速了解MCP是什么?
人工智能·aigc
用户277844910499312 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
机器之心13 小时前
刚刚,DeepSeek公布推理时Scaling新论文,R2要来了?
人工智能
算AI15 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
凯子坚持 c15 小时前
基于飞桨框架3.0本地DeepSeek-R1蒸馏版部署实战
人工智能·paddlepaddle
你觉得20516 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
8K超高清16 小时前
中国8K摄像机:科技赋能文化传承新图景
大数据·人工智能·科技·物联网·智能硬件
hyshhhh16 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
薛定谔的猫-菜鸟程序员16 小时前
零基础玩转深度神经网络大模型:从Hello World到AI炼金术-详解版(含:Conda 全面使用指南)
人工智能·神经网络·dnn
币之互联万物17 小时前
2025 AI智能数字农业研讨会在苏州启幕,科技助农与数据兴业成焦点
人工智能·科技