Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cvSetImageROI使用灰度和彩色图像_C++_C_Opencv_Roi - Fatal编程技术网

C++ cvSetImageROI使用灰度和彩色图像

C++ cvSetImageROI使用灰度和彩色图像,c++,c,opencv,roi,C++,C,Opencv,Roi,我试图设置一个感兴趣的图像区域,并将一个图像添加到另一个图像中。一个图像是遮罩(灰度),另一个是彩色图像。现在,我正在做 IplImage * _newImg = newImage.getCvImage(); IplImage * _oldBG = tempBG.getCvImage(); CvRect rect = cvRect(100, 100, _newImg->width, _newImg->height); cvSetImageROI(_oldBG, rect); c

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

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() binaryMaskOp

我已经完成了代码,两张图片大小相同。我假设问题是一个图像是彩色的,另一个是灰度的。是否有方法使用不同通道的图像执行上述步骤


谢谢。

OpenCV主干中的断言是
CV_断言(src1.size==dst.size&&src1.channels()==dst.channels()),位于

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

使用
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
,并在最后将结果合并回来