差不多一个月前,在尝试解决将halcon的图像显示在Qt的窗口界面时,考虑过将halcon的HObject类型转换成qt的QImage类型,结果因为太菜了(网上也找不到类似的例子)而没能成功,具体见原来的文章qt窗口中显示halcon的图像
这两天花了点时间,理清思路,参考网上资料加上自己摸索出来方法然后实践了一下,能实现两种格式的转换(halcon to Qt)并能显示出来,就是转化耗时有点不尽人意。
先说说思路历程:
虽然网上没有找到Hobject和Qimage间转化的例子,但是有很多HObject转Vc或者转opencv类型的例子,
如:
从这些例子中可以学到一些图像转换的思路:
先获取Hobject类型图像的图像数据指针及尺寸大小,再根据目标图像类型格式初始化一个相应大小的数据空间,然后按照一定的格式将HObject图像数据copy到目标图像数据空间,最后使用生成目标图像的函数。(这里大致说下思路,细节在后面写)
从halcon的Hobject图像类型中获取图像数据指针比较简单,问题是如何图像数据里面的值给复制到目标图像数据空间的对应位置,这就得弄清Hobject图像数据的存储格式和数据类型,以及QImage图像数据的存储格式和数据类型。
首先了解下HObject图像(像素?)的数据类型:
有byte, (u)int1/2/4,real, complex, direction, cyclic, vector_field这些,但一般都是byte类型,这里做图像转换也是用的byte这种类型。
HObject图像的byte类型的特点:(这里都是按自己理解编的)每个像素的一个通道的灰度值用byte类型来存储(byte类型,即一个字节,为8bit,也就是说图像的位深为8位,可以表示范围0到255的值,所以bmp图像灰度值的范围也是0~255),比如三通道图就是每个像素点都有rgb三个通道的灰度值,每个通道用一个byte来存值,单通道图的话每个像素就一个byte来存值。
然后了解下生成QImage图像需要的数据格式:
QImage 图像格式小结 这篇文章对我的帮助很大,整篇文章内容都有用 ,看完对我启发很大。
比如要用到的根据公式: W = ( w * bitcount + 31 )/32 * 4 计算得到的W是QImage图像每行的字节数。
比如三通道和单通道需要不同的图像格式:
QImage::Format_RGB888,存入格式为R, G, B 对应 0,1,2
QImage::Format_Indexed8,需要设定颜色表,QVector<QRgb>
以及,采用指针取值,行扫的方式对每个像素处理,还解决了数据补齐的问题。
然后是如何从图像数据生成QImage:
参考了这篇文章【QT】处理图像数据 中:
通过数据流读取:
QImage::QImage(uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction