2012-05-16 5 views
-1

VC++ 및 OpenCV 응용 프로그램에서 작업하고 있습니다. picturBox에 이미지를로드하고 거기에서 OpenCV 작업을 수행하고 있습니다.로드 된 이미지를 IplImage에 할당하여 처리합니다 그런데 픽처 박스로 다시 가공 화상을 할당 난 IplImage로 OpenFileDialog를으로부터 선택된 이미지를로드하는 코드를 작성하는 화상 다음의 PictureBox 코드 다시 치화 화상을 재 이진화 :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에 대해 1 바이트로 메모리에 저장됩니다 (밝기를 Y로 사용하고 640 픽셀의 이미지로 가정).

.net 이미지 클래스에 픽셀 당 하나의 빨강, 녹색 및 파랑 바이트 (3 바이트 = 24bpp)로 저장 될 Format24bppRgb라고 알립니다. 따라서 클래스는 이미지 데이터를 가져 와서 Y0, Y1, Y2가 첫 번째 픽셀의 빨강, 초록, 파랑 ​​값이고 Y3, Y4, Y5는 다음 픽셀에 대한 것으로 가정합니다.
이미지의 3 배를 사용하므로 3 분의 1이 지나면 다음 행을 읽는 등 - 3 개의 반복 된 사진이 제공됩니다.

ps. 당신이 이진 이미지로 변환했다는 사실은 Y 값이 0 또는 255라는 것을 의미합니다 - 데이터 크기 나 모양을 변경하지 않습니다.

+0

System :: Drawing :: Imaging이 pictureBox에 변환 및 이미지를 표시하지 않는 이유는 무엇입니까? –

+1

@Eslam .net 상자에 그레이 스케일 이미지가 필요하면 24bppRgb가 아닌 그레이 스케일 픽셀 유형을 사용하도록 지정합니다. –

+0

Format16bppGrayScale을 사용하려고했지만 예외가 throw됩니다. –

관련 문제