3.读取图片和图片采集
目录
一、Halcon
1. 图片的基本概念
2. 获取图片方式1-读取本地图片
3. 获取图片方式2-在线采集
4. C#获取图片数据架构
二、VS联合编程
1. 读取本地图片
2.在线采集
一、Halcon
1. 图片的基本概念
1. 图片2. 像素 3. 分辨率4. 位深度5. 不同后缀1. png jpg 2. bmp 6. 图像成像原理7. 图像矩阵8. 灰度9. 黑白和彩色图片1. 单通道2. 三通道 RGB
2. 获取图片方式1-读取本地图片
*1. 读取本地图片
* 1. 菜单 - 文件 - 读取图像
* 2. Ctrl + R
* 3. 直接拖
* 4. 算子
*
*
*2. read_image
*
*3. halcon窗口显示
* 当执行到图像变量的时候,halcon窗口会自动显示当前变量
*
*4. 路径
* 1. 绝对路径
* 2. 相对路径
* 1. 相对于halcon工程文件
* 2. C:/Users/Public/Documents/MVTec/HALCON-19.05-Progress/examples/images
*
*5. 省略图片后缀
*
*6. HObject对象使用
* 1. 定义对象 HObject ho_Image;
* 2. 实例化 HOperatorSet.GenEmptyObj(out ho_Image);
* 3. 释放对象 ho_Image.Dispose();
* 4. 使用 HOperatorSet.ReadImage(out ho_Image, "E:/bmp/card.bmp");
* 5. 释放对象 ho_Image.Dispose();
*
*7. 关于显示
* 1. 在halcon里面 - 当执行到图像变量的时候,halcon窗口会自动显示当前变量
* 2. 在C#里面所有hobject对象都不会自动显示
*
*8. 显示算子
* 1. disp_obj
* 2. dev_display
*
*9. 自适应显示
* 1. this.hWindowControl1.ImagePart = new Rectangle(0, 0, Width, Height);
* 2. set_part (WindowHandle, 0, 0, Height-1, Width-1)
*
*10. 获取图片分辨率
*
*
*11. Htuple对象
* 1. 定义+实例化 HTuple hv_Height = new HTuple();
* 2. 释放对象 hv_Width.Dispose();hv_Height.Dispose();
* 3. 操作 HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
* 4. 释放对象 hv_Width.Dispose(); hv_Height.Dispose();dev_get_window (WindowHandle)read_image (Image, 'E:/bmp/card.bmp')*read_image (Image, 'card.bmp')
*read_image (Image, 'card')*read_image (Image, 'printer_chip/printer_chip_01')*read_image (Image1, 'can')get_image_size (Image, Width, Height)set_part (WindowHandle, 0, 0, Height-1, Width-1)disp_obj (Image, WindowHandle)
3. 获取图片方式2-在线采集
*在线采集
*1. 一台相机或笔记本摄像头
*
*2. 相机驱动软件
*
*3. halcon - 菜单 - 助手 - Image Acquisition
* 1. 资源 - 图像获取接口 - 自动检测接口 - DirectShow
* 2. 连接 - 设备列表 - 选中操作的相机
* 颜色空间-gray
* 连接 - 实时
* 3. 代码生成 - 插入代码
*
*4. 注意显示
*
** Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'gray', -1, 'false', 'default', '[2] LW', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)grab_image_async (Image, AcqHandle, -1)* Image Acquisition 01: Do something
endwhile
close_framegrabber (AcqHandle)
4. C#获取图片数据架构
*全局位移图像接口
*1.HObject Image
*
*2.load实例化
*
*读图片或在线采集
*3. 释放
*4. 操作
*
*5.closing释放
*
*子窗体使用图片
*1. 构造函数传参
*2. 静态变量
*3. 委托
*
二、VS联合编程
1. 读取本地图片
创建一个新项目,在窗口上添加一个button控件双击进去,添下面程序。五步曲(参考上面halcon读取图片程序解释)
#region 读取图片private void 读取图片ToolStripMenuItem_Click(object sender, EventArgs e){//openFileDialog1也是一个控件this.openFileDialog1.Filter = "bmp图片|*.bmp|png图片|*.png|jpg图片|*.jpg";if (this.openFileDialog1.ShowDialog() == DialogResult.OK){try{HTuple hv_Width = new HTuple();HTuple hv_Height = new HTuple();HObject ho_Image;HOperatorSet.GenEmptyObj(out ho_Image);ho_Image.Dispose();HOperatorSet.ReadImage(out ho_Image, this.openFileDialog1.FileName);hv_Width.Dispose(); hv_Height.Dispose();HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);//this.hWindowControl1.ImagePart = new Rectangle(0, 0, hv_Width, hv_Height);HOperatorSet.SetPart(this.hWindowControl1.HalconWindow, 0, 0, hv_Height - 1, hv_Width - 1);HOperatorSet.DispObj(ho_Image, this.hWindowControl1.HalconWindow);ho_Image.Dispose();hv_Width.Dispose();hv_Height.Dispose();}catch (Exception ex){MessageBox.Show(ex.ToString());}}}#endregion
2.在线采集
同样创建一个checkbox控件,然后编写下面程序
#region 图像处理-对象(全局变量)HObject ho_Image;HTuple hv_Width = new HTuple();HTuple hv_Height = new HTuple();#endregion
#region 打开关闭相机HTuple hv_AcqHandle = new HTuple();//1.实例化相机句柄private void OpenCam(){try{hv_AcqHandle.Dispose();//2.消除相机句柄HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "gray",-1, "false", "default", "[2] LW", 0, -1, out hv_AcqHandle);//3.使用相机句柄HOperatorSet.GrabImageStart(hv_AcqHandle, -1);}catch (Exception ex){MessageBox.Show(ex.ToString());LogHelper.WriteLog("打开相机", ex);//写入日志}}private void CloseCam(){try{HOperatorSet.CloseFramegrabber(hv_AcqHandle);//关闭相机hv_AcqHandle.Dispose();//4.销毁相机句柄}catch (Exception ex){MessageBox.Show(ex.ToString());LogHelper.WriteLog("关闭相机", ex);//写入日志}}#endregion#region 实时显示,启动线程Thread ThreadVideo = null;//定义一个线程private void mcb_video_CheckedChanged(object sender, EventArgs e){if (this.mcb_video.Checked){ThreadVideo = new Thread(runThreadVideo);//把方法放入线程ThreadVideo.IsBackground = true;//标记为后台线程ThreadVideo.Start();}else{ThreadVideo.Abort();//终止线程}}//方法private void runThreadVideo(){while (true){try{ho_Image.Dispose();HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);hv_Width.Dispose(); hv_Height.Dispose();HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);HOperatorSet.SetPart(this.hWindowControl1.HalconWindow, 0, 0, hv_Height - 1, hv_Width - 1);HOperatorSet.DispObj(ho_Image, this.hWindowControl1.HalconWindow);}catch (Exception ex){LogHelper.WriteLog("实时显示",ex);}}}#endregion