C# Emgu CV学习笔记二之图像读写的两种方法
2015-11-13 22:40
357 查看
http://blog.csdn.net/marvinhong/article/details/6800450
图像显示在控件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);
[csharp] view plaincopy
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();
图像显示在控件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);
[csharp] view plaincopy
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();
相关文章推荐
- C# 函数调用
- c# 函数练习;结构体、枚举类型
- c# 实现 通过写入注册表 记住 winform程序 登录名
- C# 自己实现的一套ORM程序附带实体生成工具
- C#实现IDispose接口
- C#基础知识回归
- C#中Encoding.Unicode与Encoding.UTF8的区别
- C#中Encoding.Unicode与Encoding.UTF8的区别
- 在C#代码中提取PDF中的注释文本
- C#语法糖,甜过初恋
- C#暴力屏蔽任务管理器
- (C#基础)创建文件,文件夹
- C#实现的三种模拟自动登录和提交POST信息的方法
- C# 发送邮件实例
- C#警惕匿名方法造成的变量共享实例分析
- C#实现向多线程传参的三种方式实例分析
- C# 开发Chrome内核浏览器(WebKit.net)
- C#基础概念 代码样例
- C#中foreach遍历学习笔记
- C# GET 和 SET作用