图像显示在控件loadPictureBox上
方法一
//读取图像001.jpg
IntPtr img = CvInvoke.cvLoadImage("001.jpg", Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_COLOR);
//IntPtr转换为Image,详细见IntPtr2Image方法
loadPictureBox.Image = IntPtr2Image(img);
//显示图像窗口
CvInvoke.cvShowImage("view", img);
//窗口保留2000毫秒,即2秒
CvInvoke.cvWaitKey(2000);
//关闭窗口
CvInvoke.cvDestroyWindow("view");
//保存图像
CvInvoke.cvSaveImage("002.jpg", img);
//释放
CvInvoke.cvReleaseImage(ref img);
private Image IntPtr2Image(IntPtr src) { MIplImage img = (MIplImage)Marshal.PtrToStructure(src, typeof(MIplImage)); Bitmap disp = new Bitmap(img.width, img.height, PixelFormat.Format24bppRgb); BitmapData bmp = disp.LockBits(new Rectangle(0, 0, img.width, img.height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); long linebytes = (img.width * 24 + 31) / 32 * 4; unsafe { byte* pixel = (byte*)bmp.Scan0.ToPointer(); if (img.nChannels == 3) { for (int i = 0; i < img.height; i++) { for (int j = 0, n = 0; j < img.width; j++, n++) { byte b = ((byte*)img.imageData + img.widthStep * i)[3 * j]; byte g = ((byte*)img.imageData + img.widthStep * i)[3 * j + 1]; byte r = ((byte*)img.imageData + img.widthStep * i)[3 * j + 2]; *(pixel + linebytes * (i) + n) = b; n++; *(pixel + linebytes * (i) + n) = g; n++; *(pixel + linebytes * (i) + n) = r; } } } else if (img.nChannels == 1) { for (int i = 0; i < img.height; i++) { for (int j = 0, n = 0; j < img.width; j++, n++) { byte g = ((byte*)img.imageData + img.widthStep * i)[j]; *(pixel + linebytes * (i) + n) = g; n++; *(pixel + linebytes * (i) + n) = g; n++; *(pixel + linebytes * (i) + n) = g; } } } else { return null; } } disp.UnlockBits(bmp); return (Image)disp; }
方法二
Image<Bgr, Byte> img = new Image<Bgr, byte>("001.jpg");
loadPictureBox.Image = img.ToBitmap();