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

opencv 轮廓区域检测

直线检测

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);
}

轮廓检测

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);
}

连通区域检测

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;
}
http://www.lryc.cn/news/350352.html

相关文章:

  • 2024-5-16
  • IT行业的现状与未来:技术创新引领时代变革
  • Redis分布式锁【简单版】
  • 18.Blender 渲染工程、打光方法及HDR贴图导入
  • VBA在Excel中部首组查字法的应用
  • ASP.NET MVC 4升级迁移到ASP.NET MVC 5
  • AIGC时代已至,你准备好抓住机遇了吗?
  • 2024CCPC郑州邀请赛暨河南省赛
  • Spring 各版本发布时间与区别
  • 前端模块导入导出方式
  • docker01-简介和概述
  • java数据结构与算法(对称二叉树)
  • [原创](Modern C++)现代C++的std::function, 强大的多态函数包装器(包含std::mem_fn使用方式).
  • 解决间歇性 SSLPeerUnverifiedException 问题
  • Linux程序开发(一):Linux基础入门安装和实操手册
  • Java | Leetcode Java题解之第92题反转链表II
  • 声纹识别在无人机探测上的应用
  • 【数据结构】时间、空间复杂度实例分析
  • 2024生日快乐祝福HTML源码
  • Android系统不同版本存储权限
  • ue引擎游戏开发笔记(41)——行为树的建立(2)--丰富ai行为:巡逻后返回原处
  • Linux quotacheck命令教程:如何检查和修复文件系统的磁盘配额(附案例详解和注意事项)
  • Response对象的学习
  • QCustomplot---动态图
  • 蛋白聚乙二醇化修饰检测试剂盒
  • [Algorithm][回溯][字母大小写全排列][优美的排列][N皇后]详细讲解
  • .NET_NLog
  • Linux查看进程命令ps和top
  • 深入解析Wireshark1:从捕获到分析,一网打尽数据包之旅
  • C++语法|指向类成员(成员变量和成员方法)的指针及其相关应用场景