C# 编写 Halcon 打开相机(在不主动配置相机网络ip的情况下打开相机)_halcon打开相机
一、前言
啊!!!原本还想用Halcon写写项目结果光是开个相机就吐出我一口老血。第一个相机能正常打开,结果换了一个相机就挂掉了(T^T)。
好吧,废话就到这里了。
以下主要讲的是在更换相机后,不进行ip设置,如何使用C#代码打开相机的方法。
我使用的相机品牌是BASLER的,使用\"GigEVision2\"方式连接。
其他品牌的相机我手上没有,所以不能保证不同品牌相机之间的通用性,但应该能提供一种思路。
二、查找相机
Halcon中自带了一种相机查询功能(info_framegrabber()算子),但是它不会直接将相机返回给你,只会返回相机相关的信息(字符串类型)
hdev的代码
info_framegrabber(\'GigEVision2\', \'info_boards\', Information, Valuelist)
C#代码
HTuple hv_Information = new HTuple(), hv_Valuelist = new HTuple();HOperatorSet.InfoFramegrabber(\"GigEVision2\", \"info_boards\", out hv_Information, out hv_Valuelist);
之后,从HALCON软件还是C#里使用MessageBox.Show(hv_Valuelist.S)输出信息,都会得到以下两种不同阶段的数据:
在ip自动分配前会比分配后多一串信息:
(suggestion:force_ip=192.168.10.2/00:30:53:15:69:0B/192.168.10.144/255.255.255.0)
而这个suggestion就是提示ip自动分配的信息,会在打开一次相机后生效。
(生效后force_ip信息将会被固定,如果打开相机后,进行了电脑网口ip的更改,需要重新连接相机,获取新的suggestion。)
之后原本的默认device_ip会被替换。
1.ip自动分配前
| device:00305315690b_Basler_acA250014gc | unique_name:00305315690b_Basler_acA250014gc | interface:Esen_ITF_b07b253e28e0c0a80a02ffffff00 | producer:Esen | vendor:Basler | model:acA2500-14gc | tl_type:GEV | device_ip:169.254.12.105/16 | device_sn:21403147 | interface_ip:192.168.10.2/24 | status:misconfigured | suggestion:force_ip=192.168.10.2/00:30:53:15:69:0B/192.168.10.144/255.255.255.0
2.ip自动分配后
\' | device:00305315690b_Basler_acA250014gc | unique_name:00305315690b_Basler_acA250014gc | interface:Esen_ITF_b07b253e28e0c0a80a02ffffff00 | producer:Esen | vendor:Basler | model:acA2500-14gc | tl_type:GEV | device_ip:192.168.10.144/24 | device_sn:21403147 | interface_ip:192.168.10.2/24 | status:available\'
三、打开相机的正确设置
我们可以先通过Halcon的辅助功能查看一下正确打开相机的设置。
(顶部导航栏:辅助 - 开启新档ImageAcquisition - 影像撷取介质:选择GigEVision2 - 程式代码产生 - 插入程式码)
open_framegrabber (\'GigEVision2\', 0, 0, 0, 0, 0, 0, \'progressive\', -1, \'default\', \'force_ip=192.168.10.2/00:30:53:15:69:0B/192.168.10.144/255.255.255.0\', \'false\', \'default\', \'00305315690b_Basler_acA250014gc\', 0, -1, AcqHandle)
HTuple hv_AcqHandle = new HTuple();HOperatorSet.OpenFramegrabber(\"GigEVision2\", 0, 0, 0, 0, 0, 0, \"progressive\", -1, \"default\", \"force_ip=192.168.10.2/00:30:53:15:69:0B/192.168.10.144/255.255.255.0\", \"false\", \"default\", \"00305315690b_Basler_acA250014gc\", 0, -1, out hv_AcqHandle);
四、代码
那么基本就能看明白C# HOperatorSet.OpenFramegrabber()方法里
\"force_ip=192.168.10.2/00:30:53:15:69:0B/192.168.10.144/255.255.255.0\"这串字符参数就是suggestion的内容。
还需要device的内容,这是相机的名称。
那么,如果ip分配后没有suggestion可以拿怎么办?
答案是不必管它,将原来的位置用 -1 代替即可。
HTuple hv_Information = new HTuple(), hv_Valuelist = new HTuple();HTuple hv_AcqHandle = new HTuple();hv_Information.Dispose(); hv_Valuelist.Dispose();hv_AcqHandle.Dispose();try{ HOperatorSet.InfoFramegrabber(\"GigEVision2\", \"info_boards\", out hv_Information, out hv_Valuelist); //MessageBox.Show(hv_Valuelist.S); //感兴趣可以看一下输出结果 string[] parts = hv_Valuelist.S.Split(new[] { \'|\' }, StringSplitOptions.RemoveEmptyEntries); // 按照\"|\"切分,并清理空白字符 Dictionary keyValuePairs = new Dictionary(); // 我这里建立了一个字典来找suggestion以及device,还可以使用其他的方法来寻找。 foreach (string part in parts) { string[] keyValue = part.Split(new[] { \':\' }, 2); if (keyValue.Length == 2) { string key = keyValue[0].Trim(); string value = keyValue[1].Trim(); keyValuePairs[key] = value; } } if (keyValuePairs.ContainsKey(\"suggestion\")) // 如果存在suggestion就使用keyValuePairs[\"suggestion\"] { HOperatorSet.OpenFramegrabber(\"GigEVision2\", 0, 0, 0, 0, 0, 0, \"progressive\", -1, \"default\", keyValuePairs[\"suggestion\"], \"false\", \"default\", keyValuePairs[\"device\"], 0, -1, out hv_AcqHandle); } else // 如果不存在suggestion就使用 -1 { HOperatorSet.OpenFramegrabber(\"GigEVision2\", 0, 0, 0, 0, 0, 0, \"progressive\", -1, \"default\", -1, \"false\", \"default\", keyValuePairs[\"device\"], 0, -1, out hv_AcqHandle); }}catch (Exception ex){ MessageBox.Show(\"相机打开失败。\");}HOperatorSet.GrabImageStart(hv_AcqHandle, -1);while ((int)(1) != 0){ ho_Image.Dispose(); HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1); HOperatorSet.DispObj(ho_Image, hSmartWindowControl1.HalconWindow); // 放到需要的 hWindowControl 组件里}
五、其他说明
如果刚更换相机,需要等待相机完全启动。(可以使用MVS等软件,查看是否被正常识别)
如果打开相机失败可以尝试更改电脑网口的ip,force_ip选择的网口可能被其他设备占用。
如果更改了电脑网口的ip,需要重启相机
祝各位运行顺利