2013-12-10 2 views
0

У меня была странная проблема с использованием OpenCV. Предположим, у меня есть блок памяти типа CHAR, который является буфером для 8-битного изображения глубины с размером X * sizeY. Указатель на изображение называется pcMask, поэтому я сохранить буфер в файл с именем mask.dat, используя следующий код:OpenCV 1.1, IplImage не может правильно отображать изображение

char fpath[256] = ".\mask.dat"; 
FILE *pFile = 0; 
pFile = fopen(fpath,"wb"); 
if (pFile) { 
    fwrite(pcMask, sizeof(char), sizeX * sizeY, pFile); 
    fclose(pFile); 
    pFile = 0; 
} 

сразу после сохранения mask.dat, я назвал OpenCV API, чтобы отобразить изображение в виде следующие:

IplImage *mask = cvCreateImageHeader(cvSize(sizeY,sizeX), IPL_DEPTH_8U, 1); 
mask->imageData = pcMask; 
// display image 
cvNamedWindow("test", CV_WINDOW_AUTOSIZE); 
cvShowImage("test", mask); 
cvWaitKey(0); 
cvDestroyWindow("test"); 
cvReleaseImageHeader(&mask); 

Я действительно знаю, как должно выглядеть изображение. чтобы проверить, что я написал скрипт python для загрузки файла «mask.dat» и нарисовал его с помощью matplotlib, и он выглядит отлично, как this, однако изображение, отображаемое с использованием OpenCV, отличается от this (а не цветовой картой). Как вы можете видеть, эллипсы на двух фигурах совершенно разные. Как они используют данные из того же блока памяти, должны ли они быть одинаковыми?

спасибо большое!

ОБНОВЛЕНИЕ: я теперь думаю, что есть ошибка в OpenCV1.1, «Кас я изменил IplImage к CvMat, и теперь все нормально

CvMat *mask = cvCreateMatHeader(sizeY,sizeX, CV_8UC1); 
mask->data.ptr = pcMask; 
// display image 
cvNamedWindow("test", CV_WINDOW_AUTOSIZE); 
cvShowImage("test", mask); 
cvWaitKey(0); 
cvDestroyWindow("test"); 
cvReleaseImageHeader(&mask); 

OpenCV2.X может не иметь такой вопрос, но я могу использовать только 1.1, чтобы сохранить совместимость со всей программой. Во всяком случае, теперь я использую CvMat в качестве своего решения.

+0

Если вы перейдете на OpenCV 2 API, вы сэкономите годы своей жизни. Я бы подумал, что использование CvMat приведет к большей несогласованности, чем привязка к менее ошибочной версии библиотеки. Но пропустите CvMat и используйте cv :: Mat. – Bull

ответ

1

Угловая растяжка заставляет меня думать, что это формат изображения/шаг. В зависимости от ситуации объем памяти, занимаемой изображением, может быть не равным sizeX * sizeY. Убедитесь, что вы не испортили сохранение изображения (почему бы не использовать операции сохранения изображений OpenCV?) И убедитесь, что данные, которые вы обрабатываете как отображаемое изображение, находятся в правильном формате.

3

От documentation:

CvSize cvSize (ширина INT, INT высота)

Поэтому

IplImage *mask = cvCreateImageHeader(cvSize(sizeY, sizeX), IPL_DEPTH_8U, 1); 

должно быть

IplImage *mask = cvCreateImageHeader(cvSize(sizeX, sizeY), IPL_DEPTH_8U, 1); 

EDIT

Вы не должны устанавливать mask->imageData непосредственно, но использовать cvSetData():

cvSetData(mask, pcMask, sizeY); 
+0

Я тестировал, переключая sizeX и sizeY, что испортило все изображение, и эллипс полностью исчез, поэтому я уверен, что cvSize (sizeY, sizeX) верен. – shelper

+0

@shelper, если вы следовали нормальным конвекциям для X и Y, ширина находится в направлении X, а Y находится в направлении высоты, 'cvSize (sizeY, sizeX)' inxorrect - прочитайте документацию. В вашем коде должна быть другая проблема. – Bull

0

спасибо всем за помощь, но теперь я считаю, что это ошибка из OpenCV1.1, пожалуйста, см мой новый редактирует в сообщении, где я использовал CvMat, и все в порядке

Смежные вопросы