C# 与 Halcon 17.12 的梦幻联动:打造强大视觉项目
C#联合Halcon视觉框架,可以根据项目配置工程,选择对应halcon脚本,可以编译修改脚本,调试相机,创建模板,可以查看检测信息,生产履历,保存历史图像,跟三菱FX5U以太网通讯,相机是海康网口sdk,halcon版本17.12,在工业视觉领域,将 C# 与 Halcon 框架相结合,能够释放出令人惊叹的能力。今天就来聊聊如何利用这两者,打造一个功能丰富的视觉项目。
C#联合Halcon视觉框架,可以根据项目配置工程,选择对应halcon脚本,可以编译修改脚本,调试相机,创建模板,可以查看检测信息,生产履历,保存历史图像,跟三菱FX5U以太网通讯,相机是海康网口sdk,halcon版本17.12,

在工业视觉领域,将 C# 与 Halcon 框架相结合,能够释放出令人惊叹的能力。今天就来聊聊如何利用这两者,打造一个功能丰富的视觉项目。
一、项目配置与 Halcon 脚本选择
在开始项目前,我们要先进行工程配置。Halcon 提供了脚本的方式来处理视觉任务,我们可以根据项目需求灵活选择对应的 Halcon 脚本。例如,在一个简单的产品外观检测项目中,可能会有检测产品表面划痕的脚本,以及检测产品是否组装完整的脚本。

在 C# 中,我们可以通过代码来加载不同的 Halcon 脚本。假设已经将 Halcon 的运行时环境集成到项目中,可以这样加载脚本:
using HalconDotNet;
class Program
{
static void Main()
{
HOperatorSet.GenEmptyObj(out HObject ho_Image);
HOperatorSet.ReadImage(out ho_Image, "your_image_path");
// 加载 Halcon 脚本文件
HDevProgram program = new HDevProgram("your_script_path.hdev");
HDevEngine engine = new HDevEngine(program);
// 执行脚本中的函数
engine.Execute();
}
}
在这段代码中,首先生成一个空的 Halcon 对象 ho_Image,然后读取一张图片。接着加载指定路径下的 Halcon 脚本文件,并创建一个执行引擎来执行脚本中的操作。
二、编译与修改脚本
Halcon 的脚本并不是一成不变的,我们可以根据实际情况对其进行编译和修改。比如在实际检测过程中,发现检测精度不够,就需要调整脚本中的参数。

C#联合Halcon视觉框架,可以根据项目配置工程,选择对应halcon脚本,可以编译修改脚本,调试相机,创建模板,可以查看检测信息,生产履历,保存历史图像,跟三菱FX5U以太网通讯,相机是海康网口sdk,halcon版本17.12,

在 Halcon 的开发环境中,可以直接打开脚本文件进行修改。修改完成后,重新编译。在 C# 代码中加载修改后的脚本,就可以使用新的逻辑进行视觉处理。
三、调试相机
本项目使用海康网口 SDK 的相机。在 C# 中调用海康相机 SDK 来调试相机,确保相机能够正常采集图像是关键的一步。以下是一个简单的相机初始化代码示例:
using System;
using HikVision;
class CameraManager
{
private Camera camera;
public CameraManager()
{
camera = new Camera();
// 初始化相机参数
camera.Init("192.168.1.100", 8000, "admin", "password");
camera.Connect();
}
public HObject GetImage()
{
byte[] imageData = camera.GetImageData();
// 将相机采集到的数据转换为 Halcon 可处理的图像对象
HOperatorSet.GenImage1(out HObject ho_Image, "byte", camera.Width, camera.Height, imageData);
return ho_Image;
}
}
这段代码定义了一个 CameraManager 类来管理相机的连接和图像获取。在构造函数中初始化相机并连接,GetImage 方法获取相机采集的图像数据,并转换为 Halcon 能处理的图像对象。
四、创建模板
模板匹配在视觉检测中非常重要。使用 Halcon 可以轻松创建模板。以下是一个简单的创建模板示例:
HOperatorSet.GenEmptyObj(out HObject ho_Template);
HOperatorSet.ReadImage(out HObject ho_ImageForTemplate, "template_image_path");
HOperatorSet.CreateShapeModel(ho_ImageForTemplate, "auto", 0, Math.PI, "auto", "none", "use_polarity", "auto", 0.5, out HTuple hv_ModelID);
HOperatorSet.GenEmptyObj(out ho_Template);
HOperatorSet.GetShapeModelContours(out ho_Template, hv_ModelID, 1);
上述代码首先读取一张用于创建模板的图片,然后使用 CreateShapeModel 函数创建形状模型,并获取模型的轮廓作为模板。
五、查看检测信息与生产履历
在检测完成后,我们需要查看检测信息,并记录生产履历。可以在 C# 中使用数据库来存储这些信息。例如使用 SQLite 数据库:
using System.Data.SQLite;
class HistoryManager
{
private SQLiteConnection connection;
public HistoryManager()
{
string connectionString = "Data Source=production_history.db;Version=3;";
connection = new SQLiteConnection(connectionString);
connection.Open();
// 创建表(如果不存在)
string createTableQuery = "CREATE TABLE IF NOT EXISTS ProductionHistory (Id INTEGER PRIMARY KEY AUTOINCREMENT, DetectionResult TEXT, ImagePath TEXT, Timestamp DATETIME)";
SQLiteCommand command = new SQLiteCommand(createTableQuery, connection);
command.ExecuteNonQuery();
}
public void SaveHistory(string result, string imagePath)
{
string insertQuery = "INSERT INTO ProductionHistory (DetectionResult, ImagePath, Timestamp) VALUES (@result, @imagePath, @timestamp)";
SQLiteCommand command = new SQLiteCommand(insertQuery, connection);
command.Parameters.AddWithValue("@result", result);
command.Parameters.AddWithValue("@imagePath", imagePath);
command.Parameters.AddWithValue("@timestamp", DateTime.Now);
command.ExecuteNonQuery();
}
}
这段代码创建了一个 HistoryManager 类,用于管理生产履历的存储。构造函数中创建数据库连接并创建存储检测历史的表,SaveHistory 方法将每次检测的结果、图像路径和时间戳保存到数据库中。
六、保存历史图像
为了后续分析和追溯,保存历史图像是必要的。可以使用 C# 的文件操作来实现:
string savePath = "history_images\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg";
HOperatorSet.WriteImage(ho_Image, "jpeg", 0, savePath);
上述代码将当前处理的图像以 JPEG 格式保存到指定的历史图像文件夹中,文件名包含时间戳。
七、与三菱 FX5U 以太网通讯
最后,实现与三菱 FX5U 的以太网通讯,可以将检测结果发送给 PLC。这里使用三菱提供的通讯库来实现:
using MitsubishiFx5u;
class PLCCommunication
{
private Fx5uPlc plc;
public PLCCommunication()
{
plc = new Fx5uPlc("192.168.1.200", 5007);
plc.Connect();
}
public void SendData(string data)
{
// 将数据转换为 PLC 可接收的格式并发送
byte[] dataBytes = System.Text.Encoding.ASCII.GetBytes(data);
plc.Write(dataBytes, 0, dataBytes.Length);
}
}
这段代码创建了一个 PLCCommunication 类,用于连接三菱 FX5U PLC 并发送数据。在构造函数中建立连接,SendData 方法将检测结果数据转换为字节数组并发送给 PLC。

通过以上步骤,我们利用 C# 和 Halcon 17.12,结合海康相机以及与三菱 PLC 的通讯,打造了一个功能全面的视觉项目。无论是从相机调试、视觉处理,还是数据记录与通讯,各个环节紧密配合,为工业生产中的视觉检测提供了强大的解决方案。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)