首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有什么版本的CvBlobs库可以和cv::Mat一起使用?

有没有什么版本的CvBlobs库可以和cv::Mat一起使用?
EN

Stack Overflow用户
提问于 2012-11-23 11:41:30
回答 2查看 2.8K关注 0票数 4

我刚刚发现CvBlobsLib是件好事,但遗憾的是它使用了IplImage。

有没有可能有一个新的cv::Mat风格的版本,我只是碰巧没有找到它?

编辑:

结果我碰巧发现了两个截然不同的库,CvBlobsLib和CvBlobs,是的。:)

我看到CvBlobsLib比cvBlobs使用得更少,这不是在opencv willowgarage上,而是在谷歌代码上。不过,我欢迎这两个库的答案,因为它们都可以与IplImage一起工作。:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-23 18:27:34

EDIT:我在这个答案中说的是 ,很抱歉我把它和 搞乱了...

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

但实际上你总是可以这样做的:IplImage iplImg = mat;,只要你需要一个IplImage*就使用&iplimg

我以这种方式使用了 ,在一些项目中取得了成功:

代码语言:javascript
复制
#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 );
票数 5
EN

Stack Overflow用户

发布于 2012-11-23 21:07:06

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

代码语言:javascript
复制
#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;

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13522797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档