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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

506閲覧

openCVのグレースケールが適応されない

yayuyo

総合スコア0

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/04/27 10:31

やったこと

Qiitaの記事を参考にプログラムを組み直しました.
具体的には,Qiitaではイベントカメラの動画がカラーになっていますが,
動いた箇所を白一色で表示し,それ以外は黒色で表示しようとしています.
なので,画像をグレースケールに変換後,二値化による処理をしたいのですがうまくいきません.
下の該当箇所である,

python

1 b_img = cv2.cvtColor(b_img, cv2.COLOR_BGR2GRAY)

をコメントアウトすると二値化した動画を作成できます.
しかしコメントアウトをしないと開けない動画が作成されるためここが原因だと考えています.

python

1import numpy as np 2import cv2 3 4# th= 閾値 5def img2event_image(base_img, img, th = 30, plus = 1, minus = -1): 6 img3 = base_img.astype(float) - img.astype(float) 7 8 index1 = img3 > th 9 img3[index1] = plus 10 11 index2 = img3 < -1 * th 12 img3[index2] = minus 13 14 img3[~(index1) & ~(index2)] = 0 15 16 return img3.astype(np.uint8) 17 18 19def __main(): 20 path = "./sample.mp4" 21 output_name = "./output.mp4" 22 23 cap = cv2.VideoCapture(path) 24 fourcc = cv2.VideoWriter_fourcc(*"mp4v") 25 w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 26 h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 27 fps = 30 28 out = cv2.VideoWriter(output_name, fourcc, fps, (w, h)) 29 30 success, image = cap.read() 31 base_image = image[:] 32 33 while success: 34 b_img = img2event_image(base_image.copy(), image.copy()) 35 36 b_img = cv2.cvtColor(b_img, cv2.COLOR_BGR2GRAY)#該当の箇所 37 b_img = cv2.threshold(b_img,85,255,cv2.THRESH_BINARY_INV)[1]#2値化で白黒にする 38 39 out.write(b_img) 40 base_image = image[:] 41 # 1フレームずつ取得する 42 success, image = cap.read() 43 44 print("done") 45 cap.release() 46 cv2.destroyAllWindows() 47 48if __name__ == '__main__': 49 50 __main()

どのようにプログラムを変更すればよろしいでしょうか?
よろしくお願いいたします.

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/04/27 21:15 編集

時間の都合で実際に動作確認をしていないままコメントします。保証がないのであくまでコメントです。 うまくいったらどうか自己解決で解答欄に動くコードを書いてください。 ・img2event_imageで差分を取ってスレショルド処理をしようとしていますが、「カラー画像-カラー画像」をしている部分に違和感を感じます。img2event_imageの中でグレースケール画像化してから引き算、そしてスレショルドするとうまくいくかもしれません。 ・「 b_img = cv2.cvtColor(b_img, cv2.COLOR_BGR2GRAY)」をコメントアウトすると動画が開けなくなる理由は、 1. VideoWriterで縦横の画像(=カラーチャネルのないグレースケール画像)をしていしている 2. スレショルドはカラー画像を想定されていない(グレースケール画像に対して働く)野にカラー画像を突っ込んでいる 3. 先の1.2の結果何が出てくるか分からないものが動画ファイルに送り込まれる(フォーマット不一致が起きている可能性)ためと思います。 ・ どうすればよいか? 1. スレショルド前にカラー画像をグレースケール画像化してください 2. グレースケール画像同士の引き算をしてください 3. 引き算結果をスレショルドしてください 4. うまくスレショルドできないようであれば、引き算の結果をfloatから、0-255のnp.uint8のフォーマットに変換してください(もしfloatが0-1であれば*255のようなことも検討ください)
yominet

2022/04/28 15:25

質問が良くわからないで確認させてください。 >をコメントアウトすると二値化した動画を作成できます. 動画ができるのであればそれでいいのでは? それとも 「コメントアウトすると二値化した画像を作成できる(imshowなどで一枚ずつ確認)が、  動画として書き出すのは失敗する」 でしょうか? そうでなければ下は気にしないでください。 ======================== 現在のソースでは out.write(b_img)にて、CV_8UC1のデータを入れているように見えます。 thresholdしたあと、out.writeする前に b_img = cv2.cvtColor(b_img, cv2.COLOR_GRAY2BGR) を挟んでみたらいかかでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問