cvSetImageROI с использованием оттенков серого и цветных изображений - PullRequest
0 голосов
/ 18 марта 2012

Я пытаюсь установить интересующую область изображения и добавить одно изображение в другое.Одно изображение представляет собой маску (оттенки серого), а другое - цветное изображение.Сейчас я делаю

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,

Я прошел через код, и оба изображения имеют одинаковый размер.Я предполагаю, что проблема в том, что одно изображение - цветное, а другое - в оттенках серого.Есть ли способ выполнить описанную выше процедуру с использованием изображений с разными каналами?

Спасибо.

1 Ответ

1 голос
/ 18 марта 2012

Это утверждение в соединительной линии OpenCV CV_Assert( src1.size == dst.size && src1.channels() == dst.channels() );, расположенное здесь .

Лучше убедиться, что размеры изображения и количество каналов совпадают, если они тогда 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 для полученных разделенных изображений одно за другим и объединить результатобратно в конец.

...