当前位置: 首页 > news >正文

黑色矩形大于6识别

/**
 * 从二值图像中识别黑色矩形并统计数量
 * @param binaryImage 输入的二值图像(黑色区域为前景,白色为背景)
 * @param minArea 最小轮廓面积阈值,用于过滤噪声
 * @param outputImage 可选输出图像,用于可视化检测结果
 * @return 当检测到的矩形数量 > 3 时返回true,否则返回false
 */
bool detectBlackRectangles(const cv::Mat& binaryImage, double minArea = 500, cv::Mat* outputImage = nullptr) {
    // 确保输入图像是二值图像
    CV_Assert(binaryImage.type() == CV_8UC1);
    
    // 复制输入图像用于处理
    cv::Mat processedImage = binaryImage.clone();
    
    // 形态学操作:开运算和闭运算,去除噪声并填充轮廓
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::morphologyEx(processedImage, processedImage, cv::MORPH_OPEN, kernel);
    cv::morphologyEx(processedImage, processedImage, cv::MORPH_CLOSE, kernel);
    
    // 查找轮廓
    std::vector<std::vector<cv::Point>> contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(processedImage, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
    
    // 过滤轮廓并统计符合条件的矩形数量
    int validContourCount = 0;
    
    // 如果需要输出图像,创建彩色副本
    cv::Mat colorOutput;
    if (outputImage != nullptr) {
        cv::cvtColor(binaryImage, colorOutput, cv::COLOR_GRAY2BGR);
    }
    
    for (size_t i = 0; i < contours.size(); i++) {
        // 计算轮廓面积,过滤小面积噪声
        double area = cv::contourArea(contours[i]);
        if (area < minArea) continue;
        
        // 近似轮廓为多边形
        std::vector<cv::Point> approx;
        cv::approxPolyDP(contours[i], approx, 0.02 * cv::arcLength(contours[i], true), true);
        
        // 检查是否为矩形(3-6个顶点,不严格要求)
        if (approx.size() >= 3 && approx.size() <= 6) {
            validContourCount++;
            
            // 如果需要,绘制轮廓和边界框
            if (outputImage != nullptr) {
                cv::drawContours(colorOutput, contours, i, cv::Scalar(0, 255, 0), 2);
                cv::Rect rect = cv::boundingRect(contours[i]);
                cv::rectangle(colorOutput, rect, cv::Scalar(0, 0, 255), 2);
            }
        }
    }
    
    // 如果需要,设置输出图像
    if (outputImage != nullptr) {
        *outputImage = colorOutput;
    }
    
    // 返回标志位:轮廓数量是否大于3
    return (validContourCount > 3);
}

http://www.xdnf.cn/news/572563.html

相关文章:

  • RTMP协议解析【二】
  • RTMP协议解析[一]
  • lcd气压表研发方案芯片——用于胎压检测
  • Ubuntu 20.04安装及配置docker
  • 进程调度算法深度剖析:FCFS、SJF、RR、优先级及多级反馈队列全解
  • 算法第25天 | 491. 非递减子序列、46. 全排列、47. 全排列 II
  • Java 实现二进制与十进制之间的互相转换
  • 校平机的原理、应用及发展趋势
  • Vue3学习(Vue3.3新特性——defineModel宏详解)
  • OpenCv高阶(十六)——Fisherface人脸识别
  • MySQL 索引的增删改查
  • Docusaurus Umami
  • 算法优选系列(9.BFS 解决拓扑排序)
  • GStreamer (四)交叉编译
  • 华为eNSP无线AC/AP组网实战
  • 基于大模型的闭合性尺桡骨干骨折全方位诊疗研究报告
  • 现代计算机图形学Games101入门笔记(二十)
  • V少JS基础班之第五弹
  • ElasticSearch导读
  • 【网络安全】日志采集、监控任务守护进程详细教程(附实战案例)
  • 打卡31天
  • Python学习Day1:安装
  • 谷歌2025年I/O开发者大会热点总结
  • shell脚本总结3
  • 【LLMs篇】12:Qwen3 技术报告翻译
  • 人工智能路径:技术演进下的职业发展导航
  • 20个关于Java编程语言的常见问题
  • 从微积分到集合论(1630-1910)(历史简介)——第2章——牛顿(Newton)和莱布尼兹(Neibniz)以及莱布尼兹传统(H.J.M.Bos)
  • 2025年人工智能新应用与新技术全景解析
  • Qt+线段拖曳示例代码