IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> HALCON联合C#检测表面缺陷——实例化相机采集图片和读取本地图片(二) -> 正文阅读

[人工智能]HALCON联合C#检测表面缺陷——实例化相机采集图片和读取本地图片(二)

上一节中,我们实现了读取文本来,这样来创建相机,这一节们继续说实例化相机

当我们创建了读取本地文本类之后,在主程序中实例化

?

?实例化之后,读取相机序列号就可以了,还有两个报错的地方是注册halcon显示函数,这两个函数的功能就是用来在界面上显示相机采集的图片,这里我们先不管,后面说到Halcon的导出时,我们再来补上他,这一节主要还是说相机的实例化,打开,关闭等

?初始化相机函数完成后,我们在form_load中直接加载就可了

?

?打开软件,加载相机,关闭软件同时也要关闭相机,我们在form1的事件中加入一个formclosed的事件

?在后台代码中就生成了一个formclosed的事件

?在这里我们加入相机关闭事件

? //窗口关闭事件
? ? ? ? private void Form1_FormClosed(object sender, FormClosedEventArgs e)
? ? ? ? {
? ? ? ? ? ? mCamera1.stopGrab();
? ? ? ? ? ? mCamera1.ReleaseCam();

? ? ? ? ? ? mCamera2.stopGrab();
? ? ? ? ? ? mCamera2.ReleaseCam();
? ? ? ? }

?完成之后,为了代码的整齐,我们剪切复制到form_load函数的下面

?在程序的顶部添加halcon的命名空间名称

?using HalconDotNet;

添加相机1和相机2的回调函数

?//相机1回调函数
? ? ? ? private void processHImage1(HObject hImg)
? ? ? ? {?
? ? ? ??
? ? ? ? }
? ? ? ? //相机2回调函数
? ? ? ? private void processHImage2(HObject hImg)
? ? ? ? {

? ? ? ? }

具体内容,我们马上从halcon中导入,这里两个回调函数只要相机被触发拍照就会自动执行,关于回调函数大家可以百度查一查原理,这两个函数都有一个输入参数,这个输入参数就是相机采集图像后转换成halcon的图像,转换函数之前我们在相机类中已经写过了,

?

?我们打开halcon软件写入以下代码,这段代码的功能就是读取一张图片,然后把图片显示在halcon窗口上,并且图片大小适应窗口大小

?read_image (Image, 'printer_chip/printer_chip_01')? //根据路径读取图片
?get_image_size (Image, Width, Height)? ? ? ? ? ? ? ? ? //获取图片大小
?dev_set_part (0, 0, Height,Width)? ? ? ? ? ? ? ? ? ? ? ? ? ? //适应窗口大小
?dev_display (Image)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//显示图片

完成之后,可以运行一下看看效果,上面的路劲图片无所谓,大家可以随便浏览选择一张,我是默认软件自带的图片。

导出halcon代码到C#,点击文件,导出

?选择导出的路径和语言,这里选择C#

?选择导出即可

?我们发现导出的文件就是C#的一个类

鼠标双击打开

?

?虽然代码很多,但是我们只需要看action函数中的就可以 了

?这里就是刚刚导出的主程序,对于主程序我们其实是可以直接使用的,但是有些是没有必要的,我们也可以删除,大家对照上面图片和下面的代码,我删减了一部分

?private void action()
? {


? ? // 定义变量,在HALCON中我们没有写,是因为后台为我们创建好了,在C#中必须先创建变量,ho_Image是图像变量Hobject

? ? HObject ho_Image;

? ? // 同上,hv_Width和hv_Height是数组变量

? ? HTuple hv_Width = new HTuple(), hv_Height = new HTuple();


? ? // 在c#中使用halcon的图形变量必须先初始化,然后释放再使用,后面只要是Hobject类型的都必须有下面两行,如果只有第一行genEmpty可以使用但是会占用内存,不会被释放,必须使用dispose释放内存,这里必须注意
? ? HOperatorSet.GenEmptyObj(out ho_Image);
? ? ho_Image.Dispose();

? ? ?//根据路径读取图片算子
? ? HOperatorSet.ReadImage(out ho_Image, "printer_chip/printer_chip_01");

? ? //使用前对数组清空
? ? hv_Width.Dispose();hv_Height.Dispose();

? ?//获取图片大小算子
? ? HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);

//这里不需要判断窗口,因为在C#中窗口我们已经创建好了,所以不需要判断
//设置图片适应窗口算子

? ? ? HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
//显示算子
? ? ? HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
//上面标注红色的部分我们要修改成我们创建的窗口句柄,大家先注意这里,后面我们会修改
? ? ho_Image.Dispose();

? ? hv_Width.Dispose();
? ? hv_Height.Dispose();

? }
在以上程序中我们可以看出一个使用变量的思路,创建变量,初始化变量,使用前释放,使用后释放,保证不使用的变量不会占用计算机内存。

程序导出后,我们直接复制到我们之前创建的两个相机回调函数中就可了,但是需要修改,回调函数中图片不是根据路径读取的,是相机采集的,所以具体修改后如下

?//相机1回调函数
? ? ? ? private void processHImage1(HObject hImg)
? ? ? ? {?

? ? HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
? ? HOperatorSet.GenEmptyObj(out ho_Image);
? ? ho_Image.Dispose();
? ? hv_Width.Dispose();hv_Height.Dispose();


? ? HOperatorSet.GetImageSize(hImg, out hv_Width, out hv_Height);

//这里的窗口句柄会在下一章节中我们创建和修改
? ? ? HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
//这里的窗口句柄会在下一章节中我们创建和修改
? ? ? HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());

? ? ho_Image.Dispose();

? ? hv_Width.Dispose();
? ? hv_Height.Dispose();

? ? ? ? }
? ? ? ? //相机2回调函数
? ? ? ? private void processHImage2(HObject hImg)
? ? ? ? {

? HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
? ? HOperatorSet.GenEmptyObj(out ho_Image);
? ? ho_Image.Dispose();
? ? hv_Width.Dispose();hv_Height.Dispose();


? ? HOperatorSet.GetImageSize(hImg, out hv_Width, out hv_Height);

//这里的窗口句柄会在下一章节中我们创建和修改
? ? ? HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
//这里的窗口句柄会在下一章节中我们创建和修改
? ? ? HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());

? ? ho_Image.Dispose();

? ? hv_Width.Dispose();
? ? hv_Height.Dispose();

? ? ? ? }

这样,我们的相机回调函数就差窗口显示了,下面我们实现创建显示窗口变量,之前我们在界面上已经放置 了两个窗口

?但是没有在后台代码中定义两个窗口,定义窗口的目的是为了获取窗口句柄,进而在窗口上进行更方面的操作,当然这不是唯一的方法,具体如下

?? ? //窗口定义
? ? ? ? HWindow camera1RunWindow;
? ? ? ? HWindow camera2RunWindow;

然后在初始化函数里进行获取界面上两个HALCON窗口句柄的操作

在InitControl函数里添加如下代码

?

?? ?//窗口创建
? ? ? ? ? ? camera1RunWindow = hWindowControl1.HalconWindow;
? ? ? ? ? ? camera2RunWindow = hWindowControl2.HalconWindow;

然后我们修改两个回调函数中的窗口句柄就可以了

?//相机1回调函数
? ? ? ? private void processHImage1(HObject hImg)
? ? ? ? {?

? ? HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
? ? HOperatorSet.GenEmptyObj(out ho_Image);
? ? ho_Image.Dispose();
? ? hv_Width.Dispose();hv_Height.Dispose();


? ? HOperatorSet.GetImageSize(hImg, out hv_Width, out hv_Height);


? ? ? HOperatorSet.SetPart( camera1RunWindow , 0, 0, hv_Height, hv_Width);

? ? ? HOperatorSet.DispObj(ho_Image,
camera1RunWindow );

? ? ho_Image.Dispose();

? ? hv_Width.Dispose();
? ? hv_Height.Dispose();

? ? ? ? }


? ? ? ? //相机2回调函数
? ? ? ? private void processHImage2(HObject hImg)
? ? ? ? {

? HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
? ? HOperatorSet.GenEmptyObj(out ho_Image);
? ? ho_Image.Dispose();
? ? hv_Width.Dispose();hv_Height.Dispose();


? ? HOperatorSet.GetImageSize(hImg, out hv_Width, out hv_Height);


? ? ? HOperatorSet.SetPart(camera2RunWindow , 0, 0, hv_Height, hv_Width);

? ? ? HOperatorSet.DispObj(ho_Image,
camera2RunWindow );

? ? ho_Image.Dispose();

? ? hv_Width.Dispose();
? ? hv_Height.Dispose();

? ? ? ? }

到这一节为止,如果大家手上有相机,这10篇文章的代码可以实现相机的打开,关闭,采集图像显示到窗口上,不过还需要在启动软件后,软触发一下相机即可,这一点后一篇文章我们讲解;另外下一篇我们因为可能手上没有相机,我会带大家实现手动选取本地一张图片显示到窗口上,这样在后期的时候,我们讲解缺陷检测,大家可以根据我给出的图片或者手上的图片去检测

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:46:04  更:2021-12-23 15:48:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 23:17:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码