cvSetImageROI使用灰度和彩色图像

时间:2012-03-17 21:05:52

标签: c++ c opencv roi

我正在尝试设置感兴趣的图像区域并将一个图像添加到另一个图像中。一个图像是掩模(灰度),另一个是彩色图像。现在,我正在做

IplImage * _newImg = newImage.getCvImage();
IplImage * _oldBG  = tempBG.getCvImage();

CvRect rect = cvRect(100, 100, _newImg->width, _newImg->height);

cvSetImageROI(_oldBG, rect);
cvAdd(_newImg, _oldBG, _newImg, NULL);

cvResetImageROI(_oldBG);

这会导致以下错误:

  

OpenCV错误:断言失败(src1.size()== src2.size())in   binaryMaskOp,

我已经完成了代码,两个图像的大小相同。我假设问题是一个图像是彩色而另一个是灰度。有没有办法使用不同通道的图像执行上述过程?

感谢。

1 个答案:

答案 0 :(得分:1)

OpenCV主干中的断言为CV_Assert( src1.size == dst.size && src1.channels() == dst.channels() );,位于here

您最好验证图片大小和渠道数量是否相同,如果是cvAdd则应该能够正常添加它们。我建议将结果参数的单独结果IplImage设置为cvAdd

使用cvSplit将图像拆分为单独的通道。

对于RGB

// Allocate image planes
IplImage* r = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );
IplImage* g = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 ); 
IplImage* b = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );

// Split image onto the color planes
cvSplit( src, r, g, b, NULL );

对于RGBA

// Allocate image planes
IplImage* r = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );
IplImage* g = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );
IplImage* b = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );
IplImage* a = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );

// Split image onto the color planes
cvSplit( src, r, g, b,a NULL );

cvMergecvSplit相反。

然后,您可以逐个调用生成的分割图像上的cvAdd,并将结果合并到最后。