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

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

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

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

Q&A

解決済

3回答

999閲覧

RaspberryPiCameraModuleV2で取得したフレームの上半分が青がかる現象

takes.it.easy

総合スコア18

OpenCV

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

0グッド

0クリップ

投稿2021/09/23 04:34

前提・実現したいこと

Raspberry PiでCameraModuleV2からフレームを取得した際,フレームの上半分が青みがかる現象が発生しました.取得にはOpenCVを使用しており,OpenCVのプロパティ設定でFRAME_WIDTHを160に,FRAME_HEIGHTを120に,FPSを20に設定しています.

デフォルトのプロパティではFRAME_WIDTHが640,FRAME_HEIGHTが480,FPSが30であり,青みがかる現象は発生しません.

他のUSBカメラで同様のことが起こるかどうかはわかりません。

時たま,青みがかる現象がなくなる瞬間もありますが,現象が発生している時間の方が長いです.

原因と対処法をご存じの方がいらっしゃいましたら,ご助言をお願いします.

イメージ説明

該当のソースコード

Python

1import cv2 2 3cap = cv2.VideoCapture(0) 4cap.set(3, 160) 5cap.set(4, 120) 6cap.set(5, 20) 7 8while True: 9 ret, frame = cap.read() 10 cv2.imshow("Frame", frame) 11 12 if cv2.waitKey(25) & 0xFF == ord('q'): 13 break 14 15cap.release() 16cv2.destroyAllWindows()

試したこと

現象について様々調べましたが該当する記事などは見つかりませんでした.

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

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

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

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

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

guest

回答3

0

理由は分からないのですが、当方のラズパイとPi camera V2で確認したところ、水平方向が32の倍数、垂直方向が16の倍数の組み合わせなら大丈夫なようです

以下のコードで確認しました
「# 動画切り出しサイズ」の下にアスペクト比が4:3の組み合わせのみ書いてますが、それ以外の組み合わせでもざっと確認したところでは大丈夫なようでした
(あらゆる組み合わせで確認したわけではないので、ダメな組み合わせがあるかもしれませんが)

import cv2 # 動画表示サイズ w = int(640) h = int(480) cap = cv2.VideoCapture(0) if not cap.isOpened(): raise IOError('Cannot open camera') # 動画切り出しサイズ cap.set(3, 64) # 32*2 cap.set(4, 48) # 16*3 #cap.set(3, 128) # 32*4 #cap.set(4, 96) # 16*6 #cap.set(3, 192) # 32*6 #cap.set(4, 144) # 16*9 #cap.set(3, 256) # 32*8 #cap.set(4, 192) # 16*12 #cap.set(3, 320) # 32*10 #cap.set(4, 240) # 16*15 #cap.set(3, 384) # 32*12 #cap.set(4, 288) # 16*18 #cap.set(3, 448) # 32*14 #cap.set(4, 336) # 16*21 #cap.set(3, 512) # 32*16 #cap.set(4, 384) # 16*24 #cap.set(3, 576) # 32*18 #cap.set(4, 432) # 16*27 #cap.set(3, 640) # 32*20 #cap.set(4, 480) # 16*30 # ESCキーで終了 while True: ret, frame = cap.read() frame = cv2.resize(frame, (w, h), interpolation=cv2.INTER_NEAREST) cv2.imshow('camera', frame) c = cv2.waitKey(1) if c == 27: break cap.release() cv2.destroyAllWindows()

投稿2021/09/26 13:50

jbpb0

総合スコア7651

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

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

takes.it.easy

2021/09/27 06:05

そういう仕様、ということなのでしょうね、、、 有意義な情報有難うございます。
fana

2021/09/27 06:16 編集

> 水平方向が32の倍数、垂直方向が16の倍数 質問文にある 160*120 もこの条件には当てはまっていそうですが… 果たして? (その場合,FPSの設定の方が問題とか?) →いや,ふつーに当てはまってねぇw 算数ww 一番近いサイズとして縦128でいけるならそこで妥協できないか? って感じですね.上下4ライン捨てちゃうとか.
jbpb0

2021/09/27 10:14

pi camera block size 32x16 でググったら、ちらほら引っかかるのですが、そこに書かれてることと、この質問の現象がどう関係するのかが分からない
takes.it.easy

2021/09/29 06:06

今回はデフォルトの640 x 480でフレームを取得した後、160×120にリサイズすることで対応いたしました。 サイズの倍数(アスペクト比?)による影響も考えられるという事でもう少し調べてみます。ありがとうございました。
guest

0

ベストアンサー

お使いのカメラは

プロパティ設定でFRAME_WIDTHを160に,FRAME_HEIGHTを120に,FPSを20に設定しています.

という設定に対応しているのでしょうか?

VedeoCaptureでカメラが対応していない設定値をsetした場合に何が起こるのか? について私は知らないのですが,
デフォルト設定では問題が生じないということから,そのあたりに問題の原因があるのではないかと推測します.

160*120, 20FPS に設定すること自体がmustでないならば,
どうにかして正常に動作可能な設定値を探り出して,その中で一番近い設定を用いる的な方向で逃げることはできないのでしょうか?
(FPSはともかく,画像サイズについては他のサイズで取得した物をリサイズしてしまうような対応を取れるならば,そんな方向で)

投稿2021/09/23 09:40

fana

総合スコア11632

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

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

takes.it.easy

2021/09/23 10:18

その可能性は大いにあり得ると思います。 対応する設定値については調べたのですが、該当するような記事は見つけられていません。 その辺り、調べてみます。
fana

2021/09/23 10:36

「Raspberry Pi Camera Module V2 データシート」とか何とかググるとかして, そのカメラが公式にサポートしているモードとかを調べてみては.
takes.it.easy

2021/09/29 06:05

今回はデフォルトの640 x 480でフレームを取得した後、160×120にリサイズすることで対応いたしました。ありがとうございます。
guest

0

VideoCaptureについては経験がないのですが、cv2でのファイルからの画像読み込みで良く問題になるのがRGBとBGRの問題です。

Python, OpenCVでBGRとRGBを変換するcvtColorを読んで、色の並びの変換を試してみてください。

投稿2021/09/23 07:32

ppaul

総合スコア24666

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

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

takes.it.easy

2021/09/23 09:09

回答ありがとうございます。cv2のVideoCaptureによって読み込まれた画像はおそらくBGRだと思います。色の処理をする際,cv2.cvtColor(frame, COLOR_BGR2HSV)を使用するのでそこらへんは問題ないかと思っております。 念のため読み込まれた画像をRGB→BGRにしたりBGR→RGBにしたりと試しましたが青みがかったフレームに変化はありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問