前提・実現したいこと
いつもお世話になっております。
カメラ映像を表示しつつ、OpenCVを用いた処理を行いたいと考えています。
しかし、映像の取得がうまく出来ずに躓いています。
発生している問題・エラーメッセージ
こちらのサイトを参考にしながら取り組んでいたのですが、
QImageの取得に失敗?しているようでQImageの中身が null になってしまいます。
また、QImageを参考にして直接cv::Matを生成した場合はグレースケール化してしまい今回行いたいことができなくなってしまいます。
その時の確認方法として、 cv::imwrite()で書き出し、 cv::VideoWriterで映像の作成を行いました。
該当のソースコード
cpp
1QVideoFrame QCvDetectFilterRunnable::run(QVideoFrame* input, const QVideoSurfaceFormat& surfaceFormat, RunFlags flags) 2{ 3 Q_UNUSED(flags); 4 input->map(QAbstractVideoBuffer::ReadOnly); 5 6 if (surfaceFormat.handleType() == QAbstractVideoBuffer::NoHandle) 7 { 8 // サイトを参考に mat の取得 9 QImage image(input->bits(), 10 input->width(), 11 input->height(), 12 QVideoFrame::imageFormatFromPixelFormat(input->pixelFormat())); 13 image = image.convertToFormat(QImage::Format_RGB888); 14 15 if (image.isNull == true) { 16 qDebug("image is null"); 17 } 18 19 cv::Mat mat(image.height(), 20 image.width(), 21 CV_8UC3, 22 image.bits(), 23 image.bytesPerLine()); 24 25 // matの中身が無いため、出力できない 26 27 // QImageを使わずに matを取得 28 cv::Mat src(input->height(), input->width(), CV_8UC3, input->bits(), input->bytesPerLine()); 29 30 cv::imwrite("/home/user/img.png", src); // グレースケールの画像 31 } 32 else 33 { 34 qDebug() << "Other surface formats are not supported yet!"; 35 } 36 37 input->unmap(); 38 return *input; 39} 40
試したこと
Matをカラー変換をかけて見たのですが結果としては色が表示されることはなかったです。
また、画像のフォーマットは YUV444 でした。
補足情報(FW/ツールのバージョンなど)
Linux ubuntu 16.04 LTS
Qt 5.10.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit)
Qt Creator 4.5.1
OpenCv 3.4.2
回答1件
あなたの回答
tips
プレビュー