質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

Q&A

解決済

1回答

5692閲覧

動画のグレースケール変換について

QQQP

総合スコア15

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

0グッド

1クリップ

投稿2019/01/22 03:03

編集2019/01/23 02:57

動画処理の勉強をしています。動画の反転はできたのですが、そこの反転させる関数をグレースケールにする関数にすると、保存された動画ファイルを見ることができません。
環境はopencv4.0.0,windouws10,Visualstudio2017,C++です。
これができないと前へ進めず困っています。
どなたかご返答よろしくお願いします。

補足 すいませんソースコード貼るの完全に忘れていました。

#include <opencv2/opencv.hpp>

int main(void)
{
// 動画ファイルを取り込むためのオブジェクトを宣言する
cv::VideoCapture cap;
cap.open("C:/opencv/sources/samples/data/Megamind.avi");

// 動画ファイルが開けたか調べる if (cap.isOpened() == false) { printf("ファイルが開けません。\n"); return -1; } // 作成する動画ファイルの諸設定 int fourcc, width, height; double fps; width = (int)cap.get(cv::CAP_PROP_FRAME_WIDTH); // フレーム横幅を取得 height = (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT); // フレーム縦幅を取得 fps = cap.get(cv::CAP_PROP_FPS); // フレームレートを取得 fourcc = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); // AVI形式を指定 // * エンコード形式 "XVID" = AVI, "MP4V" = MPEG4, "WMV1" = WMV // 動画ファイルを書き出すためのオブジェクトを宣言する cv::VideoWriter writer; writer.open("ビデオ.avi", fourcc, fps, cv::Size(width, height)); // 画像を格納するオブジェクトを宣言する cv::Mat frame, dst; for (;;) { // 1フレームを取り込む cap >> frame; // cap から frame へ // 画像から空のとき、無限ループを抜ける if (frame.empty() == true) { break; } // ウィンドウに画像を表示する cv::imshow("変換中", frame); //ここにグレースケールの関数を入れると保存されたファイルが再生できない。※1 // 動画ファイルへ書き出す writer << dst; // dst から writer へ // 1ms待つ cv::waitKey(1); } return 0;

}

これがソースコードです。
今は書いていませんが、グレースケールにするときは※1のところにcvtColor(frame, gray_frame, cv::COLOR_BGR2GRAY);を書き込んでいます。
もちろんその時はgray_frameを宣言もしています。
どなたか詳しい方よろしくお願いします。

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

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

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

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

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

coco_bauer

2019/01/22 03:15

プログラムが示されていないので、手のつけようがありません。「保存された動画ファイル」というのは、どのようにして作成されたものなのかも明らかにしてください。
guest

回答1

0

ベストアンサー

グレースケールにすると、チャンネル数が1チャンネルになってしまうので、色合いをグレースケールにしたいだけであれば、一旦グレースケールにしたあと、BGR に戻してみてはどうでしょうか。

cpp

1cv::Mat dst; 2cvtColor(frame, dst, cv::COLOR_BGR2GRAY); 3cvtColor(dst, dst, cv::COLOR_GRAY2BGR);

投稿2019/01/23 04:31

tiitoi

総合スコア21956

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

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

QQQP

2019/01/24 02:03

回答ありがとうございます。グレースケールにすることは無事にできました。ありがとうございます。 ここから2値化しようとしてしたのですが、 //ここにグレースケールの関数を入れると保存されたファイルが再生できない。 cv::Mat bin_im; //2値画像を入れておくためのMat threshold(dst, bin_im, 160, 255, cv::THRESH_BINARY); //閾値160で2値画像に変換 threshold(dst, bin_im, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);//閾値を自動で設定 // 動画ファイルへ書き出す writer << bin_im; // dst から writer へ このようにし、読み込む画像をグレースケールのものにしたのですが、ここからちゃんと画像を保存するにはどうすればいいでしょうか? 質問ばかりで申し訳ないです。
tiitoi

2019/01/24 02:06

グレースケールの画像を書き出す場合は、全部 BGR に戻してから書き出してください cvtColor(bin_im, bin_im, cv::COLOR_GRAY2BGR); writer << bin_im;
QQQP

2019/01/25 01:53

cv::Mat bin_im; //2値画像を入れておくためのMat threshold(dst, bin_im, 160, 255, cv::THRESH_BINARY); //閾値160で2値画像に変換 threshold(dst, bin_im, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);//閾値を自動で設定 writer << bin_im; // 動画ファイルへ書き出す writer << bin_im; // din_imから writer にしたのですが、二値化した動画を保存というか例外がスローされます。 読み込んでる動画はグレースケールのもので上に記した場所以外は変更していません。どうにか動画を二値化できないでしょうか?
tiitoi

2019/01/25 04:23 編集

上のコメントに書いたのは 2値画像も OpenCV で扱う上ではグレースケール画像と同じ、 CV_8UC1 型の cv::Mat として扱われるので、以下で BGR に変換してから、出力してみてください ということです。 cvtColor(bin_im, bin_im, cv::COLOR_GRAY2BGR); writer << bin_im;
tiitoi

2019/01/25 04:23

OpenCV では2値画像は輝度値が2種類しかないグレースケール画像と考えてよいです。
QQQP

2019/01/25 06:24

何度も本当にすいません。 //ここにグレースケールの関数を入れると保存されたファイルが再生できない。 cv::Mat bin_im; //2値画像を入れておくためのMat threshold(frame, bin_im, 160, 255, cv::THRESH_BINARY); //閾値160で2値画像に変換 threshold(frame, bin_im, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);//閾値を自動で設定 cvtColor(bin_im, bin_im, cv::COLOR_GRAY2BGR); // 動画ファイルへ書き出す writer << bin_im; // bin_im から writer へ という風にしたのですがやはり例外がスローされてしまいます。 どこか勘違いをしているようでしたらご指摘お願いします。 何度も聞いてしまい申し訳ございません。
yominet

2019/01/28 17:06

thresholdに渡している第一引数に グレースケールにしたgray_frameが使われていません cv::thresholdは、以前はシングルチャンネル専用でしたが OpenCV3以降マルチチャンネルに対応したので カラー画像(CV_8UC3)を渡すと、「各色の2値化」をしたカラー画像を返します。 ただし、cv::THRESH_OTSUなどは対応してないためシングルチャンネル専用になります。 例外スローされているのはたぶんこれが原因 おまけ: writerのほうをシングルチャンネルにする手もありかな
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問