Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存(C#)

  • Baumer工业相机
  • Baumer工业相机保存位深度12/16位图像的技术背景
  • 代码案例分享
    • 1:引用合适的类文件
    • 2:BGAPI SDK在图像回调中联合OpenCV保存Mono12/16图像
    • 3:BGAPI SDK的图像联合OpenCV转换Mono12/16图像并保存
  • 工业相机使用位深度12/16位图像的优点
  • 工业相机使用位深度12/16位图像的行业应用


持之以恒挑战赛

Baumer工业相机

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

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

Baumer工业相机通过使用BGAPI SDK进行开发时,可以联合OpenCVSharp实现位深度为16的图像保存。

Baumer工业相机保存位深度12/16位图像的技术背景

工业相机通常用于需要高质量图像的分析和检查的专业环境中。这些相机被设计用来捕捉16比特的高比特深度的图像,与低比特深度的图像相比,可以捕捉到更大范围的色彩和细节。

保存位深16位图像的工业相机的技术背景涉及几个关键部分。首先,相机的图像传感器必须能够捕捉到高比特深度的图像。这是通过使用高质量的图像传感器来实现的,该传感器能够以每像素16比特的分辨率捕获数据。

其次,相机的电子设备必须能够处理和存储高比特深度的图像数据。这意味着相机需要有一个高速处理器和足够的内存来处理所产生的大量图像数据。

第三,相机的软件必须能够支持16位图像的保存。这意味着相机的固件和软件接口必须被设计成能够处理16位图像所产生的更大的文件尺寸,并且还能与工业标准文件格式如TIFF和RAW兼容。

总的来说,保存16位深度图像的工业相机的技术背景涉及高质量的图像传感器、强大的电子器件和专门的软件的组合,这些都是为了处理捕捉和存储高位深度图像的独特需求。

这里主要描述如何在C#的平台下联合BGAPI SDKOpenCVSharp实现Mono12或者Mono16图像格式的保存功能的核心代码

代码案例分享

本文介绍使用BGAPI SDK对Baumer的工业相机进行开发时,联合BGAPI SDKOpenCVSharp实现Mono12或者Mono16图像格式的保存功能

堡盟相机支持Mono8、Mono12、BGR8等多种像素格式(PixelFormat)——每种格式需对应相应的OpenCV格式。与堡盟相机像素格式对应的OpenCV矩阵类型如下表所示。

如下为核心代码实现步骤:

1:引用合适的类文件

C#环境下核心代码如下所示:

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保存Mono12/16图像

下面为在在C#环境开启相机连接相机后通过转换图像格式实现Mono12或者Mono16图像格式保存的核心代码。

如下所示:

SystemList
Open a System
Get the InterfaceList and fill it Open an Interface
Get the DeviceList and fill it
Open a Devicevoid 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 againmBufferFilled.QueueBuffer();}else{#region//获取当前FrameIDFrameIDInt = (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;#endregionlong currenttime = (long)mBufferFilled.Timestamp;                   DateTime sdasd = GetTime(currenttime, true);#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);Cv2.ImWrite(saveimagepath, matgray);}                      if (mBufferFilled.PixelFormat.Contains("Mono12")){//OpenCvSharp.Mat imOriginal = new OpenCvSharp.Mat((int)mBufferFilled.Height, (int)mBufferFilled.Width, MatType.CV_8UC1, (IntPtr)mBufferFilled.MemPtr);//OpenCvSharp.Mat imConverted = new OpenCvSharp.Mat(imOriginal.Rows, imOriginal.Cols, MatType.CV_16UC1); Cv2.ConvertScaleAbs(imOriginal, imConverted, 1, 0);saveimagepath = pImgFileDir + "\\" + strtime + "-Mono16.png";OpenCvSharp.Mat imOriginal = new OpenCvSharp.Mat((int)mBufferFilled.Height, (int)mBufferFilled.Width, MatType.CV_16UC1,(IntPtr)mBufferFilled.MemPtr, (int)mBufferFilled.Width * 2);imOriginal.ConvertTo(imOriginal, MatType.CV_16UC1, 16.0);//Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(imOriginal);//用mat转换为bitmapCv2.ImWrite("cv_Mono12_as_Mono16_image.png", imOriginal);Cv2.ImWrite(saveimagepath, imOriginal);}bSaveImg = false;//变量控制单次保存图像}#endregion#region//OPENCV对灰度图像进行直方图均衡化(不用)//OpenCvSharp.Mat Matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat                 //Mat Qualized = new Mat();//Cv2.EqualizeHist(Matgray, Qualized); // 对灰度图像进行直方图均衡化//Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(Qualized);//用mat转换为bitmap                 #endregion#region//bitmap的图像数据复制pBitmapBitmap clonebitmap = (Bitmap)bitmap.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);#endregionclonebitmap.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:BGAPI SDK的图像联合OpenCV转换Mono12/16图像并保存

下面为在在C#环境开启相机连接相机后通过转换图像格式实现Mono12或者Mono16图像格式保存的核心代码。

如下所示:

if (mBufferFilled.PixelFormat.Contains("Mono12"))
{saveimagepath = pImgFileDir + "\\" + strtime + "-Mono16.png";OpenCvSharp.Mat imOriginal = new OpenCvSharp.Mat((int)mBufferFilled.Height, (int)mBufferFilled.Width, MatType.CV_16UC1,(IntPtr)mBufferFilled.MemPtr, (int)mBufferFilled.Width * 2);imOriginal.ConvertTo(imOriginal, MatType.CV_16UC1, 16.0);Cv2.ImWrite("cv_Mono12_as_Mono16_image.png", imOriginal);Cv2.ImWrite(saveimagepath, imOriginal);
}

Bitmap目前已经不支持12位的图像,Mono图像只能转为8位或者16位.

工业相机使用位深度12/16位图像的优点

更好的图像细节:12/16位图像可以捕捉到更多的细节和颜色深度,提供更高的图像质量。

更广泛的动态范围:12/16位图像允许在明暗变化很大的场景中捕捉到更多的细节和颜色,以及更好的光线控制。

更低的噪声:采用12/16位图像可以减少噪声,使得图像更加清晰。

更好的后期处理:12/16位图像可以在后期处理中更灵活地进行平滑、增加对比度和其他调整。

因此,工业相机使用12/16位图像可以提供更高质量的图像,更好的细节和颜色控制,并为后期处理提供更多的灵活性。

工业相机使用位深度12/16位图像的行业应用

  1. 医疗成像:工业相机可用于各种医疗成像应用,例如X射线成像,MRI和CT扫描。这些应用需要16位图像位深度来提供高质量的成像结果。

  2. 汽车制造:工业相机可以用于汽车制造中的各种应用,例如质量控制和检查。这些应用需要高分辨率和16位图像位深度,以检测并处理微小的缺陷或问题。

  3. 机器人视觉:工业相机的高速度和高精度对于机器人视觉应用非常重要。机器人需要能够识别和定位目标,同时能够处理16位图像位深度的高质量图像。

  4. 智能交通系统:工业相机也可以用于智能交通系统中。例如,交通监控摄像机需要高质量的图像以便能够识别和跟踪车辆,行人和其他交通标志。

总之,工业相机使用16位图像位深度的行业应用范围非常广泛,它们可以用于各种不同的应用,以提供高质量的成像结果和精确的图像处理功能。

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存(C#)相关推荐

  1. Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCVSharp进行图像简单拼接并显示固定数量保存和持续保存(C#)

    Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCVSharp进行图像简单拼接并显示固定数量保存和持续保存(C#) Baumer工业相机 Baumer工业相机SDK联合OpenCVS ...

  2. Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C++)

    Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C++) Baumer工业相机 Baumer工业相机BGAPISDK中控制变焦镜头的技术背景 代码案例分享 ...

  3. Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C#)

    Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C#) Baumer工业相机 Baumer工业相机BGAPISDK中控制变焦镜头的技术背景 代码案例分享 ...

  4. Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的直方图算法增强(C++)

    Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的直方图算法增强(C++) Baumer工业相机 Baumer工业相机使用图像算法增加图像的技术背景 Baumer工业相机 ...

  5. Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon将图像中的六一快乐字体提取出来(C#)

    Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon将图像中的六一快乐字体提取出来(C#) Baumer工业相机 Baumer工业相机使用Halcon图像算法的技术背景 Baume ...

  6. Baumer工业相机堡盟工业相机如何使用BGAPI SDK解决两个万兆网相机的同步采集不同步的问题

    Baumer工业相机堡盟工业相机如何使用BGAPI SDK解决两个万兆网相机的同步采集不同步的问题 Baumer工业相机 Baumer工业相机图像数据转为Bitmap的技术背景 Baumer同步异常 ...

  7. Baumer工业相机堡盟工业相机如何通过BGAPISDK显示彩色相机和黑白相机的图像(C#)

    Baumer工业相机堡盟工业相机如何通过BGAPISDK里显示彩色相机和黑白相机的图像(C#) Baumer工业相机 Baumer工业相机的彩色和黑白成像的技术背景 Baumer工业相机通过BGAPI ...

  8. Baumer工业相机堡盟工业相机如何通过BGAPISDK使用短曝光功能(C#)

    Baumer工业相机堡盟工业相机如何通过BGAPISDK使用短曝光功能(C#) Baumer工业相机 Baumer工业相机BGAPISDK和短曝光功能的技术背景 Baumer工业相机通过BGAPISD ...

  9. Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C#)

    Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C#) Baumer工业相机 Baumer工业相机BGAPISDK和多帧采集模式的技术背景 Baumer工业相机通过BGAPI ...

最新文章

  1. BZOJ2298 [HAOI2011]problem a 【dp】
  2. Mysql备份工具xtrabackup 8 安装图解
  3. shell模拟php多进程从redis获取数据(多个库)
  4. 配置phoenix连接hbase_Phoenix视图映射
  5. 如何在mac上编写java程序_在mac系统上安装Eclipse,编写java程序
  6. shrio反序列漏洞修复_Apache Shiro Java 反序列化漏洞分析
  7. WPF DataGrid 样式分享
  8. 搭建VUE应用的时候,fsevents报错问题
  9. 腾讯视频弹幕爬取----------之亲爱的,热爱的
  10. Linux nanomsg tcp sub pub
  11. Carsim应用:LKA车道保持辅助系统(LQR算法推导)
  12. Node.js潮牌官网 毕业设计-附源码 010955
  13. 【青龙面板】快手JS版脚本
  14. xssgame第九关至第十关
  15. 阿里测试工程师聊:软件测试需要学什么?
  16. 物料编码的方法与技术
  17. 【毕业设计】基于超声波与红外的自动调速风扇系统(代码开源) -物联网 嵌入式 stm32
  18. Golff Lend 借贷重磅上线
  19. 刚买下腾讯云轻量服务器,环境从头到尾安装总结
  20. 自有系统对接 有赞 商城 具体对接流程

热门文章

  1. Python3调用百度翻译API进行英文翻译
  2. 【C语言程序设计】实验 10
  3. Jupyter如何切换工作路径至E盘文件夹
  4. ABAP开发学习总结之一:ABAP入门基本要点
  5. 《STM32单片机开发应用教程(HAL库版)---基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第二章 软件安装与使用
  6. 环形光场光强的slm灰度图产生方法
  7. 菜鸡的2020年腾讯实习笔试
  8. 分享132个ASP源码,总有一款适合您
  9. iPhone游戏开发:使用到的工具和技术
  10. 计算机counta函数怎么用,counta函数的使用方法及实例 看完你就知道了