关于qt传递图片给opencv的问题

加盾男爵 2017-08-28 01:28:51
现在(用Qt制作的)程序需要用到 opencv处理图片,现在的问题是图片来自前面的某个模块,传递过来的图片是QImage格式,也许说格式不太准确,但反正是个QImage,图片传递过来时位于内存中
现在问题是要把这个图片交给opencv的函数进行处理,但openCV的函数没有能识别QImage类(至少我没找到。。。),然后目前采取的办法是先把传递过来的QImage统统保存为本地文件,然后再让opencv的函数去读取,但这样会严重影响效率
    QList<QString> pixPath_List;
QList<QString> targetPix_List;
QList<QImage> allPix_List;
for(int i = 0 ; i < PIX_COUNTS_READPIX ; ++i)
{
QString sourcePix = tr("E:/pix/");
sourcePix += QString::number(i);
sourcePix += tr(".png");
pixPath_List.append(sourcePix);

QString targetPix = tr("E:/targetPix/");
targetPix += QString::number(i);
targetPix += tr(".png");
targetPix_List.append(targetPix);
}
qDebug()<<"Qt加载图片开始"<<QTime::currentTime().toString("hh-mm-ss-zzz");
for(auto A : pixPath_List)
allPix_List.append(QImage(A));
qDebug()<<"Qt加载图片结束"<<QTime::currentTime().toString("hh-mm-ss-zzz");

qDebug()<<"Qt保存图片开始"<< QTime::currentTime().toString("hh-mm-ss-zzz");
for(int i = 0 ; i < PIX_COUNTS_READPIX ; ++i)
{
allPix_List.at(i).save(targetPix_List.at(i));
}
qDebug()<<"Qt保存图片结束,opencv加载图片开始"<< QTime::currentTime().toString("hh-mm-ss-zzz");
for(auto A : targetPix_List)
IplImage* sImg = cvLoadImage(A.toStdString().c_str(),1); //内存泄露
qDebug()<<"openCv加载图片结束"<<QTime::currentTime().toString("hh-mm-ss-zzz");


代码如上,因为这段是测试代码,所以有些内存泄露之类的问题没做考虑

我先在E:/pix目录下放了100张图片从0.png-99.png,然后把这些图片加载到内存里,
然后保存到E:/targetPix目录下,再有openvc的函数去加载图片;
这一我就可以知道先保存到本地文件再去用openvc加载到内存需要消耗的额外时间

这100张图片都是png格式的,大小从10kb到500kb不等,然后程序运行的结果

Qt加载图片开始 "13-14-16-315"
Qt加载图片结束 "13-14-24-271"
Qt保存图片开始 "13-14-24-271"
Qt保存图片结束,opencv加载图片开始 "13-14-55-502"
openCv加载图片结束 "13-15-01-212"

结果显示Qt保存100已结加载的图片花了32秒!然后openvc再去加载这些图片又花费6秒!总计时间超过36秒!

现在解决这个问题的方法有两个
1 想办法把QImage转换成openvc能够识别的类/格式/文件流
2 提高Qt保存图片为本地文件 and 提高opencv加载本地文件的速度

第二个我查了很多资料,貌似有点困难,所以我想问下大家,有没有办法把QImage转换为opencv能够识别的东西
...全文
220 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
加盾男爵 2017-08-29
  • 打赏
  • 举报
回复
引用 1 楼 adeng1919 的回复:
传源数据就行了,就不需要格式了 uchar * QImage::bits()
你太机智了。。。。。
  • 打赏
  • 举报
回复
opencv转成QImage: cv::Mat srcFrame; //传进来的源图片 cv::Mat outFrame; cv::cvtColor(srcFrame, outFrame, CV_BGR2RGBA); QImage img = QImage((const unsigned char*)outFrame.data, outFrame.cols, outFrame.rows, outFrame.step, QImage::Format_RGBA8888); QImage转成Opencv也是这么转: QImage img; //传进来的源图片 cv::Mat matImg(img.height(),img.width(),cv::CV_8UC3,img.bits()); //第3个参数可能要根据实际多少通道来设置
懒懒的吉他手 2017-08-28
  • 打赏
  • 举报
回复
传源数据就行了,就不需要格式了 uchar * QImage::bits()

16,240

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧