pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

cv::Mat 到 QImage 并返回

cv::Mat to QImage and back(cv::Mat 到 QImage 并返回)
本文介紹了cv::Mat 到 QImage 并返回的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

//對不起我的英語.

請告訴我,我做錯(cuò)了什么?我已經(jīng)閱讀了很多關(guān)于這方面的內(nèi)容.并寫了一些代碼,但結(jié)果很糟糕.

Tell me please, what I am doing wrong? I have read a lot about this. And write some code, but I have a terrible result.

據(jù)我所知在 Opencv 中 CV_8UC3QImage::Format_RGB888 相同,除了相應(yīng)的 BRG 和 RGB.

As I understand in Opencv CV_8UC3 is the same as QImage::Format_RGB888 , except BRG and RGB accordingly.

以這種格式讀取 cv::Mat 我可以這樣做:

to read cv::Mat in this format I can do:

cv::Mat mat1 = cv::imread("bugero.jpg",3); 

所以,要將 cv::Mat 轉(zhuǎn)換為 QImage 我可以這樣做:

So, to convert cv::Mat to QImage I can do:

QImage Mat2QImage(cv::Mat const& src)
{
     cv::Mat temp(src.cols,src.rows,src.type());
     cvtColor(src, temp,CV_BGR2RGB);
     QImage dest= QImage((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
     return dest;
}

我制作了臨時(shí)墊,因?yàn)槲蚁朐?QImage 中復(fù)制數(shù)據(jù).

I made temp mat becouse I want to have copy of data in QImage.

那么.要將其轉(zhuǎn)換回我必須做的:

Then. To convert it back I Have to do:

cv::Mat QImage2Mat(QImage const& src)
{
     QImage temp = src.copy();
     cv::Mat res(temp.height(),temp.width(),CV_8UC3,(uchar*)temp.bits(),temp.bytesPerLine());
     cvtColor(res, res,CV_BGR2RGB); 
     return res;
}

我插入了cvtColor(res, res,CV_BGR2RGB);用 BGR 顏色制作 cv Mat.我不完全知道這個(gè)函數(shù)里面有什么cvtColor(res, res,CV_BGR2RGB);,但我決定如果 cvtColor(res, res,CV_BGR2RGB); 改變 R 和 B 的位置,這將改變這種顏色的位置,因?yàn)槲覜]有找到 CV_BGR2RGB.

I have inserted cvtColor(res, res,CV_BGR2RGB); to make cv Mat with BGR colors. I do not exactly know what in inside this function cvtColor(res, res,CV_BGR2RGB);, But I decided that if cvtColor(res, res,CV_BGR2RGB); change places R and B, that will chage places of this colors back, because I did not found CV_BGR2RGB.

所以,我寫了一個(gè)簡短的示例程序

So, I wrote short sample program

#include <QApplication>
#include <QtGui>
#include <cv.h>
#include "opencv2/highgui/highgui.hpp"

QImage Mat2QImage(cv::Mat const& src)
{
     cv::Mat temp(src.cols,src.rows,src.type()); // make the same cv::Mat
     cvtColor(src, temp,CV_BGR2RGB); // cvtColor Makes a copt, that what i need
     QImage dest= QImage((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
     return dest;
}

cv::Mat QImage2Mat(QImage const& src)
{
     QImage temp = src.copy(); 
     cv::Mat res(temp.height(),temp.width(),CV_8UC3,(uchar*)temp.bits(),temp.bytesPerLine());
     cvtColor(res, res,CV_BGR2RGB); // make convert colort to BGR ! 
     return res; 
}


int main(int argc, char *argv[])
{
     QApplication a(argc, argv);
     QWidget W1;
     QWidget W2;
     QLabel imlab1(&W1);
     QLabel imlab2(&W2);
     W1.setWindowTitle("Convert cv::Mat to QImage First time"); 
     W2.setWindowTitle("Convert cv::Mat to QImage Second time");    




     cv::Mat mat1 = cv::imread("bugero.jpg",3);

     QImage qim1  = Mat2QImage(mat1);

     cv::Mat mat2 = QImage2Mat(qim1);

     QImage qim2 = Mat2QImage(mat2); 

     cv::Mat mat3 = QImage2Mat(qim2);



     cv::imshow("First Mat",mat1);
     imlab1.setPixmap(QPixmap::fromImage(qim1)); 
     W1.setFixedSize(qim1.size()); 
     cv::imshow("Convert QImage to cv::Mat firstly",mat2);
     imlab2.setPixmap(QPixmap::fromImage(qim2));
     W2.setFixedSize(qim2.size()); 
     cv::imshow("Convert QImage to cv::Mat secondly",mat2);
     W1.show();
     W2.show();

     return a.exec();
}

和 .pro 文件

INCLUDEPATH += /usr/local/include/opencv /usr/local/include/opencv2
LIBS += -lopencv_core -lopencv_imgproc
                                       -lopencv_highgui
QT       += gui
QT       += core
SOURCES += 
    QcvMat.cpp 

我得到了一個(gè)糟糕的結(jié)果!?。?em class="showen">

And I have got a BAD result!!!

有嗎?各位,我需要幫助!

Is there some? People,I need help!

我添加了一些調(diào)試信息來獲取 cv::Mat.step 和 QImage.bytesPerLine() 并且它是不同的.

I added some debug info to get cv::Mat.step and QImage.bytesPerLine() and it is different.

alex@lenovo /media/Files/Programming/Cpp/tests/QImagecvMat $ ./QcvMat 
cv step  942 
QImage  bytesPerLine  944 
cv step  942 
QImage  bytesPerLine  944 

這是什么意思,可能有什么問題?

What does it means and may be problem in it?

推薦答案

代碼看起來不錯(cuò),但有一個(gè)例外.
內(nèi)存管理.cv::Mat 在這個(gè)材料中不像 QImage 那樣工作.請記住,QImage 使用寫時(shí)復(fù)制機(jī)制并為每個(gè)副本共享內(nèi)存.cv::Mat 也共享內(nèi)存,但它不會在寫入時(shí)進(jìn)行復(fù)制(我也是 open cv 的新手(2 周),所以我無法確切解釋它是如何工作的,但我'因?yàn)槟莻€(gè),我偶然發(fā)現(xiàn)了一些迷戀)!
另一件事是,當(dāng)您從內(nèi)存中創(chuàng)建 QImage 時(shí),圖像正在使用此內(nèi)存并且不擁有它的所有權(quán).
最終結(jié)果是,在 Linux 和 Qt5 上,您的代碼由于內(nèi)存管理問題而崩潰.在屏幕截圖中,您可以在第二個(gè)窗口的頂部看到發(fā)生了一些奇怪的事情,并且您會看到一些內(nèi)存垃圾.

Code looks fine with one exception.
Memory management. cv::Mat doesn't work like QImage in this mater. Remember that QImage is using copy on write mechanism and shares memory for each copy. cv::Mat also shares memory but it doesn't do copy on write (I'm also new with open cv (2 weeks) so I can't explain yet exactly how it works but I've stumbled on some crushes because of that)!
Another thing is that when you are creating QImage from memory image is using this memory and doesn't take ownership of it.
Final outcome is that on Linux and Qt5 your code is crashes because of problems with memory management. On your screen shot you can see at the top of second window that something strange is going on and you see some memory trash.

所以我更正了你的轉(zhuǎn)換函數(shù),它完美地工作:

So I've corrected your conversion functions it works perfectly:

QImage Mat2QImage(cv::Mat const& src)
{
     cv::Mat temp; // make the same cv::Mat
     cvtColor(src, temp,CV_BGR2RGB); // cvtColor Makes a copt, that what i need
     QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
     dest.bits(); // enforce deep copy, see documentation 
     // of QImage::QImage ( const uchar * data, int width, int height, Format format )
     return dest;
}

cv::Mat QImage2Mat(QImage const& src)
{
     cv::Mat tmp(src.height(),src.width(),CV_8UC3,(uchar*)src.bits(),src.bytesPerLine());
     cv::Mat result; // deep copy just in case (my lack of knowledge with open cv)
     cvtColor(tmp, result,CV_BGR2RGB);
     return result;
}

所以我們都必須閱讀有關(guān) open-CV 中內(nèi)存管理的內(nèi)容:)

So we both have to do a reading about memory management in open-CV :).

離題:
在 Linux 上的 qt 項(xiàng)目中包含 openCV 的最佳方法是添加到 pro 文件中,例如:

OFFTOPIC:
Best way to include openCV in qt projects on Linux is to add to pro file something like:

# add open CV
unix {
    CONFIG += link_pkgconfig
    PKGCONFIG += opencv
}

將代碼移動到另一臺機(jī)器時(shí),您將不會遇到路徑問題.

You will be free of path problems when moving code to another machine.

這篇關(guān)于cv::Mat 到 QImage 并返回的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數(shù)據(jù)?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環(huán): for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環(huán)?)
Reusing thread in loop c++(在循環(huán) C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環(huán)形?)
主站蜘蛛池模板: 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 超声波流量计_流量标准装置生产厂家 _河南盛天精密测控 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 气胀轴|气涨轴|安全夹头|安全卡盘|伺服纠偏系统厂家-天机传动 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 智慧物联网行业一站式解决方案提供商-北京东成基业 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 国际学校_国际学校哪个好_国际课程学校-国际学校择校网 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 对辊式破碎机-对辊制砂机-双辊-双齿辊破碎机-巩义市裕顺机械制造有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 间甲酚,间甲酚厂家-山东祥东新材料| 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 上海橡胶接头_弹簧减震器_金属软接头厂家-上海淞江集团 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 杭州营业执照代办-公司变更价格-许可证办理流程_杭州福道财务管理咨询有限公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 好物生环保网、环保论坛 - 环保人的学习交流平台 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 步进电机_agv电机_伺服马达-伺服轮毂电机-和利时电机 | 过跨车_过跨电瓶车_过跨转运车_横移电动平车_厂区转运车_无轨转运车 |