这是来自OPenCV问答社区的一个问题——“answerOpenCV”,编译如下:
标题:OpenCV / C++ -填充孔
内容:
你好,
对于个人项目,我试图检测物体和阴影。这些是我现在的结果:原文:
对象:
阴影:
物体的外部轮廓挺好的,但是你也看到了,我的物体并不饱满。影子也一样。我想得到物体及其阴影的完整轮廓,填充,我不知道如何得到比这更好的(我只是暂时使用“扩张”)。请问有人知道一个获得更好结果的方法吗?问候。
二、问题分析
从原图来看,此图背景复杂,光照中有偏振。虽然提问者提出了“合并缝隙”的要求,但其实他还是想得到目标对象的准确轮廓。
第三,解决问题
基于现有的经验和工具如OpenCV和GOCVhelper,可以快速获得以下结果
h通道:
除光差异:
阈值:
注释:
第四,算法的关键
这个算法先解决了这个问题,我觉得也很稳健。除了经典的hsv分解->: Ostu阈值->:最大轮廓标记外,最关键的算法是去除光差的礼帽。该算法来源于Gonzalez的《数字图像处理教程》的形态学章节,完全按照书上的推荐来实现,表现出了很好的效果。
//answerOpenCV OpenCV/c++——填洞
#包含“stdafx.h”
#include<。iostream>。
#include<。vector>。
使用usingnamespacecv
使用命名空间TD;
//找到最大的轮廓
vector<。点>FindBigestContour(Mat src){
内膜= 0;
内膜xcontour =-1;
STD::vector & lt;STD::vector & lt;点>>。轮廓;
查找轮廓(src,轮廓,CV _ RETR _列表,CV _链_近似_简单);
for(inti = 0;i<。contours . size();i++){
intitmp = contourArea(等高线[I]);
if(imaxcontour <。itmp ){
IMAX = I;
imaxcontour = itmp
}
}
return contours[IMAX];
}
//用高顶帽去除光差
Mat moveLightDiff(Mat src,in dius){
Mat dst
mat srcclone = src . clone();
Mat mask = Mat::zeros(半径* 2,半径* 2,CV _ 8U);
圆(遮罩,点(半径,半径),半径,标量(255),-1);
//大礼帽
侵蚀(srcclone,srcclone,mask);
扩张(srcclone,srcclone,mask);
dst = src-srcclone;
returndst
}
intmain( void)
{
mat src = im read(" e:/sandbox/question . png ");
Mat src _ hsv
垫仓;
mat src _ h;
cvtColor(src,src_hsv,COLOR _ BGR 2 HSV);
vector<。Mat>。rgb _ planes
分割(src_hsv,RGB _ planes);
src _ h = RGB _ planes[0];// h通道有用
src_h = moveLightDiff(src_h,40);
阈值(src_h,bin,100,255,THRESH _ OTSU);
//找到并画出最大的轮廓
vector<。点>bigestcontrolr = FindBigestContour(bin);
vector<。vector<。点>>。懊悔的;
contour . push _ back(bigetcontour);
cv::draw等高线(src,controus,0,Scale(0,0,255),3);
WaitKey();
返回0;
}
五.经验总结
我只用了10分钟就解决了这个问题,花了10分钟写了一篇博客。快速解决问题并写出来的关键是:
1.积累和维护的代码库:
GOCVHelper(https://github . com/jsxyhelu/GOCVHelper)
2.不断阅读思维和实践的习惯;
何路
知识星球嘉宾
目前方向:图像拼接与融合,图像识别联系:jsxyhelu@foxmail.com
1.《dilate OpenCV寻找复杂背景下物体的轮廓》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《dilate OpenCV寻找复杂背景下物体的轮廓》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/989565.html