Halcon HImage 与 Qt QImage 的相互转换

Halcon HImage 与 Qt QImage 的相互转换

以前一直是用 OpenCV 开发机器视觉算法,最近由于某些机缘开始接触学习 Halcon。Halcon 确实是功能强大,用 Halcon 写算法比 OpenCV 方便了太多。但是 Halcon 与OpenCV一样,专注于视觉算法,如果要开发软件界面或者与其他程序交互,Halcon 就不是很擅长了。所以我还是决定用 C++ Qt 做我的程序,只在需要视觉算法的地方用Halcon 提供的算子。今天花了半天时间研究了如何在 Halcon 和 Qt 间传递图像数据。

原理讲解

Qt 中用 QImage 来存放图像数据,Halcon 中则是 HImage。对于灰度图像,这两个类的存储方式类似,都是一个大数组。但是对于彩色图像,存储方式就有很大不同了。

QImage 中彩色图像的各个分量是交替存储的。比如 RGB32 格式,RGB 三个颜色分量打包成一个 32 bits 的dword,然后像素点按照 row major 的方式依次存储在内存中。QImage 支持的彩色图像的种类很多,比如 RGB888、RGB555、RGB565、RGB32 等。我的代码实现中只支持 RGB888 和 RGB32 这两种。其余的因为很少能用到,所以暂时先不考虑。

HImage 中彩色图像的各个分量是单独存储的,简单的说就是 RGB 分别存到 3 个数组中。而且 HImage 不支持 Alpha 通道。由于 HImage 与 QImage 在内存中存储彩色图像时的巨大区别,因此这两个类之间很难共享同一个图像数据。所以在下面的代码中都对图像数据进行了拷贝操作。当然如果只是灰度图像的话,是可以共享数据的。在本文的最后我也会简单介绍一下如何共享数据。

HImage -> QImage

我的实现方式是先给 QImage 分配合适的数据空间。然后把 HImage 里面的数据拷贝到 QImage 中。如果是 灰度图像可以用 HImage::GetImagePointer1 获得图像数据的首地址。

void* HImage::GetImagePointer1(HString* Type, Hlong* Width, Hlong* Height);

如果是彩色图像则是用 HImage::GetImagePointer3 来获得图像数据各个颜色分量的首地址。

void HImage::GetImagePointer3(void** PointerRed, void** PointerGreen, 
                              void** PointerBlue, HString* Type, 
                              Hlong* Width, H
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值