Baumer堡盟工业相机BGAPI SDK联合OpenCV进行图像转换三(C++)

简介: Baumer堡盟工业相机BGAPI SDK联合OpenCV进行图像转换三(C++)

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

df143b7eabaf43c68fb89f96ff42e516.png

从如下示例可以看出,可直接处理像素格式的图像,无需转换,非常简单。

示例:Mono8


pDevice->GetRemoteNode("PixelFormat")->SetString("Mono8");
BGAPI2::Buffer * pBufferFilled = pDataStream->GetFilledBuffer(1000);
if (pBufferFilled->GetPixelFormat() == "Mono8")
{
  cv::Mat* imOriginal = new cv::Mat((int)pBufferFilled->GetHeight(),
                                   (int)pBufferFilled->GetWidth(),
                                   CV_8UC1,
                                   (char *)pBufferFilled->GetMemPtr();
  cv::imwrite("cv_Mono8_image.png", *imOriginal);
  delete imOriginal;
}
pBufferFilled->QueueBuffer();

示例:BGR8

OpenCV中标准的颜色像素格式为BGR,每个颜色通道为8位(CV_8UC3)。相机中与之对应的像素格式设为BGR8(也可以设为BGR8Packed)。

pDevice->GetRemoteNode("PixelFormat")->SetString("BGR8");
BGAPI2::Buffer * pBufferFilled = pDataStream->GetFilledBuffer(1000);
if ((pBufferFilled->GetPixelFormat() == "BGR8") || 
    (pBufferFilled->GetPixelFormat() == "BGR8Packed"))
{
  cv::Mat* imOriginal = new cv::Mat((int)pBufferFilled->GetHeight(),
                                   (int)pBufferFilled->GetWidth(),
                                   CV_8UC3,
                                   (char *)pBufferFilled->GetMemPtr();
  cv::imwrite("cv_BGR8_image.png", *imOriginal);
  delete imOriginal;
}
pBufferFilled->QueueBuffer();

将像素格式转换为16位OpenCV矩阵

某些相机支持12位像素格式(Mono12、RGB12)。将数据储存在16位OpenCV矩阵类型中会导致输出图像比预期暗很多。为了将12位像素格式转换成16位OpenCV矩阵,堡盟GAPI缓冲区中的数据需要通过OpenCV ConvertTo()函数平移4位(或乘以16)。


同样地,Mono10等10位像素格式可以通过将数据平移2位(或乘以64)进行转换。


警告:由于一个指针刚被传输到堡盟GAPI缓冲区的数据中,初始数据已经被更改。


pDevice->GetRemoteNode("PixelFormat")->SetString("Mono12");
BGAPI2::Buffer * pBufferFilled = pDataStream->GetFilledBuffer(1000);
if (pBufferFilled->GetPixelFormat() == "Mono12")
{
  cv::Mat* imOriginal = new cv::Mat((int)pBufferFilled->GetHeight(),
                                   (int)pBufferFilled->GetWidth(),
                                   CV_16UC1,
                                   (char *)pBufferFilled->GetMemPtr();
  imOriginal.ConvertTo(imOriginal, Emgu.CV.CvEnum.DepthType.Cv16U, 64.0);
  cv::imwrite("cv_Mono12_as_Mono16_image.png", *imOriginal);
  delete imOriginal;
}
pBufferFilled->QueueBuffer();
目录
相关文章
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
709 7
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
405 1
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
2773 3
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
217 12
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
177 3
|
计算机视觉 C++
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
202 0
|
开发工具 对象存储 Android开发
对象存储oss使用问题之C++使用OSS SDK时遍历OSS上的文件时崩溃如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
808 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
11月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
423 12
|
9月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
229 0