1

インターネットでたくさん検索しましたが、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の両方に不慣れな私を助けてください

4

2 に答える 2

1

悪い結果が何を意味するのかわかりませんが、QImageもイメージを OpenCV としてロードすると仮定しています ( BGR)。ドキュメントでは、彼らが使用していることがわかりますARGB

したがって、これを知っていると、次の 2 つのオプションがあります。

  1. 関数を使用して に 変換するとQImage::Format_RGB888、既に RGB になっているため、この行は必要ありません。QimageconvertToFormatcvtColor(tmp, result,CV_BGR2RGB);
  2. CV_8UC4を作成するときに使用cv::Matし、分割と結合または mixchannels を使用して最初のチャネル (チャネル アルファ) をドロップします。
于 2016-05-09T09:57:40.830 に答える
1

実際、Qimageにはアルファ用の4番目のチャネルがあるため、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; 
}
于 2016-05-09T13:09:44.507 に答える