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

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

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

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

Python 3.x

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

Raspberry Pi

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

Q&A

解決済

1回答

2851閲覧

RAWデータ(Y8フォーマット)をPython(+OpenCV)で画像処理したい(前回続き)

Uka

総合スコア28

OpenCV

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

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2021/11/08 09:21

編集2021/11/08 10:30

前提・実現したいこと

Y8(Y800)フォーマットで取得したカメラ画像について、Python(+OpenCV)を使って画像処理したいと考えています。前回質問したときに教えていただいたプログラムで画像を表示できるようになりましたが、下図のように縞模様になってしまいます。(他の画像もすべて同じ現象です)
IrfanVeiw64という画像ビュワーアプリを使ってRAWデータを表示すると、下図のように縞模様にはならないため、撮影、データ保存はできていると考えています。下記のPythonプログラムではバイナリ形式のRAWファイルを1ピクセルあたり8ビットとしてファイルを読み込んでから、640x400に再配列化していると理解しています。このコード以外に必要な操作があれば、アドバイスいただけますとありがたいです。よろしくお願いいたします。

※前回、解決済とした後に縞模様現象になっていることに気づいたため、立て続けの投稿になります。

使用カメラ:
Raspberry Pi インダストリアルカメラ OV9281 外部トリガー モノクロ グローバル シャッターセンサー
撮影条件:
画像解像度: 640x400
フレームレート:250fps(実際には、メモリなどの問題で210fps程度で取得されています)
取得画像のフレームサイズ:約1MB/フレーム

【Pythonで表示させた画像】
黒く表示されている行は画素が0の行に対応しているのかと思っていましたが、下の【参考】各画素の値にあるように、出力は1行おきに0になっているので、それであればもっと緻密な縞模様になるのではないかとも思いました...
イメージ説明

【IrfanVeiw64で表示させた画像】
※ちょっと暗いですが、同じ数字が表示されています。拡大表示しても縞模様は見えませんでした。
イメージ説明

【参考】IrfanView64の設定画面
イメージ説明

【参考】各画素の値(Pythonプログラム中のimをテキストファイルで出力、640x400の値を一部表示)
イメージ説明

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Python

1import numpy as np 2import cv2 3from matplotlib import pyplot as plt 4 5fd = open('00001.raw', 'rb') 6rows = 400 7cols = 640 8f = np.fromfile(fd, dtype=np.uint8,count=rows*cols) 9im = f.reshape((rows, cols)) #notice row, column format 10fd.close() 11 12 13# ここからグラフ設定 14# フォントの種類とサイズを設定する。 15plt.rcParams['font.size'] = 14 16plt.rcParams['font.family'] = 'Times New Roman' 17fig = plt.figure() 18ax1 = fig.add_subplot(111) 19 20# 画像をプロット 21ax1.imshow(im, cmap='gray') 22 23# 軸のラベルを設定する。 24ax1.set_xlabel('x [pix]') 25ax1.set_ylabel('y [pix]') 26 27fig.tight_layout() 28plt.show() 29plt.close() 30

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

yuki23

2021/11/08 11:16

問題の raw 画像データをどこかにアップロードしていただけますか?
退会済みユーザー

退会済みユーザー

2021/11/08 12:30 編集

カメラの取説にインタレースだとかプログレッシブとかないですか? 処理速度を上げるためにインタレースモード(縞々にしてデータを半分にして転送)になっている、、IrfanViewは賢いから内挿して表示している(だから暗くなっている?)、という気がします。
Uka

2021/11/08 14:18

>fourteenlengthさん ご回答ありがとうございます。カメラの取説にはインタレースだとかプログレッシブというような用語は見当たりませんでしたが、あり得る推測だと思いましたので、試しに遅めのfpsモードでも撮影してみたところ(解像度1280x800で、144fps)、偶数行も0でない画素値を取得されており、pythonプログラムも縞模様にならずに表示されました。おっしゃるように、高fpsモードでは転送速度をあげるためにインタレースモードになっているようです。前回に引き続きアドバイスをいただき、本当にありがとうございました。
guest

回答1

0

自己解決

fourteenlengthさんからアドバイスいただいたとおり、処理速度を上げるためにインタレースモードでデータ転送されているようです。
参考サイト:https://www.toa.co.jp/miru2/column/column6.htm
その根拠として、140fpsのカメラモードで撮影すると、pythonプログラムで縞模様にならずにすべて画素で非ゼロとなり、表示されました。高fps(今回でいうと250fps)で取得することが目的なため、縞模様になる部分(画素値が0になる行)は、補完を行って全体の画像を表示できるようにしたいと考えています。

2021.11.13訂正
その後、球体を静止時で撮影してみたところ(高fpsで)、縞模様込みで、横にひずんだ形(楕円形)となってデータ取得されていることがわかりました。これをOpenCVを使って縞模様の部分を削除する処理を行ったところ、画像の縦サイズは半分となり、球体の絵が得られました。

投稿2021/11/09 15:49

編集2021/11/14 15:51
Uka

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問