大佬教程收集整理的这篇文章主要介绍了c – 使用OpenCV的imread()从qrc中读取图像,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
但最终的img大小为[0x0].我也尝试过:
@H_166_2@mat img = imread("qrc://TempIcons/logo.png");但我得到的大小是一样的.我不想在QImage中加载图像然后在cv :: Mat中转换它.有没有办法以简单的方式做到这一点?如果是的话,我该怎么办?
谢谢
@H_874_12@你可以这样称呼它:
@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,请注明来意。