QImage 与 cv::Mat 之间的相互转换
生活随笔
收集整理的這篇文章主要介紹了
QImage 与 cv::Mat 之间的相互转换
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
近期做圖像處理方面的項目比較多,非常多算法自己從頭寫的話太浪費時間,并且自己寫的也不一定完好,早就聽說OpenCV在圖像處理算法方面功能非常強大,一直沒時間學習,這次正好項目用到了。暫時抱佛腳學習些OpenCV入門知識。由于我的程序界面都是用Qt寫的,因此也花了點時間研究了怎樣將OpenCV?和Qt?融合在一起,協(xié)同工作。
?
Qt?中處理圖像主要用的是QImage類。OpenCV中主要用的是cv::Mat類。以下的兩個函數(shù)能夠用來實現(xiàn)這兩個類相互轉(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 對于RGBA 這四個分量的排列順序是不同樣的。轉(zhuǎn)換的時候須要調(diào)換一下。可是Qt 的文檔中說的非常明白,QImage內(nèi)部數(shù)據(jù)存儲的方式不能保證以后永遠不變。
所以這個代碼也不能保證一直是可用的。
以下是五個測試用例。基本上把各種常見情況都覆蓋了。
轉(zhuǎn)載于:https://www.cnblogs.com/blfshiye/p/5165187.html
總結(jié)
以上是生活随笔為你收集整理的QImage 与 cv::Mat 之间的相互转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BAT笔试试题常见试题总结含答案(持续更
- 下一篇: 郴州美的仁大铂悦府是毛坯房还是精装修?