Qt 中的image 和 Opencv 中的 Mat 之間的相互轉換

編寫QT界面時,顯示圖像用Qt 自帶的 QImage 類非常方便;

但是如果要對圖像進行處理,首選的是Opencv庫,這個時候就需要用到QImage 和 Opencv Mat 兩種數據之間的轉換。

void convertMattoQImage( Mat_<Vec3b>& img_cv, QImage &img_qt)
{
  img_qt.convertFormat(QImage::Format_RGB32); // 將QImage 轉換成32位格式 32位格式是最便於處理 
  image_qt.scaled(img_cv.rows, img_cv.cols);
  int lineNum = 0;
  int height = img_cv.rows;
  int width =  img_cv.cols;
  uchar* imgBits = img_qt.bits();  // img_qt 的首字節地址
  for( int i=0; i<height; i++ )
     {
        lineNum = i* width*4;       
        for(int j=0; j<width; j++)
           { 
                             imgBits[lineNum + j*4 + 2] = img_cv(i, j)[2];        
                             imgBits[lineNum + j*4 + 1] = img_cv(i, j)[1];    
                             imgBits[lineNum + j*4 + 0] = img_cv(i, j)[0];    
                     }
           }
     }
} 


void convertQImageToMat( QImage &img_qt,  Mat_<Vec3b>& img_cv)
{
   
img_cv.create(img_qt.height(), img_qt.width());
   
   img_qt.convertToFormat(QImage::Format_RGB32);
   
   int lineNum = 0;
   
   int height = img_qt.height();
   
   int width = img_qt.width();
   
   uchar *imgBits = img_qt.bits();
   
   for(int i=0; i<height; i++)
   {
        lineNum = i* width *4;
        for(int j=0; j<width; j++)
        {
            img_cv(i, j)[2] = imgBits[lineNum + j*4 + 2];
            img_cv(i, j)[1] = imgBits[lineNum + j*4 + 1];
            img_cv(i, j)[0] = imgBits[lineNum + j*4 + 0];            
        }
   } 
}













發佈了33 篇原創文章 · 獲贊 17 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章