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
,并将结果合并回去。