Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现获取图像并对图像进行边缘检测(C#)

发布时间:2024年01月08日


?

Baumer工业相机

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

Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。
?
Baumer工业相机NEOAPI SDK是用于Baumer工业相机的一款最新的软件开发工具包(SDK)。它为开发人员提供了一系列API和工具,用于与Baumer工业相机进行通信和控制,控制方式极为便捷类似Halcon的相机助手类控制方式。?

OpenCV,全称Open Source Computer Vision Library,是一个开源的跨平台计算机视觉与机器视觉库。该库提供了丰富的图像处理和计算机视觉算法,涵盖了图像处理、特征检测、目标识别、运动跟踪等多个领域,适用于各种平台,包括Windows、Linux、Android和iOS等。OpenCV是由英特尔公司发起并开放源代码,是计算机视觉领域中广泛应用的一种工具。

注意:本文是基于Baumer的NEOAPI SDK的基础上联合OpenCV使用C#语言来实现相机对图像进行边缘检测。

Baumer工业相机使用OpenCV对图像进行边缘检测的技术背景

工业相机使用OpenCV进行图像边缘检测时,涉及到以下技术背景:

  1. 边缘检测算法:OpenCV中包含了许多经典的边缘检测算法,如Sobel、Canny、Laplacian等。这些算法可用于识别图像中的边缘区域,有助于提取出图像中重要的特征信息。

  2. 图像梯度:边缘检测的核心思想是利用图像中像素之间的梯度变化来识别边缘。Sobel和Laplacian算子可以分别用于计算图像中的水平和垂直梯度,而Canny算法则结合多种技术实现更加精确的边缘检测。

  3. 阈值处理:在边缘检测中,设置适当的阈值对梯度值进行处理是非常重要的。这有助于过滤掉噪声或非边缘区域的影响,从而提高边缘检测的准确度。

  4. 实时性和效率:工业相机通常需要实时进行图像处理,因此在选择边缘检测算法时需要考虑其计算复杂度和实时性能。OpenCV提供了针对性能优化的边缘检测算法,适合工业相机实时应用的需求。

  5. 应用场景:工业相机使用OpenCV进行边缘检测的应用场景包括产品质检、定位、测量等。通过边缘检测,可以有效提取并分析产品表面的特征,实现对产品的自动化检测和分析。

综上所述,工业相机使用OpenCV进行图像边缘检测时,需要深入理解边缘检测算法原理、图像梯度计算、阈值处理等技术背景知识,以实现对图像中边缘区域的准确提取和分析。

在NEOAPI SDK里使用OpenCV建立边缘检测功能

using System;
using System.Collections.Generic;
using System.Threading;
using NeoAPI;
using OpenCvSharp;


public class EdgeDetector
{
    public EdgeDetector(string serialnumber)
    {
        camera_.Connect(serialnumber);
        camera_.f.ExposureTime.Value = 2500;
        // cv mats will created by width and height -> there is no space for chunk -> disable chunk
        camera_.DisableChunk();
        try
        {
            camera_.f.PixelFormat.Value = PixelFormat.BayerRG8;
        }
        catch (FeatureAccessException)
        {
            camera_.f.PixelFormat.Value = PixelFormat.Mono8;
        }
        pixel_format_ = camera_.f.PixelFormat.Value;
        identifier_ = serialnumber;
    }
    public void Setup(MemoryMode memtype)
    {
        SetupBuffers(3, memtype);
        camera_.UserBufferMode = true;
    }
    public void Detect(Image image, bool show_image)
    {
        Mat img_mat = image.GetUserBuffer<CamBuffer>().cpu_mat_;
        if (PixelFormat.BayerRG8 == pixel_format_)
        {
            Cv2.CvtColor(img_mat, grey_mat_, ColorConversionCodes.BayerRG2GRAY);
        }
        else
        {
            grey_mat_ = img_mat;
        }
        Cv2.GaussianBlur(grey_mat_, gauss_mat_, new Size(5, 5), 0);
        Cv2.Sobel(gauss_mat_, sobel_mat_, sobel_mat_.Depth(), 1, 1, 5);
        if (show_image)
        {
            Cv2.ImShow(identifier_, sobel_mat_);
            Cv2.WaitKey();
        }
        ++frames_;
    }
    public uint ProcessedFrames()
    {
        uint ret = frames_;
        frames_ = 0;
        return ret;
    }
    public String GetIdentifier()
    {
        return identifier_;
    }
    public void Start(bool show_images)
    {
        run_ = true;
        detect_thread_ = new Thread(delegate () { Detect_(show_images); });
        detect_thread_.Start();
    }
    public void Stop()
    {
        run_ = false;
        if (detect_thread_ != null)
        {
            detect_thread_.Join();
        }
    }
    public void FreeCamBuffers()
    {
        while (buffers_.Count > 0)
        {
            CamBuffer buffer = buffers_.Pop();
            camera_.RevokeUserBuffer(buffer);
        }
    }
    private void SetupBuffers(uint count, MemoryMode memtype)
    {
        int width = (int)camera_.f.Width.Value;
        int height = (int)camera_.f.Height.Value;
        FreeCamBuffers();
        for (uint i = 0; i < count; ++i)
        {
            buffers_.Push(new CamBuffer(width, height, memtype));
            camera_.AddUserBuffer(buffers_.Peek());
        }
        grey_mat_ = new Mat();
        gauss_mat_ = new Mat();
        sobel_mat_ = new Mat();
        grey_mat_.Create(new Size(width, height), MatType.CV_8UC1);
        gauss_mat_.Create(new Size(width, height), MatType.CV_8UC1);
        sobel_mat_.Create(new Size(width, height), MatType.CV_8UC1);
    }
    private void Detect_(bool show_images)
    {
        try
        {
            while (run_)
            {
                using (Image image = camera_.GetImage())
                {
                    if (image.IsEmpty)
                    {
                        System.Console.WriteLine("{0} Error during acquisition!");
                        break;
                    }
                    else
                    {
                        Detect(image, show_images);
                    }
                }
            }
            if (show_images)
            {
                Cv2.DestroyWindow(identifier_);
            }
        }
        catch (NeoException exc)
        {
            System.Console.WriteLine("{0} error: {1}", identifier_, exc.Message);
        }
        catch (OpenCVException exc)
        {
            System.Console.WriteLine("{0} cv error: {1}", identifier_, exc.Message);
        }
    }

    private Cam camera_ = new Cam();
    private Stack<CamBuffer> buffers_ = new Stack<CamBuffer>();
    private String identifier_;
    private Mat grey_mat_;
    private Mat gauss_mat_;
    private Mat sobel_mat_;
    private Thread detect_thread_;
    private uint frames_ = 0;
    private PixelFormat pixel_format_;
    private bool run_ = false;
}
在这里插入代码片

在NEOAPI SDK里使用边缘检测功能对图像进行边缘检测

在相机连接后可以在NEOAPI SDK里使用OpenCV对图像进行边缘检测,C#调用代码如下所示:

using System;
using System.Collections.Generic;
using System.Threading;
using NeoAPI;
using OpenCvSharp;

 
static void FindDevices(Stack<EdgeDetector> devices)
{
    foreach (CamInfo device in NeoAPI.CamInfoList.Get())
    {
        try
        {
            devices.Push(new EdgeDetector(device.SerialNumber));
        }
        catch (NeoException exc)
        {
            System.Console.WriteLine("error: {0}", exc);
        }
    }
    System.Console.WriteLine("{0} device(s) connected!", devices.Count);
}

static void PrintMetrics(Stack<EdgeDetector> devices, uint duration)
{
    for (uint secs = 0; secs < duration; ++secs)
    {
        Thread.Sleep(1000);
        foreach (EdgeDetector device in devices)
        {
            System.Console.WriteLine("{0} fps: {1}", device.GetIdentifier(), device.ProcessedFrames());
        }
    }
}
static void RunDetection(Stack<EdgeDetector> devices, Dictionary<MemoryMode, String> memtypes, bool show_images)
{
    if (devices.Count > 0)
    {
        foreach (KeyValuePair<MemoryMode, String> memtype in memtypes)
        {
            System.Console.WriteLine("Next run will be processed on  {0}", memtype.Value);
            foreach (EdgeDetector device in devices)
            {
                device.Setup(memtype.Key);
            }

            foreach (EdgeDetector device in devices)
            {
                device.Start(show_images);
            }

            PrintMetrics(devices, 5);
        }
    }
}
static void FreeDevices(Stack<EdgeDetector> devices)
{
    foreach (EdgeDetector device in devices)
    {
        device.Stop();
        device.FreeCamBuffers();
    }
    devices.Clear();
}

static int Main(string[] args)
{
    /* Showing the images have a high impact on processing speed.
        For better comparision show_images should be disabled. */
    bool show_images = args.Length > 0 ? true : false;
    Dictionary<MemoryMode, String> memtypes = new Dictionary<MemoryMode, String>();
    Stack<EdgeDetector> devices = new Stack<EdgeDetector>();

    // find all connected cameras
    FindDevices(devices);

    // edge detection processing on all connected cameras
    RunDetection(devices, memtypes, show_images);

    // cleanup
    FreeDevices(devices);

    return 0;
}



工业相机通过OpenCV对图像进行边缘检测的优势

工业相机通过OpenCV进行图像边缘检测具有多重优势,包括但不限于以下几点:

  1. 丰富的算法支持:OpenCV提供了多种经典的边缘检测算法,如Sobel、Canny、Laplacian等,适用于不同场景下的边缘识别需求。这意味着工业相机可以根据特定应用选择最适合的算法,以获得最佳的边缘检测效果。

  2. 高效的实时性能:OpenCV优化了多个边缘检测算法,使其在工业相机实时处理场景下表现出色。这意味着工业相机可以快速、准确地对图像进行边缘检测,适用于实时监控、自动化检测等应用。

  3. 灵活的参数设置:OpenCV的边缘检测算法通常具有可调节的参数,如阈值、卷积核大小等,使得工程师可以根据具体场景和需求进行参数优化,以获得最佳的边缘检测结果。

  4. 跨平台性和易用性:OpenCV是一个跨平台的开源库,可以在多种操作系统上运行,并提供易于使用的API和文档。这为工业相机的开发和部署提供了便利,同时也为算法调试和优化提供了支持。

  5. 结合其他图像处理功能:OpenCV不仅提供边缘检测算法,还包含了丰富的图像处理功能,如滤波、形态学操作等。工业相机可以结合这些功能与边缘检测相互配合,实现更复杂的图像处理任务。

综上所述,工业相机通过OpenCV进行图像边缘检测具有丰富的算法支持、高效的实时性能、灵活的参数设置、跨平台性和易用性以及结合其他图像处理功能等多重优势,为工业检测和自动化生产等领域提供了强大的图像处理解决方案。

工业相机使用OpenCV对图像进行边缘检测的行业应用

工业相机使用OpenCV对图像进行边缘检测在各个行业都有广泛的应用,包括但不限于以下几个方面:

  1. 制造业:工业相机结合OpenCV的边缘检测功能可用于产品质量检测、表面缺陷检测、尺寸测量等领域。通过边缘检测,可以快速准确地识别产品表面的特征和缺陷,实现自动化的质量控制。

  2. 智能制造:在智能制造领域,工业相机通过OpenCV进行边缘检测可应用于视觉导航、自动化装配等场景,帮助机器人和自动化生产线实现精确定位和操作。

  3. 医疗影像分析:工业相机与OpenCV结合可用于医学影像的边缘特征提取和分析,辅助医生进行疾病诊断和治疗。

  4. 智能交通:在智能交通领域,工业相机通过OpenCV实现的边缘检测可用于车辆识别、行人检测、交通监控等任务,提高交通系统的智能化和安全性。

  5. 农业领域:工业相机结合OpenCV的边缘检测应用于农业领域的果蔬质量检测、病虫害检测、作物生长监测等领域。

  6. 安防监控:工业相机通过OpenCV进行边缘检测可应用于安防监控领域,如人脸识别、行为分析等,帮助提高监控系统的准确性和效率。

综上所述,工业相机使用OpenCV对图像进行边缘检测在制造业、智能制造、医疗、智能交通、农业和安防监控等多个行业领域都具有重要的应用价值,为这些领域提供了高效的图像处理和分析解决方案。

文章来源:https://blog.csdn.net/xianzuzhicai/article/details/135460676
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。