47

OpenCV C++ 標準の cv::Mat タイプを QImage に変換するにはどうすればよいでしょうか。私は周りを探していましたが、運がありません。IPlimage を QImage に変換するコードをいくつか見つけましたが、それは私が望むものではありません。ありがとう。

4

10 に答える 10

45

Michal Kottman の回答は有効で、一部の画像では期待どおりの結果が得られますが、場合によっては失敗します。これが私がその問題に対して見つけた解決策です。

QImage imgIn= QImage((uchar*) img.data, img.cols, img.rows, img.step, QImage::Format_RGB888);

違いは img.step 部分を追加することです。それがなくても qt は文句を言いませんが、一部の画像はそれがないと正しく表示されません。これが役立つことを願っています。

于 2012-09-07T05:40:36.090 に答える
29

cv::Matからに変換するには、次のようにコンストラクターQImageを使用してみてください(は):QImage(uchar * data, int width, int height, Format format)matcv::Mat

QImage img((uchar*)mat.data, mat.cols, mat.rows, QImage::Format_RGB32);

手動でピクセルをに変換するよりも効率的QImageですが、元のcv::Mat画像をメモリに保持する必要があります。簡単にに変換して、 :QPixmapを使用して表示できます。QLabel

QPixmap pixmap = QPixmap::fromImage(img);
myLabel.setPixmap(pixmap);

アップデート

OpenCVはデフォルトでBGR順序を使用するため、最初cvtColor(src, dst, CV_BGR2RGB)にQtが理解できる画像レイアウトを取得するために使用する必要があります。

アップデート2:

表示しようとしている画像のストライドが標準的でない場合(非連続のサブマトリックスの場合)、画像が歪んで表示されることがあります。cv::Mat::step1()この場合、 :を使用してストライドを明示的に指定することをお勧めします。

QImage img((uchar*)mat.data, mat.cols, mat.rows, mat.step1(), QImage::Format_RGB32);
于 2011-02-17T23:46:10.933 に答える
29

これは、24 ビット RGB およびグレースケール浮動小数点のコードです。他のタイプに簡単に調整できます。それはそれが得るのと同じくらい効率的です。

QImage Mat2QImage(const cv::Mat3b &src) {
        QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
        for (int y = 0; y < src.rows; ++y) {
                const cv::Vec3b *srcrow = src[y];
                QRgb *destrow = (QRgb*)dest.scanLine(y);
                for (int x = 0; x < src.cols; ++x) {
                        destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
                }
        }
        return dest;
}


QImage Mat2QImage(const cv::Mat_<double> &src)
{
        double scale = 255.0;
        QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
        for (int y = 0; y < src.rows; ++y) {
                const double *srcrow = src[y];
                QRgb *destrow = (QRgb*)dest.scanLine(y);
                for (int x = 0; x < src.cols; ++x) {
                        unsigned int color = srcrow[x] * scale;
                        destrow[x] = qRgba(color, color, color, 255);
                }
        }
        return dest;
}
于 2012-01-15T01:56:28.963 に答える
4
    Mat opencv_image = imread("fruits.jpg", CV_LOAD_IMAGE_COLOR); 
    Mat dest;
    cvtColor(opencv_image, dest,CV_BGR2RGB);
    QImage image((uchar*)dest.data, dest.cols, dest.rows,QImage::Format_RGB888);

これが私のために働いたものです。上記の Michal Kottman のコードを修正しました。

于 2012-02-05T19:34:08.363 に答える
2

cv::Mat には IplImage への変換演算子があるため、IplImage を QImage に変換するものがある場合は、それを使用します (または、おそらくマイナーな調整を行って cv::Mat を直接取得すると、メモリ レイアウトは同じですが、異なるのはヘッダーの「だけ」です。)

于 2011-02-17T10:24:22.683 に答える
2

この投稿QImageでは、aを OpenCVIplImageに、またはその逆に変換する方法を示します。

その後、次のように変換するのに助けが必要なIplImage*場合cv::Mat:

// Assume data is stored by: 
// IplImage* image;

cv::Mat mat(image, true); // Copies the data from image

cv::Mat mat(image, false); // Doesn't copy the data!

これはハックですが、仕事は完了します。

于 2011-12-08T19:28:50.107 に答える
1

深度画像には静的関数 convert16uc1 を使用します。

QPixmap Viewer::convert16uc1(const cv::Mat& source)
{
  quint16* pSource = (quint16*) source.data;
  int pixelCounts = source.cols * source.rows;

  QImage dest(source.cols, source.rows, QImage::Format_RGB32);

  char* pDest = (char*) dest.bits();

  for (int i = 0; i < pixelCounts; i++)
  {
    quint8 value = (quint8) ((*(pSource)) >> 8);
    *(pDest++) = value;  // B
    *(pDest++) = value;  // G
    *(pDest++) = value;  // R
    *(pDest++) = 0;      // Alpha
    pSource++;
  }

  return QPixmap::fromImage(dest);
}

QPixmap Viewer::convert8uc3(const cv::Mat& source)
{
  quint8* pSource = source.data;
  int pixelCounts = source.cols * source.rows;

  QImage dest(source.cols, source.rows, QImage::Format_RGB32);

  char* pDest = (char*) dest.bits();

  for (int i = 0; i < pixelCounts; i++)
  {
    *(pDest++) = *(pSource+2);    // B
    *(pDest++) = *(pSource+1);    // G
    *(pDest++) = *(pSource+0);    // R
    *(pDest++) = 0;               // Alpha
    pSource+=3;
  }

  return QPixmap::fromImage(dest);
}

QPixmap Viewer::convert16uc3(const cv::Mat& source)
{
  quint16* pSource = (quint16*) source.data;
  int pixelCounts = source.cols * source.rows;

  QImage dest(source.cols, source.rows, QImage::Format_RGB32);

  char* pDest = (char*) dest.bits();

  for (int i = 0; i < pixelCounts; i++)
  {
    *(pDest++) = *(pSource+2);    // B
    *(pDest++) = *(pSource+1);    // G
    *(pDest++) = *(pSource+0);    // R
    *(pDest++) = 0;               // Alpha
    pSource+=3;
  }

  return QPixmap::fromImage(dest);
}
于 2013-06-10T13:42:30.810 に答える