Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon进行读码识别(C#)

简介: Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon进行读码识别(C#)

Baumer工业相机

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。


Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。

Baumer工业相机由于其性能和质量的优越和稳定,常用于高速同步采集领域,通常使用各种图像算法来提高其捕获的图像的质量。


Baumer工业相机图像数据联合Halcon进行读码的技术背景

工业相机图像数据联合Halcon进行读码的技术背景主要涉及到机器视觉和图像处理领域。


工业相机是一种专门用于工业生产过程中的图像采集设备,其主要功能是通过采集并处理物体的图像信息,实现自动化生产过程的监控和控制。而读码则是一种对于二维码、条形码等符号进行识别和解码的技术。


Halcon是一种流行的机器视觉开发工具,其提供了丰富的图像处理和分析功能,可以对工业相机采集的图像数据进行处理、分析和识别,实现对于二维码、条形码等符号的读码功能。


因此,将工业相机图像数据与Halcon进行联合,可以实现高效、准确的读码功能,为工业生产过程中的自动化监控和控制提供了有力的支持。


Baumer工业相机使用BGAPISDK将图像数据转换为ImageSource方式

下面介绍在C#里Baumer工业相机如何使用BGAPISDK转换原始图像数据为ImageSource的方式


1.引用合适的类文件

代码如下(示例):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Data;
using System.Globalization;
using System.Diagnostics;
using System.IO;
using HalconDotNet;

2.使用BGAPISDK联合Halcon进行读码的方式

核心代码如下所示:

public ImageSource ToImageSource(BGAPI2.Buffer Image)
{
    if (Image== null || Image.IsEmpty)
    {
        Debug.Print("ImageToImageSourceConverter: Image is null or empty");
        return null;
    }
    else
    {
        Codes.Clear();
        //Check for the Halcon-License (Dongle/File)
        if (HalconLicenseCheck())
        {
            //NeoAPI.Image to Halcon-Image 
            HImage hImage = new("byte", (int)Image.Width, (int)Image.Height, Image.ImageData);
            //Create HDataCode2DModel
            HDataCode2D hDataCode2D = new();
            hDataCode2D.CreateDataCode2dModel("Data Matrix ECC 200", new HTuple(), new HTuple());
            //Find DataCodes
            HXLDCont hXLDCont;
            hXLDCont = hImage.FindDataCode2d(hDataCode2D, "stop_after_result_num", "20", out HTuple resultHandle, out HTuple decodedDataStrings);
            //determine the coordinates for each code found
            for (int i = 0; i < decodedDataStrings.Length; i++)
            {
                //Get Contoure Data
                hXLDCont[i + 1].GetContourXld(out HTuple rowHXLDCont, out HTuple colHXLDCont);
                Point TopLeft = new(System.Convert.ToInt32((double)colHXLDCont[0]), System.Convert.ToInt32((double)rowHXLDCont[0]));
                Point TopRight = new(System.Convert.ToInt32((double)colHXLDCont[1]), System.Convert.ToInt32((double)rowHXLDCont[1]));
                Point BottomRight = new(System.Convert.ToInt32((double)colHXLDCont[2]), System.Convert.ToInt32((double)rowHXLDCont[2]));
                Point BottomLeft = new(System.Convert.ToInt32((double)colHXLDCont[3]), System.Convert.ToInt32((double)rowHXLDCont[3]));
                String Text = decodedDataStrings[i];
                Code code = new(TopLeft, TopRight, BottomLeft, BottomRight, Text);
                Codes.Add(code);
            }
        }
        //copy NeoAPI-Image int a writeableBitmap 
        NeoAPI.Image transformedImage;
        Boolean isChanged = false;
        if (width != System.Convert.ToInt32(Image.Width))
        {
            isChanged = true;
            width = System.Convert.ToInt32(Image.Width);
        }
        if (height != System.Convert.ToInt32(Image.Height))
        {
            isChanged = true;
            height = System.Convert.ToInt32(Image.Height);
        }
        if (isChanged)
        {
            writeableBitmap = new WriteableBitmap(width, height, dpiX, dpiY, PixelFormats.Bgr24, null);
            backBuffer = writeableBitmap.BackBuffer;
        }
        transformedImage = Image.Convert("BGR8");
        CopyMemory(backBuffer, transformedImage.ImageData, System.Convert.ToUInt32(transformedImage.Width) * System.Convert.ToUInt32(transformedImage.Height) * 3);
        Image.Dispose();
        if(transformedImage!=null) transformedImage.Dispose();
        //draw the writeableBitmap into a DrawingImage, draw a frame around the codes and draw text with the content next to it
        DrawingGroup dGroup = new();
        Pen pen = new(Brushes.Lime, 10);
        if (writeableBitmap != null)
        {
            writeableBitmap.Lock();
            writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, width, height));
            writeableBitmap.Unlock();
            using DrawingContext dc = dGroup.Open();
            dc.DrawImage(writeableBitmap, new Rect(0, 0, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight));
            foreach (Code code in Codes)
            {
                dc.DrawLine(pen, code.TopLeft, code.TopRight);
                dc.DrawLine(pen, code.TopRight, code.BottomRight);
                dc.DrawLine(pen, code.BottomRight, code.BottomLeft);
                dc.DrawLine(pen, code.BottomLeft, code.TopLeft);
                Point TextPoint = new(code.TopRight.X, code.TopRight.Y - 250);
                Rect rect = new(TextPoint.X - 10, TextPoint.Y - 10, 600, 240);
                Pen rectPen = new(Brushes.DarkGreen, 10.0f);
                dc.DrawRectangle(Brushes.DarkGreen, rectPen, rect);
                FormattedText formattedText = new(code.Text, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("Arial"), 46, Brushes.Lime, 96);
                dc.DrawText(formattedText, TextPoint);
            }
        }
        DrawingImage dImageSource = new(dGroup);
        return dImageSource;               
    }
}
private static bool HalconLicenseCheck()
{
    bool LicenseIsValid;
    try
    {
        HImage ho_ImageTest = new();
        ho_ImageTest.GenImageConst("byte", 100, 100);
        LicenseIsValid = true;
    }
    catch(Exception ex)
    {
        Debug.Print("Exception during HalconLicenseCheck. Message = " + ex.Message);
        LicenseIsValid = false;
    }
    return LicenseIsValid;
}

Baumer工业相机图像联合Halcon进行读码的优势

工业相机图像联合Halcon进行读码的优势主要体现在以下几个方面:


高效准确:Halcon具备强大的图像处理和分析功能,可以对工业相机采集的图像数据进行高效、准确的处理和识别,提高读码的准确率和效率。


可定制性强:Halcon提供了丰富的图像处理算法和函数库,可以根据不同的应用场景和需求,进行定制化的二维码、条形码等符号的识别算法开发,提高读码的适应性和可靠性。


可扩展性强:Halcon支持多种编程语言和平台,可以与其他软件和硬件系统进行集成,实现更加完整和高效的工业自动化控制系统。


可追溯性强:通过Halcon对二维码、条形码等符号的读码,可以实现对产品生产、质量检测等环节的全程追溯,提高生产管理的效率和质量。


综上所述,工业相机图像联合Halcon进行读码具有高效准确、可定制性强、可扩展性强和可追溯性强等优势,可以为工业自动化生产提供更加可靠和高效的控制和管理。


Baumer工业相机图像联合Halcon进行读码的行业应用

工业相机图像联合Halcon进行读码在工业自动化领域有着广泛的应用,以下是几个行业应用的例子:


电子制造业:在电子制造过程中,需要对电子元器件和产品进行标识和追溯,工业相机图像联合Halcon进行二维码或条形码的读码,可以实现对于电子元器件和产品的识别和追溯。


医疗器械制造业:在医疗器械制造过程中,需要对器械进行标识和追溯,工业相机图像联合Halcon进行二维码的读码,可以实现对医疗器械的识别和追溯,提高医疗器械的质量和安全性。


物流行业:在物流行业中,需要对包裹、货物进行标识和追溯,工业相机图像联合Halcon进行二维码或条形码的读码,可以实现对包裹、货物的识别和追溯,提高物流运输的效率和质量。


食品制造业:在食品制造过程中,需要对食品进行标识和追溯,工业相机图像联合Halcon进行二维码或条形码的读码,可以实现对食品的识别和追溯,提高食品安全和质量。


综上所述,工业相机图像联合Halcon进行读码在电子制造、医疗器械制造、物流行业、食品制造等领域都有着广泛的应用,可以提高生产效率、产品质量和安全性,为企业的可持续发展提供有力的支持。

目录
相关文章
|
4月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
53 0
|
4月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用ForceIP强制修改网口IP功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用ForceIP强制修改网口IP功能(C#)
30 0
|
4月前
|
编解码 监控 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C#)
20 0
|
4月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
32 0
|
16天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
16天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
16天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
16天前
|
人工智能 C# 开发者
C#编程中的图形界面设计
【4月更文挑战第21天】本文探讨了C#在GUI设计中的应用,介绍了Windows Forms、WPF和UWP等常用框架,强调了简洁界面、响应式设计和数据绑定等最佳实践。通过实际案例,展示了C#在企业应用、游戏开发和移动应用中的GUI实现。随着技术发展,C#在GUI设计的未来将趋向于跨平台、更丰富的组件和AI集成,为开发者创造更多可能性。
|
16天前
|
存储 算法 C#
C#编程与数据结构的结合
【4月更文挑战第21天】本文探讨了C#如何结合数据结构以构建高效软件,强调数据结构在C#中的重要性。C#作为面向对象的编程语言,提供内置数据结构如List、Array和Dictionary,同时也支持自定义数据结构。文章列举了C#实现数组、链表、栈、队列等基础数据结构的示例,并讨论了它们在排序、图算法和数据库访问等场景的应用。掌握C#数据结构有助于编写高性能、可维护的代码。
|
16天前
|
开发框架 Linux C#
C#编程的跨平台应用
【4月更文挑战第21天】C#与.NET Core的结合使得跨平台应用开发变得高效便捷,提供统一编程模型和高性能。丰富的类库、活跃的社区支持及Visual Studio Code、Xamarin等工具强化了其优势。广泛应用在企业系统、云服务和游戏开发中,虽面临挑战,但随着技术进步,C#在跨平台开发领域的前景广阔。