2016-05-09 65 views
1

我在網上搜索了很多,但我只找到如何將Qimage轉換爲RGB格式,我想將Qimage轉換爲CV MAT格式CV_64FC3。 我有非常糟糕的結果,當我與CV_8UC3將Qimage轉換爲cvMat 64FC3格式

在這裏工作是我的代碼:

QImage myImage; 
myImage.load("C://images//PolarImage300915163358.bmp"); 

QLabel myLabel; 
myLabel.setPixmap(QPixmap::fromImage(myImage)); 

//myLabel.show(); 

cv::Mat image1 = QImage2Mat(myImage); 



Mat img; 

image1.convertTo(img, CV_64FC3, 1.0/255.0); 

這裏是我使用的功能:

cv::Mat QImage2Mat(QImage const& src) 
{ 
    cv::Mat tmp(src.height(),src.width(),CV_8UC3,(uchar*)src.bits(),src.bytesPerLine()); 
    cv::Mat result; // deep copy just in case (my lack of knowledge with open cv) 
    cvtColor(tmp, result,CV_BGR2RGB); 
    return result; 
} 

請幫助我即時通訊新的既opencv和Qt

回答

1

不確定你的意思是不好的結果,但你假設QImage也加載圖像作爲OpenCV(BGR)。在文檔中它告訴你他們使用ARGB

所以,知道了這個,你有兩個選擇:

  1. 轉換使用功能convertToFormat和則不需要此行cvtColor(tmp, result,CV_BGR2RGB);QImage::Format_RGB888Qimage,因爲這將是已經在RGB。
  2. 創建cv::Mat時使用CV_8UC4,然後使用拆分和連接或混合通道刪除第一個通道(通道alpha)。
1

我已經找到了什麼事情錯了,其實,QImage的有阿爾法第四頻道,這樣當你閱讀QImage的數據,你需要把它放在CV_8UC4

這裏是代碼:

Mat QImage2Mat(const QImage& src) { 
    cv::Mat mat = cv::Mat(src.height(), src.width(), CV_8UC4, (uchar*)src.bits(), src.bytesPerLine()); 
    cv::Mat result = cv::Mat(mat.rows, mat.cols, CV_8UC3); 
    int from_to[] = { 0,0, 1,1, 2,2 }; 
    cv::mixChannels(&mat, 1, &result, 1, from_to, 3); 
    return result; 
}