2017-04-27 23 views
0

私はカメラを使ってcv :: MatオブジェクトであるimgTomo1イメージを取得しています。これはCV_32F画像です。 QPixmapを使ってQLabelに表示しようとしています。 QPixmapにcv :: Mat(CV_32F型)を表示

cv::Mat imgTomo; 
    imgTomo1.convertTo(imgTomo,CV_8UC1); 

    static QVector<QRgb> sColorTable; 

    // only create our color table the first time 
if (sColorTable.isEmpty()) 

    sColorTable.resize(256); 

     for (int i = 0; i < 256; ++i) 
     { 
      sColorTable[i] = qRgb(i, i, >i); 
     } 
    } 

    QImage image(imgTomo.data, 
       imgTomo.cols, imgTomo.rows, 
       static_cast<int>(imgTomo.step), 
       QImage::Format_Indexed8); 

    image.setColorTable(sColorTable); 
    _afficheImg->setPixmap(QPixmap::fromImage(image)); 

は残念ながら、表示された画像は、黒のまま: はここに私のコードです。 私はOpenCVを初めて使っているので、フォーマットが少し失われています。 変換が機能するはずなので、私は実際に何が起こっているのか分かりません。

編集:私はfllowing線削除した:

imgTomo1.convertTo(imgTomo、CV_8UC1)を、

これで情報が失われました。 今はもう黒い画面がありませんが、いくつかの "雪"(フォーム1〜0の非常にきれいな形の魔法のピクセル)が表示されます。

は、あなたの答えをありがとう グレゴワール

答えて

0

私はあなたのコードが悪いのかを正確にわからないが、私はQImagecv::Mat画像を変換するために、次のコードを使用していました。

if (frame.channels()== 3){ 
     cv::cvtColor(frame, RGBframe, CV_BGR2RGB); 
     img = QImage((const unsigned char*)(RGBframe.data), 
         RGBframe.cols,RGBframe.rows,QImage::Format_RGB888); 
} 
else 
{ 
     img = QImage((const unsigned char*)(frame.data), 
         frame.cols,frame.rows,QImage::Format_Indexed8); 
} 

あなたもQImageMat画像を変換する方法の詳細については、follwing linkをチェックアウトすることができます。

+0

感謝あなたの答えはあなたです。私はその問題の1つを見つけ出すことができました。実際には "imgTomo1.convertTo(imgTomo、CV_8UC1);"私はfloat32を8bitでintに変換していたため、情報が失われました。今、私はイメージを持っていますが、それはちょっと混乱していて、たくさんの "雪"(私はそうでなければそれを置く方法はわかりません)がsceenにあります。 –

0

1.Convert CV_8U型

 Mat Temp; 

     CurrentMat.convertTo(Temp, CV_8U); 

2.Checkチャンネル番号:

int theType = Temp.type(); 

    int channel_number = (theType/8) + 1; 

    if(channel_number == 4){ 

     cvtColor(Temp, Temp, CV_BGRA2BGR); 
    } 

3.Youこのコードを使用して、QImageのにマットタイプを変換することができ:

 QImage putImage(const Mat& mat) 
     { 
     // 8-bits unsigned, NO. OF CHANNELS=1 
     if (mat.type() == CV_8UC1) 
     { 

      // Set the color table (used to translate colour indexes to qRgb values) 
      QVector<QRgb> colorTable; 
      for (int i = 0; i < 256; i++) 
       colorTable.push_back(qRgb(i, i, i)); 
      // Copy input Mat 
      const uchar *qImageBuffer = (const uchar*)mat.data; 
      // Create QImage with same dimensions as input Mat 
      QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8); 
      img.setColorTable(colorTable); 
      return img; 
     } 
     // 8-bits unsigned, NO. OF CHANNELS=3 
     if (mat.type() == CV_8UC3) 
     { 
      // Copy input Mat 
      const uchar *qImageBuffer = (const uchar*)mat.data; 
      // Create QImage with same dimensions as input Mat 
      QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); 
      return img.rgbSwapped(); 
     } 
     else 
     { 
      qDebug() << "ERROR: Mat could not be converted to QImage."; 
      return QImage(); 
     } 
     } 
+0

あなたのお返事ありがとうございます。 私が言ったように、使用: > CurrentMat.convertTo(Temp、CV_8U); 私が表示している画像がトータルで黒いのはなぜですか。 私はあなたと同じことをしているこの行と私のコードを削除しました。 私の問題は、表示される画像がある種の「ノイズ」でいっぱいになっていることです。 –

+0

私はあなたの意見を見ます。 「雪」のドットピクセルは、たぶんピクセルに詰まっています。何らかの理由で、カメラ上にこのような画素の変更が存在する可能性がある。私はカメラから来ています。詳細については、[link](https://photographylife.com/dead-vs-stuck-vs-hot-pixels/)をご覧ください。 –

関連する問題