OpenCV 如何从二值图中查找最大的色块

WilliamCode 2018-06-15 10:01:43
最近在树莓派上做一个比赛。任务是从摄像头中寻找一个红色的信标灯。
通过调节摄像头,我现在已经能够得到图像,图像中是灯的地方会非常亮,不是灯的地方会非常暗,所以可以认为得到的图像是一个二值化之后的图。
但是,除了我要寻找的红色信标灯之外,摄像头中还可能出现比较小LED灯,比如开发板上的LED灯。所以我现在需要在图像中画最少的时间,找到面积最大的红色区域。

所以简化一下,问题就是:有一个二值图像,在其中找出面积最大的值为1的块。

求教大神
...全文
1723 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
更好better 2018-07-24
  • 打赏
  • 举报
回复

vector<vector<cv::Point>> contours ;
// 查找轮廓,对应连通域
findContours(binaryImage,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);

// 寻找最大连通域
double maxArea = 0;
vector<Point> maxContour;
for(size_t i = 0; i < contours.size(); i++)
{
double area = contourArea(contours[i]);
if (area > maxArea)
{
maxArea = area;
maxContour = contours[i];
}
}

// 将轮廓转为矩形框
Rect maxRect = boundingRect(maxContour);

for (size_t i = 0; i < contours.size(); i++)
{
Rect r = boundingRect(contours[i]);
rectangle(resImg, r, Scalar(255));
}
namedWindow("all regions",0);
imshow("all regions", resImg) ;


// 显示连通域
Mat result1, result2;

resImg.copyTo(result1);
resImg.copyTo(result2);

rectangle(srcImg, maxRect, Scalar(255));
namedWindow("largest region",0);
imshow("largest region", srcImg) ;
poy49295 2018-07-19
  • 打赏
  • 举报
回复
先用findContours提取并遍历所有联通区,然后对每个联通区用contourArea计算其面积,面积最大的就是你要的结果。
沐辰北星 2018-07-11
  • 打赏
  • 举报
回复
你好,请问你得到二值化图像的思路是啥?
robertbo 2018-06-20
  • 打赏
  • 举报
回复
这个直接使用连通域判断最大的不就可以了吗

4,246

社区成员

发帖
与我相关
我的任务
社区描述
OpenCV相关技术交流专区
计算机视觉人工智能opencv 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • OpenCV
  • 幻灰龙
  • OpenCV中国团队
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

OpenCV中国团队官方博客:https://blog.csdn.net/opencvchina

试试用AI创作助手写篇文章吧