конвертировать Qimage в формат cvMat 64FC3

Я много искал в Интернете, но нашел только то, как преобразовать Qimage в формат RGB, я хочу преобразовать Qimage в формат cv mat CV_64FC3. у меня действительно плохие результаты, когда я работаю с CV_8UC3

вот мой код:

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


person ner    schedule 09.05.2016    source источник


Ответы (2)


Не уверен, что вы имеете в виду под плохими результатами, но вы предполагаете, что QImage также загружает изображение как OpenCV (BGR). В документации сказано, что они используют ARGB.

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

  1. Преобразуйте в QImage::Format_RGB888 Qimage с помощью функции convertToFormat, а затем эта строка cvtColor(tmp, result,CV_BGR2RGB); не нужен, так как он уже будет в RGB.
  2. Используйте CV_8UC4 при создании cv::Mat, а затем удалите первый канал (альфа-канал), используя либо разделение и объединение, либо микширование каналов.
person api55    schedule 09.05.2016

я обнаружил, что пошло не так, на самом деле, у 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; 
}
person ner    schedule 09.05.2016