🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2985閲覧

QML カメラ映像を表示しながらOpenCvで処理を行いたい

taichaso

総合スコア22

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/10/08 00:59

前提・実現したいこと

いつもお世話になっております。

カメラ映像を表示しつつ、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/10/08 02:15

画像のフォーマットをRGB系にしたらどうなりますか?
taichaso

2019/10/08 02:22

cv::cvtColor(src, dst, CV_YUV2BGR); といった形でしょうか? こちらも試して見たのですがエラーは起きず、出力結果はグレーのままでした
t_obara

2019/10/08 02:27

違います、元の動画のフォーマットをYUV系ではなく、RGB系にしたらという意味です。
taichaso

2019/10/08 03:44

今回カメラの映像を使っているので私の方ではフォーマットの変更方法がわかりませんでした。 もしご存知であれば回答をお願いしたいです。
t_obara

2019/10/08 08:16

カメラの設定にあるのではないでしょうか、ないかもしれませんが。 ちなみに、なぜフォーマットを気にするかと言うと、以下ドキュメントに、「 In general QImage does not handle YUV formats.」と言う記載があるからです。 https://doc.qt.io/qt-5/qvideoframe.html#imageFormatFromPixelFormat
taichaso

2019/10/08 09:52

調査ありがとうございます。 現在使用しているカメラだとYUVで取りたいのでこの方法だと厳しいことがわかりました。
guest

回答1

0

自己解決

現在のカメラのフォーマットが YUVに対して、Qtのフォーラムには以下のように書かれていました

In general QImage does not handle YUV formats.

https://doc.qt.io/qt-5/qvideoframe.html#imageFormatFromPixelFormat

今回のカメラはYUVでしか利用できないのでこの方法は不可能と判断しました。
別の方法で挑戦してみようと思います。

投稿2019/10/08 09:53

taichaso

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問