c语言opencv读取图像,c – 使用OpenCV的imread()从qrc中读取图像

正如@TheDarkKnight指出的那样,imread并不知道Qt资源.但是,您可以编写自己的加载器,使用QFile从资源中检索二进制数据,并使用imdecode(由imread内部完成)来读取图像:

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 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;

}

你可以这样称呼它:

Mat m = loadFromQrc("qrc_path");

或指定一个标志:

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

#include

#include

#include

#include

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 buf(sz);

file.read((char*)buf.data(), sz);

m = imdecode(buf, 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(inImage.bits()), inImage.bytesPerLine() );

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

}

// 8-bit, 3 channel

case QImage::Format_RGB888:

{

if ( !inCloneImageData )

qWarning() << "ASM::QImageToCvMat() - Conversion requires cloning since we use a temporary QImage";

QImage swapped = inImage.rgbSwapped();

return cv::Mat( swapped.height(), swapped.width(), CV_8UC3, const_cast(swapped.bits()), swapped.bytesPerLine() ).clone();

}

// 8-bit, 1 channel

case QImage::Format_Indexed8:

{

cv::Mat mat( inImage.height(), inImage.width(), CV_8UC1, const_cast(inImage.bits()), 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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值