Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的伽马变换算法增强(C#)

news2024/11/16 21:30:25

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强(C#)

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

Baumer工业相机

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

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

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

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

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

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

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

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

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

本文这里只简单使用Baumer工业相机进行伽马增强的图像算法。

Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法

下面介绍在C#里Baumer工业相机在回调函数里直接进行图像增强的演示

伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显。

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 OpenCvSharp;
using OpenCvSharp.Dnn;

2.BGAPI SDK在图像回调中引用OpenCV的伽马变换增强算法

代码如下(示例),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);

                //使用opencv进行保存图像
                if (mBufferFilled.PixelFormat == "Mono8")
                {
                    OpenCvSharp.Mat matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat                           
                    matgray.SaveImage("opencv_image.png");
                    Cv2.ImWrite("opencvcv_image_Clone.png", matgray);
                }                      
                bSaveImg = false;//变量控制单次保存图像
            }
            #endregion

            #region//对灰度图像进行伽马变换算法增强
            OpenCvSharp.Mat Matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat                 

			//方法一
 			// Define gamma value
            double gamma = 1.5;
            // Apply gamma transform algorithm
            Mat gammaImage = new Mat();
            Cv2.Pow(Matgray , gamma, gammaImage);
            // Convert image back to 8-bit format
            Mat gammaImage8Bit = new Mat();
            Cv2.ConvertScaleAbs(gammaImage, Qualized);



			//方法二                                
			// Define the gamma value
			double gamma = 0.5;
			// Apply the gamma transform algorithm to the image
			Mat gammaTransformedImage = new Mat(Matgray.Rows, Matgray.Cols, MatType.CV_8UC1);

			for (int i = 0; i < Matgray.Rows; i++)
			{
    			for (int j = 0; j < Matgray.Cols; j++)
    			{
        			byte pixelValue = Matgray.At<byte>(i, j);
        			byte gammaTransformedPixelValue = (byte)(255 * Math.Pow((pixelValue / 255.0), gamma));
        			gammaTransformedImage.Set<byte>(i, j, gammaTransformedPixelValue);
    			}
			}

			// Show the original and transformed images side by side
			Mat concatImages = new Mat();
			Cv2.HConcat(Matgray, gammaTransformedImage, Qualized);
            
            
            Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(Qualized);//用mat转换为bitmap

            #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;
}

3.OpenCV进行伽马变换算法进行图像增强

伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:

方法一C#调用代码如下所示:

 #region//对灰度图像进行伽马变换算法增强
 OpenCvSharp.Mat Matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat                 
//方法一
// Define gamma value
double gamma = 1.5;
// Apply gamma transform algorithm
Mat gammaImage = new Mat();
Cv2.Pow(Matgray , gamma, gammaImage);
// Convert image back to 8-bit format
Mat gammaImage8Bit = new Mat();
Cv2.ConvertScaleAbs(gammaImage, Qualized);

Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(Qualized);//用mat转换为bitmap
#endregion

方法二C#调用代码如下所示:

 #region//对灰度图像进行伽马变换算法增强
OpenCvSharp.Mat Matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat                 
           
// Define the gamma value
double gamma = 0.5;

// Apply the gamma transform algorithm to the image
Mat gammaTransformedImage = new Mat(Matgray.Rows, Matgray.Cols, MatType.CV_8UC1);

for (int i = 0; i < Matgray.Rows; i++)
{
    for (int j = 0; j < Matgray.Cols; j++)
    {
        byte pixelValue = Matgray.At<byte>(i, j);
        byte gammaTransformedPixelValue = (byte)(255 * Math.Pow((pixelValue / 255.0), gamma));
        gammaTransformedImage.Set<byte>(i, j, gammaTransformedPixelValue);
    }
}

// Show the original and transformed images side by side
Mat concatImages = new Mat();
Cv2.HConcat(Matgray, gammaTransformedImage, Qualized);
            
Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(Qualized);//用mat转换为bitmap

#endregion

呈现效果如下所示:
(未使用伽马变换增强图像算法)
在这里插入图片描述

(使用伽马变换增强图像算法)

在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关文章

Obsidian插件推荐:使用Text Snippets打公式

Obsidian插件推荐&#xff1a;使用Text Snippets打公式 更新&#xff1a;突然发现还有好多可以用的插件&#xff0c;这个可能不是最佳的。比如 Quick Latex for Obsidian和latex suite等 GitHub - ArianaKhit/text-snippets-obsidian: Snippets plugin for obsidian 最近在O…

产品做的好不好,咋判断?

产品做的好不好&#xff0c;咋判断&#xff1f;看优秀公司 怎么拆解分析产品 趣讲大白话&#xff1a;把事情做细致&#xff0c;效果惊人 【趣讲信息科技134期】 **************************** 设计产品是一个复杂学问 市面上很少有成熟的方法 华与华公开了一些&#xff0c;很受…

JavaSE学习进阶day03_03 Object类

第三章 Object类 介绍这个类之前&#xff0c;先回顾一下API&#xff1a; 3.1 概述 java.lang.Object类是Java语言中的根类&#xff0c;即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候&#xff0c;最终找的父类就是Object。 如果一个类没有特别指定父…

二、vue之初体验-案例体验

一、案例体验一&#xff1a;动态展示Hello World数据 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"view…

Java开发 - 配置中心初体验

目录 前言 配置中心介绍 什么是配置中心 Nacos配置中心 数据结构 命名空间 分组 服务 配置中心添加配置 读取配置 本地添加依赖 本地添加配置 测试 结语 前言 前文讲了ELK&#xff0c;ELK说简单也简单&#xff0c;说复杂也复杂&#xff0c;但说实话&#xff0c;微…

【Linux】通过网络版计算器来认识协议

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;再谈协议…

动力节点Springsecurity视频笔记06-13基于数据库的方法授权

6 密码处理 6.1 为什么要加密&#xff1f; csdn 密码泄露事件 泄露事件经过&#xff1a;https://www.williamlong.info/archives/2933.html 泄露数据分析&#xff1a;https://blog.csdn.net/crazyhacking/article/details/10443849 6.2加密方案 密码加密一般使用散列函数&a…

二极管基础知识

1、二极管是常用的半导体器件、由P/N结组成。 有插件类和贴片类两大封装&#xff0c;常用的插件封装有DO-15、D0-27、DO-35、DO-41、TO-220等&#xff0c;常用的贴片封装有SMA、SMB、SMc、s0D-123、SOD-323、TO-277等。 按反向恢复时间分类有&#xff0c;普通〈慢恢复&#xff…

java的validation框架(参数校验)

一.bean validation和hibernate validator参数校验常用约束注解&#xff1a; 空值校验类&#xff1a;Null&#xff0c;NotNull&#xff0c;NotEmpty&#xff0c;NotBlank等 范围校验类&#xff1a;Min&#xff0c;Size&#xff0c;Digits&#xff0c;Future&#xff0c;Negati…

Web Components 技术分析

简括&#xff1a; Web Components 基于四个主要的规范&#xff1a; Custom Elements&#xff0c;Shadow DOM&#xff0c;HTML Templates 和 HTML Imports。 Custom Elements 可以让开发人员创建自定义的 HTML 标签。 Shadow DOM 可以让开发人员将样式和行为封装到自定义元素内…

ASM字节码处理工具原理及实践(二)

0. 相关分享 ASM字节码处理工具原理及实践&#xff08;一&#xff09; 上一篇讲了ASM的简介、导入&#xff0c;以及字节码文件结构&#xff0c;并给出了ASM通过ClassVisitor对class进行访问的基础实战。本篇将进入MethodVisitor&#xff0c;尝试对方法进行访问、生成、转换。…

29.Linux网络编程

把昨天的 第二天的内容说一下&#xff0c;复习一下&#xff0c;第二天 讲的东西不算多&#xff0c;但是有两个作业题来写一写&#xff0c; 大致浏览一下&#xff0c;三次握手 四次挥手的过程&#xff0c;大家有没有画一下&#xff1f; 能画出来吗&#xff1f;同学们&#xff0…

前后端分离开发、Yapi、Swagger、项目部署

一、前后端分离开发 1.1、介绍 前后端分离开发&#xff0c;就是在项目开发过程中&#xff0c;对于前端代码的开发由专门的前端开发人员负责&#xff0c;后端代码则由后端开发人员负责&#xff0c;这样可以做到分工明确、各司其职&#xff0c;提高开发效率&#xff0c;前后端代…

RocketMQ单机环境搭建测试+springboot整合

1.资源下载 官网&#xff1a;下载 | RocketMQ 这里选择使用编译后可以直接用的 下载后解压&#xff1a;略 2.更改配置 主要是更改 conf/broker.conf 的配置&#xff0c;记得添加上下面这几行&#xff0c;否则消息发送失败 autoCreateTopicEnabletrue # 支持自动创建topic…

浅谈日出日落的计算方法以及替代工具 - 日出日落 API

引言 如果你想知道精确的日落日出时间&#xff0c;又或者你想设计一个日出日落时间查询的应用&#xff0c;又或者你只是好奇点进来了&#xff0c;还是可以过来围观一下涨涨知识&#xff0c;今天想跟大家聊一聊的是日出日落的计算方法以及替代工具 - 日出日落 API 。 日出日落…

大数据=SQL Boy,SQL Debug打破SQL Boy 的僵局

网上经常盛传 大数据sql boy&#xff0c;后端开发crud boy&#xff0c;算法工程师调参boy 在大数据领域也工作了好几年了&#xff0c;确实大数据开发&#xff0c;很多工作就是写sql&#xff0c;hive sql、spark sql、flink sql等等sql 一、背景&#xff1a; 但是经常有这样一…

NODEJS安装和vue安装及运行方法以及出现Cannot find module ‘node-sass‘ Require stack问题解决方法

安装nodejs 官网下载&#xff1a; https://registry.npmmirror.com/binary.html?pathnode/选择要下载的版本 一般建议下载msi 选择自己的安装位置一直下一步即可完成 检查一下是否安装成功 打开cmd&#xff0c;输入如下指令 node -vnpm -v输出了版本号就说明安装成功了 …

GCM与CCM的动作过程

CCM CCM&#xff08;Counter with CBC-MAC&#xff09;是一种基于对称加密算法的认证加密&#xff08;Authenticated Encryption&#xff09;模式&#xff0c;结合了CBC-MAC&#xff08;Cipher Block Chaining Message Authentication Code&#xff09;用于消息认证和CTR&…

[java聊天室]服务器发送消息给客户端守护线程同步锁(三)

守护线程 守护线程也称为:后台线程 守护线程是通过普通线程调用setDaemon(boolean on)方法设置而来的,因此创建上与普通线程无异.守护线程的结束时机上有一点与普通线程不同,即:进程的结束.进程结束:当一个进程中的所有普通线程都结束时,进程就会结束,此时会杀掉所有正在运行…

嵌入式Linux(2):将Helloworld驱动编译到内核

文章目录 分析一个例子仿写一个例子&#xff08;需要编译成.ko的&#xff09;写三个文件编辑上一级目录的Makefile文件编辑上一级目录的Kconfig文件make menuconfig进行配置 烧录到开发板上 分析一个例子 例子&#xff1a; source "drivers/redled/Kconfig" config…