C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用OpenCV的imread()从qrc中读取图像大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想以这种方式使用OpenCV的imread()从qrc中读取图像: @H_166_2@mat img = imread(":/TempIcons/logo.png");

但最终的img大小为[0x0].我也尝试过:

@H_166_2@mat img = imread("qrc://TempIcons/logo.png");

但我得到的大小是一样的.我不想在QImage中加载图像然后在cv :: Mat中转换它.有没有办法以简单的方式做到这一点?如果是的话,我该怎么办

谢谢

@H_874_12@

解决方法

正如@TheDarkKnight指出的那样,imread并不知道Qt资源.但是,您可以编写自己的加载器,使用QFile从资源中检索二进制数据,并使用imdecode(由imread内部完成)来读取图像: @H_166_2@mat loadFromQrc(QString qrc,int flag = IMREAD_COLOR) { //double tic = double(getTickCount()); QFile file(qrc); Mat m; if(file.open(QIODevice::readOnly)) { qint64 sz = file.size(); std::vector<uchar> buf(sz); file.read((char*)buf.data(),sz); m = imdecode(buf,flag); } //double toc = (double(getTickCount()) - tiC) * 1000.0 / getTickFrequency(); //qDebug() << "OpenCV loading time: " << toc; return m; }

你可以这样称呼它:

@H_166_2@mat m = loadFromQrc("qrc_path");

或指定一个标志:

@H_166_2@mat m = loadFromQrc("qrc_path",IMREAD_GRAYSCALE);

性能

我尝试使用loadFromQrc加载图像,并使用this代码加载QImage并转换为Mat,无论是否克隆. loadFromQrc的结果比加载QImage并将其转换为Mat快10倍.

结果以ms为单位:

Load Mat                :  4.85965
QImage to Mat (no clonE):  49.3999
QImage to Mat (clonE)   :  49.8497

测试代码

#include <vector>
#include <iostream>
#include <QDebug>
#include <QtWidgets>

#include <opencv2/opencv.hpp>
using namespace cv;

Mat loadFromQrc(QString qrc,int flag = IMREAD_COLOR)
{
    QFile file(qrc);
    Mat m;
    if(file.open(QIODevice::readOnly))
    {
        qint64 sz = file.size();

        std::vector<uchar> buf(sz);
        file.read((char*)buf.data(),flag);
    }
    return m;
}

cv::Mat QImageToCvMat( const QImage &inImage,bool inCloneImageData = true )
{
    switch ( inImage.format() )
    {
    // 8-bit,4 chAnnel
    case QImage::Format_RGB32:
    {
        cv::Mat  mat( inImage.height(),inImage.width(),CV_8UC4,const_cast<uchar*>(inImage.bits()),inImage.bytesPerLine() );

        return (inCloneImageData ? mat.clone() : mat);
    }

        // 8-bit,3 chAnnel
    case QImage::Format_RGB888:
    {
        if ( !inCloneImageData )
            qWarning() << "ASM::QImageToCvMat() - Conversion requires @R_736_1419@ since we use a temporary QImage";

        QImage   swapped = inImage.rgbSwapped();

        return cv::Mat( swapped.height(),swapped.width(),CV_8UC3,const_cast<uchar*>(swapped.bits()),swapped.bytesPerLine() ).clone();
    }

        // 8-bit,1 chAnnel
    case QImage::Format_Indexed8:
    {
        cv::Mat  mat( inImage.height(),CV_8UC1,inImage.bytesPerLine() );

        return (inCloneImageData ? mat.clone() : mat);
    }

    default:
        qWarning() << "ASM::QImageToCvMat() - QImage format not handled in switch:" << inImage.format();
        break;
    }

    return cv::Mat();
}

int main(int argc,char *argv[])
{
    QString url = "...";

    {
        double tic = double(getTickCount());

        Mat m1 = loadFromQrc(url);

        double toc = (double(getTickCount()) - tiC) * 1000.0 / getTickFrequency();
        qDebug() << "Load Mat: " << toc;

        if(m1.data != NULL)
        {
            imshow("m1",m1);
            waitKey(1);
        }
    }


//    {
//        double tic = double(getTickCount());

//        QImage img;
//        img.load(url);
//        Mat m2 = QImageToCvMat(img,falsE);

//        double toc = (double(getTickCount()) - tiC) * 1000.0 / getTickFrequency();
//        qDebug() << "QImage to Mat (no clonE): " << toc;

//        if(m2.data != NULL)
//        {
//            imshow("m2",m2);
//            waitKey(1);
//        }
//    }


//    {
//        double tic = double(getTickCount());

//        QImage img;
//        img.load(url);
//        Mat m3 = QImageToCvMat(img,truE);

//        double toc = (double(getTickCount()) - tiC) * 1000.0 / getTickFrequency();
//        qDebug() << "QImage to Mat (clonE): " << toc;

//        if(m3.data != NULL)
//        {
//            imshow("m3",m3);
//            waitKey(1);
//        }
//    }

    waitKey();
    return 0;
}
@H_874_12@ @H_874_12@

大佬总结

以上是大佬教程为你收集整理的c – 使用OpenCV的imread()从qrc中读取图像全部内容,希望文章能够帮你解决c – 使用OpenCV的imread()从qrc中读取图像所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。