2016-05-09 4 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 ()). В документации говорится, что они используют ARGB.

Итак, зная, что это у вас есть 2 варианта:

  1. Измени QImage::Format_RGB888 в Qimage с помощью функции convertToFormat, а затем эта линия cvtColor(tmp, result,CV_BGR2RGB); не требуется, так как это будет уже в RGB.
  2. Используйте CV_8UC4 при создании cv::Mat, а затем отпустите первый канал (канал альфа), используя разделенные и соединяющие или микшированные каналы.
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; 
}