4

我刚刚发现CvBlobsLib可以成为一种祝福,但遗憾的是它使用了 IplImage。
有没有可能有一个新的 cv::Mat 风格的版本,我只是碰巧没有找到它?

编辑:

结果我碰巧发现了 2 个不同的库,CvBlobsLib 和 CvBlobs,yeehaa。:)
我看到 CvBlobsLib 比 cvBlobs 使用得少,那不是在 opencv willowgarage 上,而是在 google 代码上。不过,我欢迎这两个库的答案,因为它们都与 IplImage 一起使用。:)

4

2 回答 2

5

编辑:我在这个答案中谈论cvBlobs,很抱歉我把它搞砸了cvBlobsLib ...

我也一直在寻找这个,但没有想出任何使用新图像结构的库。

但实际上你总是可以这样做:IplImage iplImg = mat;只要&iplimg在你需要的地方使用IplImage*.

我在几个项目中以这种方式成功地使用了cvBlobs :

#include <cvblob.h>
using namespace cvb;

// load image
cv::Mat mat = cv::imread("image.jpg");

// convert cv::Mat to IplImage
IplImage img = mat;

// convert to grayscale
IplImage *gray = cvCreateImage( cvGetSize(&img), IPL_DEPTH_8U, 1 );
cvCvtColor( &img, gray, CV_BGR2GRAY );

// get binary image
cvThreshold( gray, gray, 150, 255, CV_THRESH_BINARY );

// get blobs
IplImage *labelImg = cvCreateImage( cvGetSize(gray), IPL_DEPTH_LABEL, 1 );
CvBlobs blobs;
unsigned int result = cvLabel( gray, labelImg, blobs );

// render blobs in original image
cvRenderBlobs( labelImg, blobs, &img, &img );

// *always* remember freeing unused IplImages
cvReleaseImage( labelImg );
cvReleaseImage( gray ); 

// convert back to cv::Mat
cv::Mat output( &img );
于 2012-11-23T10:27:34.200 回答
3

实际上,@moosgummi 答案的真正 C++ 版本看起来像这样:

#include <cvblobs.h>
using namespace cvb;
using namespace cv;
// load image
Mat mat = imread("image.jpg");

// convert to grayscale
Mat gray; cvtColor(mat, gray, CV_BGR2GRAY);

// get binary image
threshold( gray, gray, 150, 255, CV_THRESH_BINARY );

// get blobs
Mat labelImg; labelImg.create( gray.size(), IPL_DEPTH_LABEL ); // need to check if IPL_DEPTH_LABEL is the right type...not sure
CvBlobs blobs; 
IplImage iplLabelImg = labelImg; // do not release this!
unsigned int result = cvLabel( gray, &iplLabelImg, blobs );

// render blobs in original image
IplImage iplMat = mat; // do not release this!
cvRenderBlobs( &iplLabelImg, blobs, &iplMat, &iplMat);

// for sake of compatibility with moosgummi:
cv::Mat output = mat;

并且您需要一个包装类,用于带有lazy_copy_refcounted 私有CvBlobs 数据的类以及一些到const CvBlobs 和CvBlobs 的转换运算符CvBlobscvb::Blobs还需要一个用于 cvLabel 的包装函数cvb::label(),它为我们 C++ 程序员进行强制转换。

于 2012-11-23T13:07:06.053 回答