2012-03-17 2 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 на результирующие сплит-изображения по одному и объединить результат в конце.