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

简介: Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C++)

Baumer工业相机


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


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


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


Baumer工业相机NEOAPI SDK是用于Baumer工业相机的一款最新的软件开发工具包(SDK)。它为开发人员提供了一系列API和工具,用于与Baumer工业相机进行通信和控制,控制方式极为便捷类似Halcon的相机助手类控制方式。


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


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


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


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


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


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


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


代码案例分享


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


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


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


1:引用合适的类文件


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

#include <stdio.h>
#include <iostream>
#include <opencv2/highgui.hpp>
#include "neoapi/neoapi.hpp"


2:NEOAPI SDK联合OpenCV进行图像采集保存Mono12/16图像


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


如下所示:

#include <stdio.h>
#include <iostream>
#include <opencv2/highgui.hpp>
#include "neoapi/neoapi.hpp"
NeoAPI::Cam camera = NeoAPI::Cam();
camera.Connect();
camera.f().ExposureTime.Set(10000);
int width = static_cast<int>(camera.f().Width);
int height = static_cast<int>(camera.f().Height);
void CGigeDemoDlg::OnBnClickedBtnSaveMono16Image()
{
  // TODO: 在此添加控件通知处理程序代码
  if (camera.IsConnected())
  {   
    CString MATimagepath = pImgFileDir + "\\" + strtime + "-" + imageid + "-Mon16.bmp";
    if ((camera.f().GetPixelFormat() == "Mono12")|(camera.f().GetPixelFormat() == "Mono16"))
    {
      cv::Mat* imOriginal = new cv::Mat(height ,width ,CV_16UC1,(char*)camera.GetImageData());                  
      cv::Mat imOriginal.ConvertTo(imOriginal, CV_16U, 64.0);
      cv::imwrite(MATimagepath , *imOriginal);
      delete imOriginal;
    }
  } 
}


3:NEOAPI SDK的图像联合OpenCV转换Mono12/16图像并保存


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


如下所示:

int width = static_cast<int>(camera.f().Width);
int height = static_cast<int>(camera.f().Height);
if (camera.f().PixelFormat.Contains("Mono12"))
{
    CString saveimageMono8path = pImgFileDir + "\\" + strtime + "-Mono8.png";
    CString saveimageMono16path = pImgFileDir + "\\" + strtime + "-Mono16.png";
    cv::Mat* img= new cv::Mat(height ,width ,CV_16UC1,(char*)camera.GetImageData());      
    img.SaveImage(saveimageMono16path);
  image.SaveImage(saveimageMono8path);  
}


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


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


工业相机使用位深度为12/16位图像的优点主要体现在以下两个方面:


  • 更好的图像细节:12/16位图像可以捕捉到更多的细节和颜色深度,提供更高的图像质量。由于每个像素的比特位数更多,因此可以表达图像细节的能力更强,这个像素的颜色值更加丰富、分的更细,颜色深度就更深。此外,它可以更精确地捕捉每个像素的亮度和颜色值,相较于8位图像,能够捕捉到更丰富的颜色层次和更详细的图像信息。
  • 更广泛的动态范围:12/16位图像允许在明暗变化很大的场景中捕捉到更多的细节和颜色,以及更好的光线控制。


然而,虽然提高位深度可以增强测量的精度,但是也可能会降低系统的速度,并且提高了系统集成的难度(例如线缆增加,尺寸变大),因此在选择时需要慎重考虑。


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


工业相机使用位深度为12/16位图像的行业应用非常广泛,以下是一些常见的应用场景:


  • 半导体制造:在半导体制造过程中,需要对微小的芯片进行高精度的检测和测量。使用12/16位图像可以提供更高的精度和更好的细节捕捉能力,从而确保芯片的质量。


  • 光学检测:在光学检测中,需要对物体的形状、颜色、纹理等特征进行高精度的测量和分析。使用12/16位图像可以提高测量的精度和准确性,同时也可以更好地捕捉到物体的细节信息。


  • 机器视觉:在机器视觉应用中,需要对物体进行识别、定位、跟踪等操作。使用12/16位图像可以提高识别的准确性和稳定性,同时也可以更好地捕捉到物体的颜色和纹理信息。


  • 医学影像:在医学影像领域,需要对X光片、CT扫描等影像进行高精度的分析和诊断。使用12/16位图像可以提高影像的质量和准确性,同时也可以更好地捕捉到组织和器官的细节信息。


总之,工业相机使用位深度为12/16位图像的行业应用非常广泛,可以满足各种高精度、高要求的应用场景的需求。

目录
相关文章
|
15天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
39 6
|
1月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
|
17天前
|
编解码 计算机视觉 Python
opencv 图像金字塔(python)
opencv 图像金字塔(python)
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
1月前
|
算法 计算机视觉 C++
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法
|
1月前
|
存储 传感器 算法
相机标定系列---opencv相关标定算子
相机标定系列---opencv相关标定算子
|
1月前
|
存储 计算机视觉 C++
Opencv(C++)学习系列---特征点检测和匹配
Opencv(C++)学习系列---特征点检测和匹配
|
1月前
|
存储 计算机视觉
OpenCV(三十九):积分图像
OpenCV(三十九):积分图像
18 0
|
1月前
|
计算机视觉
OpenCV(三十):图像膨胀
OpenCV(三十):图像膨胀
21 0