文章目录

  • 一、图像格式间相互转换
    • 1.BYTE转QImage、HObject和Mat
    • 2.QImage、HObject和Mat的相互转换
  • 二、图像显示方法
    • 1.QLabel显示QPixmap图像
    • 2.QGraphicsView显示QPixmap
    • 3.Halcon窗口显示HObject图像
  • 总结

一、图像格式间相互转换

1.BYTE转QImage、HObject和Mat

Balser下相机图像数据转换成QImage、Mat、HObject

    QImage Qimg;Mat cvImg;HObject hvImg;//格式转换m_formatConverter.Convert(pylonImage, ptrGrabResult);uchar * din = (uchar *)(pylonImage.GetBuffer()); //数据指针//单通道Momoif(IsMono(pylonImage.GetPixelType())){qDebug()<<"黑白图像";Qimg = QImage(din, ptrGrabResult->GetWidth(), ptrGrabResult->GetHeight(), QImage::Format_Indexed8);cvImg = Mat(ptrGrabResult->GetHeight(),ptrGrabResult->GetWidth(),CV_8UC1,din).clone();GenImage1Extern(&hvImg,"byte",(HTuple)ptrGrabResult->GetWidth(),(HTuple)ptrGrabResult->GetHeight(),(long)din,NULL); //Mono}else{//此处可以根据相机的格式获取特定格式的彩色图像if(IsRGB(pylonImage.GetPixelType())){Qimg = QImage(din, ptrGrabResult->GetWidth(), ptrGrabResult->GetHeight(), QImage::Format_RGB888);cvImg = Mat(ptrGrabResult->GetHeight(),ptrGrabResult->GetWidth(),CV_8UC3,din).clone();GenImageInterleaved (&hvImg,(long)din, "rgb", (HTuple)ptrGrabResult->GetWidth(),(HTuple)ptrGrabResult->GetHeight(), 0, "byte", 0, 0, 0, 0, 8, 0);}}

2.QImage、HObject和Mat的相互转换

QImage转HObject

HObject Widget::QImage2HObject(QImage qimage)
{HObject hv_image;int width = qimage.width();int height = qimage.height();QImage::Format format = qimage.format();if(format == QImage::Format_RGB32 ||format == QImage::Format_ARGB32 ||format == QImage::Format_ARGB32_Premultiplied){GenImageInterleaved(&hv_image,(Hlong)qimage.bits(),"bgrx",qimage.width(),qimage.height(),0,"byte",width, height, 0, 0, 8, 0);}else if(format == QImage::Format_RGB888){GenImageInterleaved(&hv_image,(Hlong)qimage.bits(),"bgr",qimage.width(),qimage.height(),0,"byte",width, height, 0, 0, 8, 0);}else if(format == QImage::Format_Grayscale8 || format == QImage::Format_Indexed8){GenImage1(&hv_image,"byte", width, height, (Hlong)qimage.bits());}return hv_image;
}

HObject转QImage

void HObjectToQImage(HObject hv_image, QImage &qimage)
{HTuple hChannels,htype,hpointer;HTuple width=0;HTuple height=0;ConvertImageType(hv_image,&hv_image,"byte");//将图片转化成byte类型CountChannels(hv_image,&hChannels);       //判断图像通道数if(hChannels[0].I()==1)//单通道图{unsigned char *ptr;GetImagePointer1(hv_image,&hpointer,&htype,&width,&height);ptr=(unsigned char *)hpointer[0].L();qimage= QImage(ptr,width,height,QImage::Format_Indexed8);}else if(hChannels[0].I()==3)//三通道图{unsigned char *ptr3;HObject ho_ImageInterleaved;rgb3_to_interleaved(hv_image, &ho_ImageInterleaved);GetImagePointer1(ho_ImageInterleaved, &hpointer, &htype, &width, &height);ptr3=(unsigned char *)hpointer[0].L();qimage= QImage(ptr3,width/3,height,width,QImage::Format_RGB888);}
}
void rgb3_to_interleaved (HObject ho_ImageRGB, HObject *ho_ImageInterleaved)
{// Local iconic variablesHObject  ho_ImageAffineTrans, ho_ImageRed, ho_ImageGreen;HObject  ho_ImageBlue, ho_RegionGrid, ho_RegionMoved, ho_RegionClipped;// Local control variablesHTuple  hv_PointerRed, hv_PointerGreen, hv_PointerBlue;HTuple  hv_Type, hv_Width, hv_Height, hv_HomMat2DIdentity;HTuple  hv_HomMat2DScale;GetImagePointer3(ho_ImageRGB, &hv_PointerRed, &hv_PointerGreen, &hv_PointerBlue,&hv_Type, &hv_Width, &hv_Height);GenImageConst(&(*ho_ImageInterleaved), "byte", hv_Width*3, hv_Height);//HomMat2dIdentity(&hv_HomMat2DIdentity);HomMat2dScale(hv_HomMat2DIdentity, 1, 3, 0, 0, &hv_HomMat2DScale);AffineTransImageSize(ho_ImageRGB, &ho_ImageAffineTrans, hv_HomMat2DScale, "constant",hv_Width*3, hv_Height);//Decompose3(ho_ImageAffineTrans, &ho_ImageRed, &ho_ImageGreen, &ho_ImageBlue);GenGridRegion(&ho_RegionGrid, 2*hv_Height, 3, "lines", hv_Width*3, hv_Height+1);MoveRegion(ho_RegionGrid, &ho_RegionMoved, -1, 0);ClipRegion(ho_RegionMoved, &ho_RegionClipped, 0, 0, hv_Height-1, (3*hv_Width)-1);ReduceDomain(ho_ImageRed, ho_RegionClipped, &ho_ImageRed);MoveRegion(ho_RegionGrid, &ho_RegionMoved, -1, 1);ClipRegion(ho_RegionMoved, &ho_RegionClipped, 0, 0, hv_Height-1, (3*hv_Width)-1);ReduceDomain(ho_ImageGreen, ho_RegionClipped, &ho_ImageGreen);MoveRegion(ho_RegionGrid, &ho_RegionMoved, -1, 2);ClipRegion(ho_RegionMoved, &ho_RegionClipped, 0, 0, hv_Height-1, (3*hv_Width)-1);ReduceDomain(ho_ImageBlue, ho_RegionClipped, &ho_ImageBlue);OverpaintGray((*ho_ImageInterleaved), ho_ImageRed);OverpaintGray((*ho_ImageInterleaved), ho_ImageGreen);OverpaintGray((*ho_ImageInterleaved), ho_ImageBlue);return;
}

HObject和Mat互转

using namespace cv;
using namespace Halcon;//HObject转Mat
Mat HObject2Mat(HObject Hobj)
{HTuple htCh = HTuple();HString cType;cv::Mat Image;ConvertImageType(Hobj,&Hobj,"byte");CountChannels(Hobj,&htch);Hlong wid = 0;Hlong hgt = 0;if(htch[0].I() == 1){HImage hImg(Hobj);void *ptr = hImg.GetImagePointer1(&cType,&wid,&hgt);int W = wid;int H = hgt;Image.create(H,W,CV_8UC1);unsigned char *pdata = static_case<unsigned char*>(ptr);memcpy(Image.data,pdata,W*H);}else if (htch[0].I()  == 3){void *Rptr;void *Gptr;void *Bptr;HImage hImg(Hobj);hImg.GetImagePointer3(&Rptr,&Gptr,&Bptr,&cType,&wid,&hgt);int W = wid;int H = hgt;Image.create(H,W,CV_8UC3);vector<cv::Mat> VecM(3);VecM[0].create(H,W,CV_8UC1);VecM[1].create(H,W,CV_8UC1);VecM[2].create(H,W,CV_8UC1);unsigned char *R = (unsigned char *)Rptr;unsigned char *G = (unsigned char *)Gptr;unsigned char *B = (unsigned char *)Bptr;memcpy(VecM[2].data,R,W*H);memcpy(VecM[1].data,G,W*H);memcpy(VecM[0].data,B,W*H);cv::merge(VecM,Image);}return Image;
}
//Mat转Hobject
Hobject Mat2Hobject(Mat& image)
{Hobject Hobj = Hobject();int hgt = image.rows;int wid = image.cols;int i;if (image.type() == CV_8UC3){vector<Mat> imgchannel;split(image, imgchannel);Mat imgB = imgchannel[0];Mat imgG = imgchannel[1];Mat imgR = imgchannel[2];uchar* dataR = new uchar[hgt*wid];uchar* dataG = new uchar[hgt*wid];uchar* dataB = new uchar[hgt*wid];for (i = 0; i < hgt; i++){memcpy(dataR + wid*i, imgR.data + imgR.step*i, wid);memcpy(dataG + wid*i, imgG.data + imgG.step*i, wid);memcpy(dataB + wid*i, imgB.data + imgB.step*i, wid);}gen_image3(&Hobj, "byte", wid, hgt, (Hlong)dataR, (Hlong)dataG, (Hlong)dataB);delete[]dataR;delete[]dataG;delete[]dataB;dataR = NULL;dataG = NULL;dataB = NULL;}else if (image.type() == CV_8UC1){uchar* data = new uchar[hgt*wid];for (i = 0; i < hgt; i++)memcpy(data + wid*i, image.data + image.step*i, wid);gen_image1(&Hobj, "byte", wid, hgt, (Hlong)data);delete[] data;data = NULL;}return Hobj;
}

Mat转QImage

QImage cvMat2QImage(const cv::Mat &mat)
{switch ( mat.type() ){// 8-bit  4 channelcase CV_8UC4:{QImage image( (const uchar*)mat.data, mat.cols, mat.rows, static_cast<int>(mat.step), QImage::Format_RGB32 );return image;}// 8-bit  3 channelcase CV_8UC3:{QImage image( (const uchar*)mat.data, mat.cols, mat.rows, static_cast<int>(mat.step), QImage::Format_RGB888 );return image.rgbSwapped();}// 8-bit  1 channelcase CV_8UC1:{static QVector<QRgb>  sColorTable;// only create our color table onceif ( sColorTable.isEmpty() ){sColorTable.resize( 256 );for ( int i = 0; i < 256; ++i ){sColorTable[i] = qRgb( i, i, i );}}QImage image( (const uchar*)mat.data, mat.cols, mat.rows, static_cast<int>(mat.step), QImage::Format_Indexed8 );image.setColorTable( sColorTable );return image;}default:qDebug("Image format is not supported: depth=%d and %d channels\n", mat.depth(), mat.channels());qWarning() << "cvMatToQImage - cv::Mat image type not handled in switch:" << mat.type();break;}return QImage();
}

QImage转Mat

Mat QImage2Mat(QImage image)
{Mat cvMat;qDebug()<<image.format();switch(image.format()){case QImage::Format_ARGB32:case QImage::Format_RGB32:case QImage::Format_ARGB32_Premultiplied:cvMat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.bits(), image.bytesPerLine());break;case QImage::Format_RGB888:cvMat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.bits(), image.bytesPerLine());cv::cvtColor(cvMat, cvMat, CV_BGR2RGB);break;case QImage::Format_Indexed8:cvMat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.bits(), image.bytesPerLine());break;case QImage::Format_Grayscale8:cvMat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.bits(), image.bytesPerLine());break;}return cvMat;
}

二、图像显示方法

目前图像显示使用三种方法,第一种是QImage显示在Qlabel上,第二种方法是使用QGraphicsView来显示QImage,第三种方法是将Halcon的窗口贴在QLabel上,在Halcon的窗口上显示图像。

1.QLabel显示QPixmap图像

    qDebug()<<"显示图像";QPixmap m_pix = QPixmap::fromImage(img);m_pix = m_pix.scaled(ui->lbl_PicShow->size(), Qt::KeepAspectRatio);ui->lbl_PicShow->setPixmap(m_pix);

2.QGraphicsView显示QPixmap

首先用QGraphics View控件,创建QGraphicsScene背景和QGraphicsPixmapItem组件

    m_scene = new QGraphicsScene();ImageItem = new QGraphicsPixmapItem();ImageItem->setFlag(QGraphicsItem::ItemIsMovable,false);m_scene->addItem(ImageItem);ui->PicShow->setScene(m_scene);QPixmap m_pix = QPixmap::fromImage(Qimg);m_pix = m_pix.scaled(ui->PicShow->size(), Qt::KeepAspectRatio);ImageItem->setPixmap(m_pix);

3.Halcon窗口显示HObject图像

首先要在控件上创建Halcon窗口句柄

    OpenWindow(0,0,ui->PicShow->width(),ui->PicShow->height(),m_hLabelID,"visible","",&m_hHalconID);GetImageSize(CurTestImg,&hv_Width,&hv_Height);SetPart(m_hHalconID, 0, 0, hv_Height-1, hv_Width-1);dispOnWindow(CurTestImg,m_hHalconID);

总结

目前图像格式主要是QImage,主要用于Qt的显示和图像操作,HObject是Halcon的格式,图像处理要使用Halcon算法库的,要将图像转成HObject后进行图像处理运算,Mat是OpenCV的图像格式,调用OpenCV的图像算法库,要转换成对应的Mat格式。显示方法上第二种具有图层的概念,可以针对需要对显示的图像和文字进行拖动隐藏等操作。

[视觉实战案例]Qt下BYTE、QImage、HObject、Mat等图像格式的转换和图像显示方法相关推荐

  1. [视觉实战案例]Qt调用Basler网口工业相机SDK实现采图和相机参数设置

    文章目录 1.采图UI显示 2.硬件连接和IP配置 2.1 外触发硬件接线 2.2 IP配置 3.代码实现 4.源码下载 1.采图UI显示 2.硬件连接和IP配置 2.1 外触发硬件接线 根据相机接线 ...

  2. ITIL基础概述与实战案例分析(下)

    上一篇文章主要给大家介绍了"基于ITIL体系的IT部门建设",下面举几个例子,来说明ITIL实施后的效果. ● 基于ITIL体系的IT项目管理 任何项目的上线都会启动对项目运维的环 ...

  3. python智慧城市_智慧城市背景下Python机器学习项目实战案例分享

    首先,何为智慧城市?智慧城市的"智慧"源自何处? 智慧城市的特征在于运用大数据和数字技术提高居民生活质量. 机构获得的数据越全面.越实时,它们就越有能力观测事件发生的详情.分析需求 ...

  4. 【机器学习】线性回归实战案例一:多元素情况下广告投放效果分析步骤详解

    线性回归实战案例一:多元素情况下广告投放效果分析步骤详解 2 线性回归 2.1 案例一:多元素情况下广告投放效果分析 2.1.1 模块加载与绘图布局样式设置 2.1.2 加载数据和数据筛选 2.1.3 ...

  5. 智慧城市背景下Python机器学习项目实战案例分享

    首先,何为智慧城市?智慧城市的"智慧"源自何处? 智慧城市的特征在于运用大数据和数字技术提高居民生活质量. 机构获得的数据越全面.越实时,它们就越有能力观测事件发生的详情.分析需求 ...

  6. Axure 9 实战案例,动态面板的应用 4.1,省市区三级联动下拉菜单(重制简易版)

    前言 Hello!欢迎来到Axure 9 实战案例教程专栏. 本次课程我们继续来学习一下,动态面板的应用.本篇我们来讲解一下,如何绘制省市区联动下拉菜单(重新撰写简易版). 下拉菜单初稿 为了节省时间 ...

  7. 实战案例:横向和纵向的三级下拉菜单需要掌握hover

    实战案例:横向和纵向的三级下拉菜单需要掌握hover 三级下拉 一. 横向三级 二.纵向三级 1.两个ul绝对定位做横向(推荐) 2.两个ul相对定位做竖向(推荐) 3.两个ul绝对定位配合li相对定 ...

  8. Python 毕设精品实战案例——快速索引目录

    1. 基于 python 的银行信贷风险评估 信贷业务又称为信贷资产或贷款业务,是商业银行最重要的资产业务,通过放款收回本金和利息,扣除成本后获得利润,所以信贷是商业银行的主要赢利手段.信用风险是金融 ...

  9. QImage/cv::Mat/HObject的图像格式互相转换,4字节对齐

    QImage/cv::Mat互相转换 QImage ImgChange::cvMat2QImage(const Mat &mat) // Mat 改成 QImage {if (mat.type ...

最新文章

  1. PacBio Sequel概述
  2. 2015/06/08
  3. codelite13 wxWidgets3 macos开发环境配置
  4. 固件 日立 硬盘_最强性价比储存方案体验:这硬盘盒,真香!
  5. C语言结构体内存对齐问题
  6. 运维跟开发一定有仇么?
  7. hutol json null值没了_详解Java去除json数据中的null空值问题
  8. iOS定位服务CoreLocation
  9. notepad++批量操作笔记(持续更新..)
  10. 公众号运营实用小工具推荐
  11. 在第四代计算机期间全世界逐步进入了,1、在第四代计算机期间内,计算机的应用逐步进入到.docx.docx...
  12. swiper点击左右失效
  13. 需要了解的常用Webpack插件配置-loader加载器
  14. 移动硬盘插入笔记本会后,右下角有图标显示,但是我的电脑里面不显示,导致打不开硬盘
  15. mysql 替换 斜杠_Mysql like查询语句中,结果包含反斜杠 \ 字符的,需要替换成四个反斜杠 \\\\...
  16. jQuery——遍历
  17. PS高效处理图片总结
  18. 必备 免费Iges(Igs) 3d模型素材网站
  19. 仿京东淘宝放大镜特效 jqzoom.js
  20. Hive开启CTE物化

热门文章

  1. 计算机毕业设计SSMJava远程健康数据管理系统【附源码数据库】
  2. js删除json中指定的元素
  3. Linux系统忘记密码的解决办法
  4. NNI 2 用于实例
  5. pyQt5 学习笔记(18)QLineEdit 单行文本输入
  6. 移动测试工程师必须知道的10个开源框架
  7. 转载:【SQL练习】经典SQL练习题
  8. 东西方赌王“口水战”升级 措词激烈论“竞争”
  9. iOS企业版分发关于plist和证书的那些事
  10. Java学习日记 2022.7.4