ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

halcon彩色转QImage彩色

2022-02-06 11:35:28  阅读:183  来源: 互联网

标签:VecM Image 彩色 unsigned halcon BYTE Hobj QImage


#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{

    this->resize(500,300);
    QLabel* label=new QLabel("我是中国人",this);
    label->move(10,10);

    HObject  ho_Image;
    ReadImage(&ho_Image, "D:/bb/tu/ma.jpg");

    QImage myImage=HobjectToQImage(ho_Image);  //halcon彩色转QImage彩色
    QTransform tf;  //坐标变换
    tf.rotate(180,Qt::XAxis);
    QImage im3=myImage.transformed(tf,Qt::FastTransformation); //返回旋转后的图像

    QPixmap p;
    p.convertFromImage(im3);  //把QImage转换成QPixmap
    label->setPixmap(p);
    label->adjustSize();



}

Win::~Win()
{
}

cv::Mat Win::HObject2Mat(HObject Hobj)  //HObject类型转Mat类型
{
    HTuple htCh;
        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);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt);
            int W = wid;
            int H = hgt;
            Image.create(H, W, CV_8UC1);
            unsigned char *pdata = static_cast<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);
            std::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 *R2 = (unsigned char *)Rptr;
            unsigned char *G = (unsigned char *)Gptr;
            unsigned char *B = (unsigned char *)Bptr;
            memcpy(VecM[2].data, R2, W*H);
            memcpy(VecM[1].data, G, W*H);
            memcpy(VecM[0].data, B, W*H);
            cv::merge(VecM, Image);
        }
        return Image;
}

QImage Win::HobjectToQImage(HObject img)  //halcon彩色转QImage彩色
{

    //转换之后图像是倒立的
    HTuple rImage , gImage , bImage , type , hvWidth , hvHeight;
    BYTE* vcPr = NULL;
    BYTE* vcPg = NULL;
    BYTE* vcPb = NULL;
    BYTE* vcPImage = NULL;
    INT32 vcWidth = 0 , vcHeight = 0;
    //ReadImage(&img,"C:/Users/Administrator/Desktop/8.bmp");

    GetImagePointer3(img , &rImage , &gImage , &bImage , &type , &hvWidth , &hvHeight);
    vcWidth = (Hlong)hvWidth;
    vcHeight = (Hlong)hvHeight;
    vcPb = (BYTE*)rImage[0].L();
    vcPg = (BYTE*)gImage[0].L();
    vcPr = (BYTE*)bImage[0].L();
    //计算bmp图片实际的宽度,因为bmp图片宽度必须四字节对齐
    int bmpWidth = (vcWidth*3 + 3)/4*4;
    vcPImage = new BYTE[bmpWidth * vcHeight * 3];//給bmp图片分配内存空间
    //将halcon图象类型HObject中的数据拷贝出来,放到C++变量类型中
    for(int i = vcHeight - 1 ; i > 0 ; i--){
    for(int j = 0 ; j < vcWidth ; j++){
    *(vcPImage + i*bmpWidth + j*3 + 0) = *vcPb;
    *(vcPImage + i*bmpWidth + j*3 + 1) = *vcPg;
    *(vcPImage + i*bmpWidth + j*3 + 2) = *vcPr;
    vcPb++;
    vcPg++;
    vcPr++;
    }
    }
    QImage qimg(vcPImage,vcWidth,vcHeight,QImage::Format_RGB888);

    return qimg;
}

 

 

 

 

标签:VecM,Image,彩色,unsigned,halcon,BYTE,Hobj,QImage
来源: https://www.cnblogs.com/liming19680104/p/15865405.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有