cv::Mat、QImage格式常用函数

本文详细介绍了如何在OpenCV的cv::Mat、Qt的QImage以及Halcon的HalconCpp::HObject之间进行格式转换。提供了从QImage到cv::Mat,从cv::Mat到QImage,以及从cv::Mat到HalconCpp::HObject和反向转换的函数实现。此外,还包含了QImage的镜像和旋转操作的方法。
摘要由CSDN通过智能技术生成

目录

 一、cv::Mat、QImage格式互转

 二、cv::Mat、HalconCpp::HObject格式互转

 三、QImage的镜像与旋转


 一、cv::Mat、QImage格式互转

cv::Mat qImage2cvMat(QImage& image)
{
    cv::Mat mat;
    switch (image.format())
    {
    case QImage::Format_Grayscale8:
    {   
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        return mat.clone();
    }
    case QImage::Format_RGB888:
    {
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        cv::Mat copyMat = mat.clone();
        cv::cvtColor(copyMat, copyMat, CV_BGR2RGB);
        return copyMat;
    }
    case QImage::Format_ARGB32:
    {
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        return mat.clone();
    }
    default:
    {
        image = image.convertToFormat(QImage::Format_RGB888);
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        cv::Mat copyMat = mat.clone();
        cv::cvtColor(copyMat, copyMat, CV_BGR2RGB);
        return copyMat;
    }
    }
}

QImage cvMat2qImage(cv::Mat& mat)
{
    QImage image;
    switch (mat.type())
    {
    case CV_8UC1:
    {
        const uchar* pSrc = (const uchar*)mat.data;
        image = QImage(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
        return image;
    }
    case CV_8UC3:
    {
        const uchar* pSrc = (const uchar*)mat.data;
        image = QImage(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        return image.rgbSwapped();
    }
    case CV_8UC4:
    {
        const uchar* pSrc = (const uchar*)mat.data;
        image = QImage(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
        return image.copy();
    }
    default:
    {
        mat.convertTo(mat, CV_8UC3);
        const uchar* pSrc = (const uchar*)mat.data;
        image = QImage(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        return image.rgbSwapped();
    }
    }
}

二、cv::Mat、HalconCpp::HObject格式互转

using namespace HalconCpp;

HObject cvMat2hObject(const cv::Mat& srcMat)
{
	HObject hImg;
	std::vector<cv::Mat> vecSplitMat;
	if (srcMat.type() == CV_8UC3 || srcMat.type() == CV_8UC4) 
    {
        GenImage3(&hImg, "byte", srcMat.cols, srcMat.rows,
            (Hlong)(vecSplitMat[2].data),
			(Hlong)(vecSplitMat[1].data),
			(Hlong)(vecSplitMat[0].data));
    }
    else if (srcMat.type() == CV_8UC1) 
    {
        GenImage1(&hImg, "byte", srcMat.cols, srcMat.rows, 
			(Hlong)(vecSplitMat[0].data));
    }

    return hImg;
}

cv::Mat hObject2cvMat(const HObject& hImg)
{
    HString hType;
	Hlong hWidth, hHeight;
	HTuple hCh;
	CountChannels(hImg, &hCh);
	cv::Mat rtnMat;

    if (hCh.I() == 1) 
	{
		void* hPtr = (HImage(hImg)).GetImagePointer1(&hType, &hWidth, &hHeight);
        rtnMat.create(hHeight, hWidth, CV_8UC1);
		memcpy(rtnMat.data, hPtr, hWidth * hHeight * sizeof(uchar));
    }
    else if (hCh.I() == 3) 
    {
        void* rPtr;
		void* gPtr;
		void* bPtr;
        (HImage(hImg)).GetImagePointer3(&rPtr, &gPtr, &bPtr, &hType, &hWidth, &hHeight);
        std::vector<cv::Mat> vecMat(3);
        vecMat[0].create(hHeight, hWidth, CV_8UC1);
		vecMat[1].create(hHeight, hWidth, CV_8UC1);
		vecMat[2].create(hHeight, hWidth, CV_8UC1);
		int dataSize = hHeight * hWidth * sizeof(uchar);
        memcpy(vecMat[2].data, rPtr, dataSize);
		memcpy(vecMat[1].data, gPtr, dataSize);
        memcpy(vecMat[0].data, bPtr, dataSize);
		cv::merge(vecMat, rtnMat);
    }

    return rtnMat;
}

三、QImage的镜像与旋转

void qImageMirror(QImage* image, bool horizontal)
{
    if (horizontal)
        *image = image->mirrored(true, false);//水平镜像
    else
        *image = image->mirrored(false, true);//垂直镜像
}

void qImageRotate(QImage* image, double angle)
{
    QMatrix matrix;
    matrix.rotate(angle);
    *image = image->transformed(matrix, Qt::FastTransformation);
}
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值