Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的线性灰度变换ScaleImage算法增强(C#)

news2024/12/23 19:06:16

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的线性灰度变换算法增强(C#)

  • Baumer工业相机
  • Baumer工业相机使用图像算法增加图像的技术背景
  • Baumer工业相机通过BGAPI SDK联合Halcon使用线性灰度变换增强算法
    • 1.引用合适的类文件
    • 2.BGAPI SDK在图像回调中引用Halcon的线性灰度变换增强算法
    • 3.联合Halcon进行线性灰度变换算法进行图像转换和增强
  • Baumer工业相机使用图像算法增强图像的优势
  • Baumer工业相机使用图像算法增强图像的行业应用

Baumer工业相机

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

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

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

Baumer工业相机使用图像算法增加图像的技术背景

工业相机通常使用各种图像算法来提高其捕获的图像的质量。这些算法旨在提高图像的清晰度、对比度、色彩准确性和整体图像质量。

最常用的算法之一是降噪算法。该算法用于消除图像中可能出现的任何随机噪声或颗粒。另一个流行的算法是图像稳定算法。该算法用于减少由相机抖动引起的模糊现象。

另一个用于工业相机的流行图像算法是边缘增强算法。该算法用于提高图像中边缘的清晰度。它通过检测图像中的边缘,然后增加这些边缘的对比度来工作。

直方图均衡化是另一种用于工业相机的图像算法。该算法通过重新分配像素值以覆盖图像中的整个可用值范围来改善图像的对比度。

总的来说,这些图像算法帮助工业相机捕获清晰和高质量的图像。它们在现代成像系统中起着至关重要的作用,在机器人、显微镜和医学成像等领域至关重要。

本文这里只简单使用Baumer工业相机联合Halcon进行线性灰度变换的图像算法。

Baumer工业相机通过BGAPI SDK联合Halcon使用线性灰度变换增强算法

下面介绍在C#里Baumer工业相机在回调函数里联合Halcon直接进行线性灰度变换图像增强的演示,
先将Bitmap图像转为Halcon的图像Hobject,然后使用Halcon的线性灰度变换函数ScaleImage转换,最后将Hobject图像转换为Bitmap。
线性灰度变换增强算法ScaleImage的功能是:拉开图像的对比度,让图像中黑的地方更黑,亮的地方更亮。

1.引用合适的类文件

代码如下(示例):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BGAPI2;
using System.Runtime.InteropServices;
using System.IO;
using CSCameraDemo.Properties;
using System.Globalization;
using WindowsFormsApplication1;
using System.Threading.Tasks;
using System.Threading;
using System.Drawing.Imaging;

using HalconDotNet;

2.BGAPI SDK在图像回调中引用Halcon的线性灰度变换增强算法

代码如下(示例),C#调用代码如下所示:

void mDataStream_NewBufferEvent(object sender, BGAPI2.Events.NewBufferEventArgs mDSEvent)
{
    try
    {
        BGAPI2.Buffer mBufferFilled = null;              
        mBufferFilled = mDSEvent.BufferObj;
        if (mBufferFilled == null)
        {
            MessageBox.Show("Error: Buffer Timeout after 1000 ms!");
        }
        else if (mBufferFilled.IsIncomplete == true)
        {
            //MessageBox.Show("Error: Image is incomplete!");
            //queue buffer again
            mBufferFilled.QueueBuffer();
        }
        else
        {
            #region//获取当前FrameID
            FrameIDInt = (int)mBufferFilled.FrameID;
            OnNotifySetFrameID(FrameIDInt.ToString());
            #endregion

            //将相机内部图像内存数据转为bitmap数据
            System.Drawing.Bitmap bitmap  = new System.Drawing.Bitmap((int)mBufferFilled.Width, (int)mBufferFilled.Height, (int)mBufferFilled.Width,
                System.Drawing.Imaging.PixelFormat.Format8bppIndexed, (IntPtr)((ulong)mBufferFilled.MemPtr + mBufferFilled.ImageOffset));
                                      
            #region//Mono图像数据转换。彩色图像数据转换于此不同
            System.Drawing.Imaging.ColorPalette palette = bitmap.Palette;
            int nColors = 256;
            for (int ix = 0; ix < nColors; ix++)
            {
                uint Alpha = 0xFF;
                uint Intensity = (uint)(ix * 0xFF / (nColors - 1));
                palette.Entries[ix] = System.Drawing.Color.FromArgb((int)Alpha, (int)Intensity, (int)Intensity, (int)Intensity);
            }
            bitmap.Palette = palette;
            #endregion


            #region//回调函数保存图像功能
            if (bSaveImg)
            {
                //使用bitmap自带函数保存
                string strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");
                string saveimagepath = pImgFileDir  +"\\"+ strtime + ".jpg";
                bitmap.Save(saveimagepath, System.Drawing.Imaging.ImageFormat.Bmp);
          
                bSaveImg = false;//变量控制单次保存图像
            }
            #endregion

           //将Bitmap数据转为Halcon的Hobject
			Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 
			BitmapDat srcBmpData=bmp.LockBits(rect,ImageLockMode.ReadOnly,
			PixelFormat.Format8bppIndexed);
			HOperatorSet.GenImage1(out image, "byte", bmp.Width, bmp.Height, srcBmpData.Scan0);
			bmp.UnlockBits(srcBmpData);

            #region//对灰度图像进行线性灰度变换算法增强   
            Hobject ImageScaled;			
			HOperatorSet.ScaleImage (Image, ImageScaled, 1.5, -150)
			HObjectConvertBpp8(ImageScaled,out bmp);
            #endregion


            #region//bitmap的图像数据复制pBitmap
            Bitmap clonebitmap = (Bitmap)bmp.Clone();
            BitmapData data = clonebitmap.LockBits(new Rectangle(0, 0, clonebitmap.Width, clonebitmap.Height), ImageLockMode.ReadOnly, clonebitmap.PixelFormat);
            clonebitmap.UnlockBits(data);
            pBitmap = clonebitmap;
            #endregion
            #region//将pBitmap图像数据显示在UI界面PictureBox控件上
            prcSource.X = 0;prcSource.Y = 0;
            prcSource.Width = (int)mBufferFilled.Width;prcSource.Height = (int)mBufferFilled.Height;
            System.Drawing.Graphics graph = System.Drawing.Graphics.FromHwnd(pictureBoxA.Handle);
            graph.DrawImage(pBitmap, prcPBox, prcSource, GraphicsUnit.Pixel);
            #endregion

            clonebitmap.Dispose(); //清除临时变量clonebitmap所占内存空间
            mBufferFilled.QueueBuffer();

        }
    }
    catch (BGAPI2.Exceptions.IException ex)
    {
        {
            string str2;
            str2 = string.Format("ExceptionType:{0}! ErrorDescription:{1} in function:{2}", ex.GetType(), ex.GetErrorDescription(), ex.GetFunctionName());
            MessageBox.Show(str2);
        }
    }
    return;
}


private static void HObjectConvertBpp8(HObject image, out Bitmap res)
{
	try
	{
		HTuple hpoint, type, width, height;

		const int Alpha = 255;
		int[] ptr = new int[2];
		HOperatorSet.GetImagePointer1(image, out hpoint, out type, out width, out height);

		res = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
		ColorPalette pal = res.Palette;
		for (int i = 0; i <= 255; i++)
		{
			pal.Entries[i] = Color.FromArgb(Alpha, i, i, i);
		}
		res.Palette = pal;
		Rectangle rect = new Rectangle(0, 0, width, height);
		BitmapData bitmapData = res.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
		int PixelSize = Bitmap.GetPixelFormatSize(bitmapData.PixelFormat) / 8;
		ptr[0] = bitmapData.Scan0.ToInt32();
		ptr[1] = hpoint.I;
		if (width % 4 == 0)
			CopyMemory(ptr[0], ptr[1], width * height * PixelSize);
		else
		{
			for (int i = 0; i < height - 1; i++)
			{
				ptr[1] += width;
				CopyMemory(ptr[0], ptr[1], width * PixelSize);
				ptr[0] += bitmapData.Stride;
			}
		}
		res.UnlockBits(bitmapData);
	}
	catch(Exception ex)
	{
		res = null;
		throw ex;
	}
}



3.联合Halcon进行线性灰度变换算法进行图像转换和增强

C#调用代码如下所示:

//将Bitmap数据转为Halcon的Hobject
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 
BitmapDat srcBmpData=bmp.LockBits(rect,ImageLockMode.ReadOnly,
PixelFormat.Format8bppIndexed);
HOperatorSet.GenImage1(out image, "byte", bmp.Width, bmp.Height, srcBmpData.Scan0);
bmp.UnlockBits(srcBmpData);

   
#region//对灰度图像进行线性灰度变换算法增强   
Hobject ImageScaled;			
HOperatorSet.ScaleImage (Image, ImageScaled, 1.5, -150)
HObjectConvertBpp8(ImageScaled,out bmp);
#endregion

#endregion

private static void HObjectConvertBpp8(HObject image, out Bitmap res)
{
	try
	{
		HTuple hpoint, type, width, height;

		const int Alpha = 255;
		int[] ptr = new int[2];
		HOperatorSet.GetImagePointer1(image, out hpoint, out type, out width, out height);

		res = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
		ColorPalette pal = res.Palette;
		for (int i = 0; i <= 255; i++)
		{
			pal.Entries[i] = Color.FromArgb(Alpha, i, i, i);
		}
		res.Palette = pal;
		Rectangle rect = new Rectangle(0, 0, width, height);
		BitmapData bitmapData = res.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
		int PixelSize = Bitmap.GetPixelFormatSize(bitmapData.PixelFormat) / 8;
		ptr[0] = bitmapData.Scan0.ToInt32();
		ptr[1] = hpoint.I;
		if (width % 4 == 0)
			CopyMemory(ptr[0], ptr[1], width * height * PixelSize);
		else
		{
			for (int i = 0; i < height - 1; i++)
			{
				ptr[1] += width;
				CopyMemory(ptr[0], ptr[1], width * PixelSize);
				ptr[0] += bitmapData.Stride;
			}
		}
		res.UnlockBits(bitmapData);
	}
	catch(Exception ex)
	{
		res = null;
		throw ex;
	}
}


呈现效果如下所示:
(未使用线性灰度变换图像算法)
未使用直方图均衡化图像算法
(使用线性灰度变换图像算法)
在这里插入图片描述

Baumer工业相机使用图像算法增强图像的优势

  1. 提高图像质量: 随着图像算法的使用,工业相机可以产生高度详细和清晰的图像。这些算法可以减少噪音,突出边缘,并增加对比度,以产生更好的图像质量。

  2. 增加准确性:图像算法也可以提供高度准确的测量和数据。通过使用边缘检测和模式识别等图像分析技术,工业相机可以更精确地识别和测量物体。

  3. 成本效益: 通过提高图像质量和准确性,工业相机可以减少对人工检查的需求,从而降低与质量控制和产品拒绝相关的成本。

  4. 效率提高: 通过使图像分析过程自动化,工业相机可以提高产量,减少周期时间,使生产线更有效率。

  5. 更好的决策: 随着图像质量和准确性的提高,工业相机可以为决策者提供高度详细和可靠的数据,使他们能够对生产过程和质量控制做出更明智的决定。

Baumer工业相机使用图像算法增强图像的行业应用

带有图像算法的工业相机被广泛应用于各个行业,用于增强图像,以提高产品质量、安全和效率。以下是其应用的一些例子:

  1. 制造业: 具有图像算法的工业相机用于检查装配线的缺陷,检查产品的质量,并确保遵守安全标准。它们还可用于在制造过程中检查零件,这有助于及早发现缺陷,防止昂贵的生产延误。

  2. 汽车行业: 在汽车行业,具有图像算法的工业相机被广泛用于安全检查,检测汽车零部件的缺陷,并确保司机和乘客的安全。它们还可用于事故发生后的损害评估。

  3. 航空航天: 工业相机在航空航天工业中用于检查卫星、火箭和其他航天器在组装期间和组装后的部件。图像算法可以帮助检测关键部件的缺陷和故障,以确保宇航员的安全和太空任务的成功。

  4. 医疗:具有图像算法的工业相机被用于检测和诊断疾病和医疗状况的医疗应用。它们还被用于医学研究、分析和监测病人的健康。

  5. 农业: 工业相机可用于监测作物的生长,检查农产品的质量,并检测作物的病虫害。图像算法可以帮助早期发现问题,使农民能够采取纠正措施来保护他们的作物。

在所有这些行业中,使用带有图像算法的工业相机大大改善了图像分析的效率和准确性,从而提高了产品质量,增加了安全性,并降低了成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人大金仓亮相国际金融展,打造“金融+产业+生态”创新模式

4月27日&#xff0c;以“荟萃金融科技成果&#xff0c;展现数字金融力量&#xff0c;谱写金融服务中国式现代化新篇章”为主题的2023中国国际金融展圆满落幕。作为已经举办30年的行业盛会&#xff0c;人大金仓再一次重磅亮相&#xff0c;全方位展示国产数据库前沿应用和创新服务…

C/C++开发神器CLion全新发布v2023.1——新软件包管理解决方案

CLion是一款专为开发C及C所设计的跨平台IDE。它是以IntelliJ为基础设计的&#xff0c;包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C&#xff0c;同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CM…

国产仪器 6914CA/6914DA/6914EA/6914CX/6914DX/6914EX数字示波器

6914系列数字示波器将台式示波器的Any Acquire Phosphor技术融入到PXI/PXIe架构中&#xff0c;以模块化的结构形式提供台式示波器的功能和性能。该系列示波器具有6个产品型号&#xff0c;带宽350MHz~1GHz&#xff0c;最高采样率5GSa/s&#xff0c;最大存储深度200Mpts/CH&#…

vue项目将多张图片生成一个gif动图

当前做项目有一个需求是将多张图片生成一个gif动图的形式 类似下面图片几张图片叠加生成一个gif动图 图片涉及工作隐私&#xff0c;就不公开啦 我们要引入一个gif.js的引入包&#xff0c;但是他没有直接引入的方式&#xff0c;只能从官方下载文件包&#xff0c;下载地址&#…

面向航空智能制造的边缘计算光交换技术研究

源自&#xff1a;航空科学技术 作者&#xff1a;赵俊 吴宝锋 徐盛果 孙小菡 摘 要 面向航空智能制造大批量数据采集与传递的实时性要求&#xff0c;提出一种基于异步光分组交换&#xff08;optical packet switching,OPS&#xff09;技术的具有多级管理能力的边缘计算系统…

关于千兆和万兆电口模块,你了解多少?

网络技术的不断发展&#xff0c;使得传输速度的要求越来越高。为了满足这种需求&#xff0c;千兆和万兆电口模块逐渐成为了现代网络设备中的重要组成部分。 一、什么是千兆电口模块&#xff1f; 千兆电口模块是一种用于网络设备之间传输数据的光转电模块&#xff0c;它们可以…

谷粒商城二十四Sentinel限流熔断降级

我们在秒杀服务加的以上所有手段都是为了快&#xff0c;除了快之外&#xff0c;我们还需要保证稳定。 我们即使再快也会有一个极限值&#xff0c;现在假设单机下每秒处理一万个单&#xff0c;这已经是超高的处理能力了&#xff0c;秒杀服务上了五台服务器&#xff0c;有三台掉…

【直播预告】“知·道关基 行·筑安全”关基保护线上研讨会将于5月5日、5月9日开启

随着信息化建设的不断发展&#xff0c;网络安全形势日趋严峻&#xff0c;围绕网络空间主导权和控制权的竞争加剧&#xff0c;全球网络安全博弈日趋激烈。 关键信息基础设施是数字经济社会运行的神经中枢&#xff0c;事关国家网络安全和数据安全&#xff0c;日益成为国家网络空…

BetaFlight统一硬件配置文件研读之serial命令

BetaFlight统一硬件配置文件研读之serial命令 1. 源由2. 代码分析3. 实例分析4. 配置情况5. 参考资料 统一硬件配置文件的设计是一种非常好的设计模式&#xff0c;可以将硬件和软件的工作进行解耦。 1. 源由 cli命令中serial是对UART串口的配置&#xff0c;通常情况下BetaFli…

信创赛道全国二等奖!创邻科技国产化解决方案再获佳绩

4月27日&#xff0c;第六届数字中国建设峰会在福建省福州市开幕。本届峰会以“加快数字中国建设&#xff0c;推进中国式现代化”为主题&#xff0c;以宣传贯彻落实《数字中国建设整体布局规划》为主线&#xff0c;集中展示数字中国建设最新成果&#xff0c;分享发展经验&#x…

C++题解:静态区间最大值

题目链接 P3865 ST 表 题目描述 这是一道 ST 表经典题——静态区间最大值 请注意最大数据时限只有 0.8s&#xff0c;数据强度不低&#xff0c;请务必保证你的每次查询复杂度为 O ( 1 ) O(1) O(1)。若使用更高时间复杂度算法不保证能通过。 如果您认为您的代码时间复杂度正…

java版企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

ansible常见概念总结

目录 1、play和playbook和role 2、幂等性 3、清单 4、配置文件(ansible.cfg) 5、变量 5.1 在playbook中使用变量&#xff1a; 5.2 在playbook中使用变量文件&#xff1a; 6、事实 7、循环 8、处理程序 9、块 10、动态清单文件 11、角色 1、play和playbook和role …

本地事务,分布式事务(Seata)

本地事务 四大特性ACID A:原子性(Atomicity)&#xff1a;事务是不可分割的最小操作但愿&#xff0c;要么全部成功&#xff0c;要么全部失败 C:一致性(Consistency)&#xff1a;事务完成时&#xff0c;必须使所有数据都保持一致状态 l:隔离性(Isolation)&#xff1a;数据库系统…

[架构之路-188]-《软考-系统分析师》-3-操作系统 - 图解页面替换算法LRU、LFU

目录 一、内存置换算法的缘由 二、算法详解 2.1 最佳页面置换算法&#xff08;OPT&#xff09; 》 理论上的最优&#xff0c;实际无法保证 2.2 先进先出置换算法&#xff08;FIFO&#xff09;-- 按加载时间/最早访问时间排序 2.3 最近最久未使用的置换算法&#xff08;L…

JDK、JRE 和 JVM 之间的区别

虚拟机 JVM&#xff08;Java Virtual Machine&#xff09;是一个抽象机器。之所以称为虚拟机&#xff0c;是因为它在物理上并不存在。它是一个规范&#xff0c;它提供了一个可以在其中执行 Java 字节码的运行时环境。它还可以运行那些用其他语言编写并编译为 Java 字节码的程序…

c++详解之右值引用

右值引用&#xff1a; 右值引用是C11引入的一个新特性&#xff0c;它允许我们显式地将一个表达式标记为右值&#xff0c;从而可以使用移动语义进行优化。 在C中&#xff0c;每个表达式都是要么是左值&#xff0c;要么是右值。左值是指可以取地址的表达式&#xff0c;例如变量…

linux 系统下gcc

linux c gcc gcc编译可以执行4步骤&#xff1a;预处理、编译、汇编、链接 预处理 gcc -E hello.c----->hello.i 展开宏、头文件&#xff0c;替换条件编译&#xff0c;删除注释、空行、空白 编译 gcc -S hello.i------>hello.s 检查语法规范 汇编 gcc -c hello.…

网络安全行业就职岗位有哪些?

网络安全作为目前最火的行业之一&#xff0c;它的细分方向很多。下面介绍一下网络安全主要的方向岗位有哪些&#xff0c;以及职责是什么&#xff1f; 一、安全规划与设计方向 岗位名称&#xff1a;系统安全需求分析师。 岗位职责&#xff1a;负责对目标对象需要达到的安全目标…

DIN11 FVI频率脉冲信号转电压电流信号隔离转换模块变换器

主要特性 将单位脉冲信号转换成直流电压或电流信号。 精度等级&#xff1a;0.1 级、0.2 级、0.5 级。产品出厂前已检验校正&#xff0c;用户可以直接使用。 国际标准信号输入: 0-5KHz/0-10KHz/1-5KHz等 0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 …