cvSetImageROI使用灰度和彩色图像

问题描述:

我试图设置感兴趣的图像区域并将一个图像添加到另一个。一个图像是一个蒙版(灰度),另一个是彩色图像。现在,我在做cvSetImageROI使用灰度和彩色图像

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 Error: Assertion failed (src1.size() == src2.size()) in binaryMaskOp,

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

谢谢。

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); 

cvMerge确实的cvSplit相反。

然后,您可以在结果分割图像上逐个调用cvAdd,并将结果合并回去。