2017-04-27 3 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를 처음 접했을 때 형식이 약간 손실되었습니다. 변환이 제대로 작동하여 실제로 내가 뭘 만들고 있는지 알 수 없다고 생각합니다.

EDIT : 나는 fllowing 라인 삭제 가지고

imgTomo1.convertTo (imgTomo, CV_8UC1)를;

정보가 손실되었습니다. 이제 더 이상 검정색 화면이 없지만 일부 "눈"(1 ~ 0을 매우 약하게 묘사하는 픽셀)과 내 카메라가 보여 주려고하는 것을 실제로 볼 수는 없습니다.

내가 코드를 잘못 정확히 모르겠지만 나는 QImagecv::Mat 이미지를 변환하려면 다음 코드를 사용하여 답을 그레 구 아르

답변

0

을 주셔서 감사합니다.

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

감사 당신은 당신의 대답을 위해서. 나는 그 문제들 중 하나를 발견 할 수 있었다. 실제로 "the imgTomo1.convertTo (imgTomo, CV_8UC1);" float32를 8bit로 변환하여 정보를 잃어 버렸습니다. 지금, 나는 이미지를 가지고있다. 그러나 그것은 조금 엉망이다. 그리고 많은 "눈"(나는 그렇지 않다면 그것을 두는 법을 모르고있다)이 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/)를 참조하십시오. –

관련 문제