我一直在互联网上寻找合适的填充功能(如Matlab中的功能),但是在Open ++中使用C ++进行工作。经过一番重新研究之后,我终于想出了一个解决方案:
IplImage* imfill(IplImage* src)
{
CvScalar white = CV_RGB( 255, 255, 255 );
IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;
cvFindContours(src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
cvZero( dst );
for( ; contour != 0; contour = contour->h_next )
{
cvDrawContours( dst, contour, white, white, 0, CV_FILLED);
}
IplImage* bin_imgFilled = cvCreateImage(cvGetSize(src), 8, 1);
cvInRangeS(dst, white, white, bin_imgFilled);
return bin_imgFilled;
}
为此: 原始二进制图像
结果是: 最终二进制图像
技巧是在cvDrawContours函数的参数设置中:cvDrawContours(dst,轮廓,白色,白色,0,CV_FILLED);
- dst =目标图像
- 轮廓=指向第一个轮廓的指针
- 白色=用于填充轮廓的颜色
- 0 =绘制轮廓的最大水平。如果为0,则仅绘制轮廓
- CV_FILLED =绘制轮廓的线的粗细。如果为负(例如= CV_FILLED),则绘制轮廓内部。
更多信息请参见openCV文档。
可能有一种方法可以直接将“ dst”作为二进制图像获取,但是我找不到如何将cvDrawContours函数与二进制值一起使用。
0
我有一个从OpenCV的边缘检测模块中提取的边缘贴图(Canny边缘检测)。我要做的是填补边缘贴图中的孔。
我正在使用C ++和OpenCV库。在OpenCV中,有一个cvFloodFill()函数,它将用种子填充孔(其中一个位置开始填充)。但是,我试图在不知道种子的情况下填充所有内部孔(类似于MATLAB中的imfill() )
问题1:如何查找所有种子,以便我可以应用“ cvFloodFill()”?
问题2:如何实现“ imfill()”等效项?
OpenCV中的新手,任何提示都值得赞赏。