2012-03-17 153 views
0

我試圖設置感興趣的圖像區域並將一個圖像添加到另一個。一個圖像是一個蒙版(灰度),另一個是彩色圖像。現在,我在做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,

我已經通過代碼加強,和兩個圖像大小相同。我假設問題是一個圖像是彩色的,另一個是灰度。有沒有辦法使用不同頻道的圖像執行上述過程?

謝謝。

回答

0

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,並將結果合併回去。