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