一、前言
啊!!!原本还想用Halcon写写项目结果光是开个相机就吐出我一口老血。第一个相机能正常打开,结果换了一个相机就挂掉了(T^T)。
好吧,废话就到这里了。
以下主要讲的是在更换相机后,不进行ip设置,如何使用C#代码打开相机的方法。
我使用的相机品牌是BASLER的,使用"GigEVision2"方式连接。
其他品牌的相机我手上没有,所以不能保证不同品牌相机之间的通用性,但应该能提供一种思路。
二、查找相机
Halcon中自带了一种相机查询功能(info_framegrabber()算子),但是它不会直接将相机返回给你,只会返回相机相关的信息(字符串类型)
hdev的代码
python
info_framegrabber('GigEVision2', 'info_boards', Information, Valuelist)
C#代码
cs
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 - 程式代码产生 - 插入程式码)
python
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)
cs
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 代替即可。
cs
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<string, string> keyValuePairs = new Dictionary<string, string>(); // 我这里建立了一个字典来找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,需要重启相机
祝各位运行顺利