HObject转换为QImage

在Qt中需要先将HObject转换为QImage,然后再使用。

cpp 复制代码
int calcBytesPerLine(int width, int bitCounts)
{
    //把图像的宽度数值换算成4的整数倍
    int step = 0;
    if (bitCounts >= 8)
    {
        step = (width * bitCounts / 8 + 3) / 4 * 4;
    }
    else
    {
        step = (width * bitCounts + 31) / 32 * 4;
    }

    return step;
}


QImage MainWindow::HObject2QImage(const HalconCpp::HObject &Hobj) //Halcon中的HObject类型转QImage类型
{
    HalconCpp::HTuple hv_Chn = HalconCpp::HTuple();
    HalconCpp::HTuple hv_Length;
    HalconCpp::HTuple hv_Type;
    HalconCpp::HObject ho_Img;
    QImage image;

    ConvertImageType(Hobj, &ho_Img, "byte");
    CountChannels(ho_Img, &hv_Chn);
    TupleLength(hv_Chn, &hv_Length);
    if (hv_Length.L() == 0)
    {
        return image;
    }

    HalconCpp::HTuple hv_Width;
    HalconCpp::HTuple hv_Height;
    int width = 0;
    int height = 0;
    int step = 0;

    if (hv_Chn[0].I() == 1)
    {
        HalconCpp::HTuple hv_Ptr;
        GetImagePointer1(ho_Img, &hv_Ptr, &hv_Type, &hv_Width, &hv_Height);
        width = (int)hv_Width;
        height = (int)hv_Height;
        step = calcBytesPerLine(width, 8);
        BYTE *p = (BYTE *)hv_Ptr[0].L(); //必须是L(),不能是I()
        QImage temp = QImage(width, height, QImage::Format_Grayscale8);
        image = temp.copy();
        BYTE *data8 = image.bits();
        int pix = 0;

        for (int i = 0; i < height; i++)
        {
            for (int k = 0; k < width; k++)
            {
                pix = step * i + k;
                data8[pix + 0] = p[width * i + k];
            }
        }
    }
    else if (hv_Chn[0].I() == 3)
    {
        HalconCpp::HTuple hv_PtrR, hv_PtrG, hv_PtrB;
        GetImagePointer3(ho_Img, &hv_PtrR, &hv_PtrG, &hv_PtrB, &hv_Type, &hv_Width, &hv_Height);
        width = (int)hv_Width;
        height = (int)hv_Height;
        step = calcBytesPerLine(width, 24); //三通道
        BYTE *pr = (BYTE *)hv_PtrR[0].L();  //必须是L(),不能是I()
        BYTE *pg = (BYTE *)hv_PtrG[0].L();
        BYTE *pb = (BYTE *)hv_PtrB[0].L();

        QImage temp = QImage(width, height, QImage::Format_RGB888);
        image = temp.copy();
        BYTE *data24 = image.bits();
        int pix = 0;

        for (int i = 0; i < height; i++)
        {
            for (int k = 0; k < width; k++)
            {
                pix = step * i + k * 3;
                data24[pix + 0] = pr[width * i + k]; //QImage格式是RGB,不是BGR
                data24[pix + 1] = pg[width * i + k];
                data24[pix + 2] = pb[width * i + k];
            }
        }
    }

    return image;
}
相关推荐
SunkingYang1 小时前
QT程序怎么接收MFC通过sendmessage发送的信号
qt·mfc·信号·事件·sendmessage·接收消息
SunkingYang2 小时前
Qt中QString 查找子串的完整指南
qt·字符串·qstring·子字符串·查找子串
世转神风-3 小时前
qt-在字符串中指定位置插入字符串
开发语言·qt
hqwest4 小时前
码上通QT实战03--登录逻辑
开发语言·qt·登录·嵌入式实时数据库·界面设计
世转神风-6 小时前
QEventLoop与QTimer联动
qt
SunkingYang6 小时前
QT如何将char*转QString
qt·qstring·指针·转换·char
hqwest9 小时前
码上通QT实战01--创建项目
开发语言·qt·sqlite3·qt项目·qwidget·qwindow
深蓝海拓10 小时前
PySide6从0开始学习的笔记(十二) QProgressBar(进度条)
笔记·python·qt·学习·pyqt
神仙别闹10 小时前
基于 SeetaFace+VS2017+Qt 的人脸识别
开发语言·qt