2012-05-16 89 views
-1

我正在使用VC++和OpenCV應用程序,我將圖像加載到picturBox中並對它們進行一些OpenCV操作,我將加載的圖像分配到IplImage中以對其進行處理但隨後再次分配處理的圖像到圖片框,我寫這個代碼來加載從打開文件對話框選入的IplImage圖像,二值化,然後將圖像重新分配二值化圖像回圖片框 代碼:如何在pictureBox VC++中顯示二進制圖像

const char* fileName = (const char*)(void*) 
    Marshal::StringToHGlobalAnsi(openFileDialog1->FileName); 
      IplImage *img=cvLoadImage(fileName,CV_LOAD_IMAGE_COLOR); 
      int width=img->width; 
      int height=img->height; 
      IplImage *grayScaledImage=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1); 
      cvCvtColor(img,grayScaledImage,CV_RGB2GRAY); 
cvThreshold(grayScaledImage,grayScaledImage,128,256,CV_THRESH_BINARY); 
this->pictureBox1->Image=(gcnew 
System::Drawing::Bitmap(grayScaledImage->width,grayScaledImage->height,grayScaledImage->widthStep, 
System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr)grayScaledImage->imageData)); 

,但我沒有找到顯示二進制映像的格式,有關於此的任何幫助。

原始圖像: enter image description here

轉換的圖像: enter image description here

回答

1

你似乎是創建一個RGB圖像(系統::圖紙::成像:: ::的PixelFormat Format24bppRgb),但複製到它灰度,大概是System :: Drawing :: Imaging函數不會執行轉換 - 或者做得不正確。

編輯:更多解釋。
對於每個像素Y0,Y1,Y2,Y3 ...... Y639(我們使用Y代表亮度,並假設640像素寬的圖像),您的灰度圖像作爲一個字節存儲在內存中。

你已經告訴.net圖像類這是Format24bppRgb,它將被存儲爲每個像素一個紅色,一個綠色和藍色字節(3bytes = 24bpp)。因此,課堂會提取您的圖像數據,並假定Y0,Y1,Y2是第一個像素的紅色,綠色和藍色值,下一個是Y3,Y4,Y5,依此類推。
這是使用了3倍的字節作爲您的圖像,所以在行的1/3後開始閱讀下一行等 - 這給你三個重複的圖片。

ps。事實上,你已經把它變成二進制圖像只是意味着Y值是0或255 - 它不會改變數據的大小或形狀。

+0

System :: Drawing :: Imaging如何在pictureBox中進行轉換並顯示圖像? –

+1

@Eslam如果你想在.net框中使用灰度圖像,然後告訴它使用灰度像素類型而不是24bppRgb –

+0

我試圖使用Format16bppGrayScale,但它會拋出一個異常 –

相關問題