我正在研究VC ++和OpenCV应用程序,我正在将图像加载到picturBox中并对它们进行一些OpenCV操作,我将加载的图像分配到IplImage中以对其进行处理,然后将处理后的图像再次分配到在图片框中,我编写此代码将从openFileDialog中选择的图像加载到IplImage中,对图像进行二值化,然后将二值化图像重新分配回pictureBox 代码:
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));
但我没有找到显示二进制图像的格式,对此有任何帮助。
原始图片:
转换后的图片:
答案 0 :(得分:1)
你似乎正在创建一个RGB图像(System :: Drawing :: Imaging :: PixelFormat :: Format24bppRgb),但是在其中复制灰度,可能是System :: Drawing :: Imaging功能不进行转换 - 或者没有正确地做到这一点。
编辑:更多解释。
您的灰度图像作为一个字节存储在内存中,每个像素为Y0,Y1,Y2,Y3 ...... Y639(我们使用Y表示亮度,假设图像宽度为640像素)。
您已告诉.net图像类,这是Format24bppRgb,它将存储为每个像素一个红色,一个绿色和蓝色字节(3字节= 24bpp)。因此,该类会获取您的图像数据,并假设Y0,Y1,Y2是第一个像素的红色,绿色,蓝色值,下一个是Y3,Y4,Y5等等。
这占用了图像所用字节数的3倍,因此在行的1/3之后它开始读取下一行,依此类推 - 这将为您提供三张重复的图片。
PS。你把它变成二进制图像的事实只是意味着Y值是0或255 - 它不会改变数据大小或形状。