当前位置: 首页 > news >正文

图片类型转换

opencv转QImage

QImage matToQImage(cv::Mat& inMat) {
    switch (inMat.type()) {
    case CV_8UC1: {
        // 8位单通道灰度图
        QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_Grayscale8);
        return image;
    }
    case CV_8UC3: {
        // 8位3通道彩色图
        QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_RGB888);
        // 由于OpenCV使用BGR格式,需要转换为RGB
        image = image.rgbSwapped();
        return image;
    }
    case CV_8UC4: {
        // 8位4通道彩色图(BGRA)
        QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_RGBA8888);
        return image;
    }
    default:
        // 未知类型,返回空QImage
        return QImage();
    }
}

opencv转halcon

HalconCpp::HObject MatToHImage(cv::Mat& cv_img)
{
    HalconCpp::HObject H_img;

    if (cv_img.channels() == 1)
    {
        int height = cv_img.rows, width = cv_img.cols;
        int size = height * width;
        uchar* temp = new uchar[size];

        memcpy(temp, cv_img.data, size);
        HalconCpp::GenImage1(&H_img, "byte", width, height, (Hlong)(temp));

        delete[] temp;
    }
    else if (cv_img.channels() == 3)
    {
        int height = cv_img.rows, width = cv_img.cols;
        int size = height * width;
        uchar* B = new uchar[size];
        uchar* G = new uchar[size];
        uchar* R = new uchar[size];

        for (int i = 0; i < height; i++)
        {
            uchar* p = cv_img.ptr<uchar>(i);
            for (int j = 0; j < width; j++)
            {
                B[i * width + j] = p[3 * j];
                G[i * width + j] = p[3 * j + 1];
                R[i * width + j] = p[3 * j + 2];
            }
        }
        HalconCpp::GenImage3(&H_img, "byte", width, height, (Hlong)(R), (Hlong)(G), (Hlong)(B));

        delete[] R;
        delete[] G;
        delete[] B;
    }
    return H_img;
}

halcon转opencv

cv::Mat HImageToMat(HalconCpp::HObject& H_img)
{
    cv::Mat cv_img;
    HalconCpp::HTuple channels, w, h;

    HalconCpp::ConvertImageType(H_img, &H_img, "byte");
    HalconCpp::CountChannels(H_img, &channels);

    if (channels.I() == 1)
    {
        HalconCpp::HTuple pointer;
        GetImagePointer1(H_img, &pointer, nullptr, &w, &h);
        int width = w.I(), height = h.I();
        int size = width * height;
        cv_img = cv::Mat::zeros(height, width, CV_8UC1);
        memcpy(cv_img.data, (void*)(pointer.L()), size);
    }

    else if (channels.I() == 3)
    {
        HalconCpp::HTuple pointerR, pointerG, pointerB;
        HalconCpp::GetImagePointer3(H_img, &pointerR, &pointerG, &pointerB, nullptr, &w, &h);
        int width = w.I(), height = h.I();
        int size = width * height;
        cv_img = cv::Mat::zeros(height, width, CV_8UC3);
        uchar* R = (uchar*)(pointerR.L());
        uchar* G = (uchar*)(pointerG.L());
        uchar* B = (uchar*)(pointerB.L());
        for (int i = 0; i < height; ++i)
        {
            uchar* p = cv_img.ptr<uchar>(i);
            for (int j = 0; j < width; ++j)
            {
                p[3 * j] = B[i * width + j];
                p[3 * j + 1] = G[i * width + j];
                p[3 * j + 2] = R[i * width + j];
            }
        }
    }
    return cv_img;
}

相关文章:

  • 使用 Python包管理工具 uv 完成 Open WebUI 的安装
  • 【Ubuntu设备端口绑定】
  • 电机控制常见面面试问题(十九)
  • 单链表结点删除
  • PostgreSQL:索引与查询优化
  • 蓝桥杯 整数变换
  • 深入理解 Git Stash:功能、用法与实战示例
  • 第一次程序Hello Python
  • 【数据结构】C语言实现树和森林的遍历
  • WPF x:Static与StaticResource
  • 基于 Hydrus 软件的土壤水、热、盐及污染物迁移模型与案例分析
  • [图形学]在半球面上按照微表面模型采样
  • 《深入探索 C++对象模型》-- 对象实例直接访问成员 VS 通过指针或引用访问成员 P99扩展解释
  • 科技赋能|ZGIS综合管网智能管理平台守护地下城市生命线
  • Nginx目录结构
  • Mininet--moduledeps.py源码解析
  • 为何服务器监听异常?
  • Next Route Handlers的使用
  • 树莓派开发(一):烧录系统,设置SSH远程登录,用摄像头拍照
  • Nginx反向代理及负载均衡
  • 南漳县建设局网站/如何做自己的网站
  • 网校网站建设多少钱/市场监督管理局职责
  • 网站开发毕业指导手册/网页设计期末作业模板
  • 哪些网站可以做店铺推广/非企户百度推广
  • 十佳深圳网站设计/关键词密度
  • alt网站标签怎么做/外包公司排名