Visual c++ 如何在pictureBox VC++;

Visual c++ 如何在pictureBox VC++;,visual-c++,image-processing,opencv,bitmap,Visual C++,Image Processing,Opencv,Bitmap,我正在开发一个VC++和OpenCV应用程序,我正在将图像加载到PictureBox并对其进行一些OpenCV操作,我将加载的图像分配到IplImage进行处理,然后将处理后的图像再次分配到PictureBox,我编写此代码将从openFileDialog选择的图像加载到IplImage,对图像进行二值化,然后将二值化图像重新分配回pictureBox 代码: 但是我没有找到一种显示二进制图像的格式,对此我没有任何帮助 原始图像: 转换图像: 您似乎正在创建RGB图像(System::Draw

我正在开发一个VC++和OpenCV应用程序,我正在将图像加载到PictureBox并对其进行一些OpenCV操作,我将加载的图像分配到IplImage进行处理,然后将处理后的图像再次分配到PictureBox,我编写此代码将从openFileDialog选择的图像加载到IplImage,对图像进行二值化,然后将二值化图像重新分配回pictureBox 代码:

但是我没有找到一种显示二进制图像的格式,对此我没有任何帮助

原始图像:

转换图像:

您似乎正在创建RGB图像(System::Drawing::Imaging::PixelFormat::Format24bppRgb),但将灰度复制到其中,可能System::Drawing::Imaging函数没有进行转换,或者没有正确地进行转换

编辑:更多解释。
灰度图像作为每个像素Y0、Y1、Y2、Y3的一个字节存储在内存中。。。。。。Y639(我们使用Y表示亮度,并假设图像宽度为640像素)

您已经告诉.net image类,这是一个24bpprgb格式,它将存储为每像素一个红色、一个绿色和蓝色字节(3bytes=24bpp)。因此,该类获取图像数据,并假设Y0、Y1、Y2是第一个像素的红、绿、蓝值,Y3、Y4、Y5是下一个像素的值,依此类推。
这将使用图像的3倍字节,因此在该行的1/3之后,它开始读取下一行,依此类推-这将为您提供三个重复的图片


另外,将其转换为二进制图像的事实只意味着Y值为0或255-它不会更改数据大小或形状

System::Drawing::Imaging如何进行转换并在pictureBox中显示图像?@Eslam如果您想在.net框中显示灰度图像,请告诉它使用灰度像素类型而不是24bppRgbi。我尝试使用Format16bpprrayscale,但它抛出了一个错误exception@Eslam您正在给system::drawing。。。它不支持的8位灰度。为什么不给它彩色图像?我不是给system::绘制灰度图像我给它一个二值图像,因为我想对原始图像进行二值化并将输出加载到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));