日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QImage 与 cv::Mat 之间的相互转换

發(fā)布時(shí)間:2024/10/12 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QImage 与 cv::Mat 之间的相互转换 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

近期做圖像處理方面的項(xiàng)目比較多,非常多算法自己從頭寫的話太浪費(fèi)時(shí)間,并且自己寫的也不一定完好,早就聽說OpenCV在圖像處理算法方面功能非常強(qiáng)大,一直沒時(shí)間學(xué)習(xí),這次正好項(xiàng)目用到了。暫時(shí)抱佛腳學(xué)習(xí)些OpenCV入門知識(shí)。由于我的程序界面都是用Qt寫的,因此也花了點(diǎn)時(shí)間研究了怎樣將OpenCV?Qt?融合在一起,協(xié)同工作。

?

Qt?中處理圖像主要用的是QImage類。OpenCV中主要用的是cv::Mat類。以下的兩個(gè)函數(shù)能夠用來實(shí)現(xiàn)這兩個(gè)類相互轉(zhuǎn)換。

QImage cvMat2QImage(const cv::Mat& mat) {// 8-bits unsigned, NO. OF CHANNELS = 1if(mat.type() == CV_8UC1){QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);// Set the color table (used to translate colour indexes to qRgb values)image.setColorCount(256);for(int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}// Copy input Matuchar *pSrc = mat.data;for(int row = 0; row < mat.rows; row ++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);pSrc += mat.step;}return image;}// 8-bits unsigned, NO. OF CHANNELS = 3else if(mat.type() == CV_8UC3){// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();}else if(mat.type() == CV_8UC4){qDebug() << "CV_8UC4";// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);return image.copy();}else{qDebug() << "ERROR: Mat could not be converted to QImage.";return QImage();} } cv::Mat QImage2cvMat(QImage image) {cv::Mat mat;qDebug() << image.format();switch(image.format()){case QImage::Format_ARGB32:case QImage::Format_RGB32:case QImage::Format_ARGB32_Premultiplied:mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB888:mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());cv::cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_Indexed8:mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());break;}return mat; }程序比較簡單,就不多說明了。唯一須要注意的是cvMat 和QImage 對(duì)于RGBA 這四個(gè)分量的排列順序是不同樣的。轉(zhuǎn)換的時(shí)候須要調(diào)換一下。可是Qt 的文檔中說的非常明白,QImage內(nèi)部數(shù)據(jù)存儲(chǔ)的方式不能保證以后永遠(yuǎn)不變。

所以這個(gè)代碼也不能保證一直是可用的。

以下是五個(gè)測試用例。基本上把各種常見情況都覆蓋了。

void test1() {cv::Mat mat = cv::imread("Q:\\Koala.jpg", cv::IMREAD_UNCHANGED);cv::cvtColor(mat, mat, CV_BGR2BGRA);QImage image = cvMat2QImage(mat);qDebug() << (mat.type() == CV_8UC4);cvNamedWindow("cvMat2QImage RGB32", CV_WINDOW_AUTOSIZE);imshow("cvMat2QImage RGB32", mat);QLabel label;label.setPixmap(QPixmap::fromImage(image));label.show();cv::waitKey(10000); } void test2() {cv::Mat mat = cv::imread("Q:\\Koala.jpg", cv::IMREAD_UNCHANGED);cv::cvtColor(mat, mat, CV_BGR2GRAY);QImage image = cvMat2QImage(mat);cvNamedWindow("cvMat2QImage gray", CV_WINDOW_AUTOSIZE);imshow("cvMat2QImage gray", mat);QLabel label;label.setPixmap(QPixmap::fromImage(image));label.show();cv::waitKey(10000); } void test3() {QImage image("Q:\\Koala.jpg");image = image.convertToFormat(QImage::Format_RGB32);cv::Mat mat = QImage2cvMat(image);//cv::cvtColor(mat, mat, CV_BGR2RGB);imshow("QImage2cvMat RGB32", mat);cv::waitKey(10000); }void test4() {QImage image("Q:\\Koala.jpg");image = image.convertToFormat(QImage::Format_RGB888);cv::Mat mat = QImage2cvMat(image);imshow("QImage2cvMat RGB24", mat);cv::waitKey(10000); } void test5() {QImage image("Q:\\Koala.jpg");image = image.convertToFormat(QImage::Format_Indexed8);cv::Mat mat = QImage2cvMat(image);imshow("QImage2cvMat Indexed8", mat);cv::waitKey(10000); } int main(int argc, char *argv[]) {QApplication a(argc, argv);//test1();//test2();//test3();//test4();//test5();test1();return a.exec(); }

轉(zhuǎn)載于:https://www.cnblogs.com/blfshiye/p/5165187.html

總結(jié)

以上是生活随笔為你收集整理的QImage 与 cv::Mat 之间的相互转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。