2013-12-10 46 views
0

我有一個奇怪的問題使用OpenCV。假設我有一個CHAR類型的內存塊,它是一個sizeX * sizeY的8位深度圖像的緩衝區。的指針圖像稱爲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進行imshowed,並且它看起來很像this,但是,使用OpenCV顯示的圖像與this(不是顏色映射圖)很不相同。正如你所看到的,這兩個數字中的橢圓是完全不同的。當他們使用來自同一個內存塊的數據時,它們應該是相同的嗎?

非常感謝!

更新: 我覺得現在有一個bug在OpenCV1.1,「CUS我改變的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); 

編輯

你不應該設置mask->imageData直接,但使用cvSetData()

cvSetData(mask, pcMask, sizeY); 
+0

我通過切換sizeX和sizeY進行了測試,將整個圖像搞亂了,並且橢圓完全沒了,所以我確定cvSize(sizeY,sizeX)是正確的。 – shelper

+0

@shelper如果你遵循X和Y的正常對比,寬度在X方向,Y在高度方向,'cvSize(sizeY,sizeX)'是不正確的 - 請閱讀文檔。你的代碼中一定存在另一個問題。 – Bull

0

謝謝大家的幫助,但現在我相信這是OpenCV1.1的一個bug,請看看我的新在帖子中進行編輯,我使用CvMat,並且一切正常