光跡を用いたイメージセンサ通信に係るコードです.
各フォルダについての説明を以下に記します.
-
Polar
- Polar符号を用いて符号語を作成するためのプログラムを格納
- "data_generate.py"を使用してください
- Polar_Code.py
- Polar符号に関する関数がまとめられたヘッダファイルです
- capacity_cal.py
- 通信路容量を計算するためのプログラムです
- Polar符号を用いて符号語を作成するためのプログラムを格納
-
P-TX
- 送信機(P-Tx)を制御するためのプログラムを格納
- "test_polar.ino"では,ヘッダファイル"polarcodes.h"をインクルードしています
- 送信機(P-Tx)を制御するためのプログラムを格納
-
Converting video to images
- 撮影動画を画像に分割するためのプログラムを格納
- "Converting video to images.exe"を使用してください
- 撮影動画を画像に分割するためのプログラムを格納
-
P-RX
- 分割した画像からデータを復調するためのプログラムを格納
- 各プログラムについては下記を参照してください(上から順に実行します)
-
preprocess.py
- 奇数番目のファイルを削除し,以降の処理のためにファイル名を連番に変更します
- 上記を正常に動作させるための下処理を下記に記述します
- 撮影画像を確認し、データパターンが1回転分完全に撮影されているものを完全データとし、1回転の途中で途切れているものを不完全データとします
- preprocess.pyではフォルダ内の奇数番目画像を削除するため、撮影画像の生データのうち最初の画像が不完全データになるように、それ以前の画像をすべて削除します。
- 最初に送信する最外周のみ点灯のパターンは不要なので削除してください。それ以降に現れる最初の不完全データ画像群の始めになるようにします。
- プログラム内のパス設定(folder_path)を画像の保存先と対応するように設定します。
- プログラムを実行してください。
- 同じフォルダに奇数番目のファイルを削除しファイル名を連番に変更した画像が出力されます。
- 奇数番目のファイルを削除し,以降の処理のためにファイル名を連番に変更します
- 上記を正常に動作させるための下処理を下記に記述します
-
Demosaicing.py
- 撮影画像に対してBayer変換を施します
- プログラム内のパス設定(input_dir)を画像の保存先と対応するように設定します。
- プログラムを実行してください。
- 新規フォルダ(output_dir = 'Demosaicing_imgs/')にデモザイキング処理された画像が出力されます。
- 元画像と同じ枚数の新規画像が出力されるため、実行には数分ほどかかります。
-
Hough_circle_detect.py
- 撮影画像からP-Txの中心座標と半径を検出します
- Demosaicing_imgsフォルダ内にある7.png画像を参照し、円検出を行います
- 円の中心座標と半径がターミナルに出力され、検出された円の中心(赤点)と半径(最外周を緑でマーキング)をプロットした画像(Hough_circle_detect.png)が同じディレクトリに保存されます。
- このプログラムで円検出が正常に行われない場合(とくに遠距離)では、7.pngを画像編集アプリ(ペイントなど)で開き、手動で円の中心座標と半径を算出します。
- 円の半径は最外周の光跡がすべて収まるようにやや広めに設定する。
-
Polar_Trans_imgs.py
- 撮影画像に対して回転座標系変換を施します
- "Polar_Trans_confirm.py"は検出した中心座標と半径が正しいかを確認するために使用します
- はじめにPolar_Trans_confirm.py内の"center","radius"をHough_circle_detect.pyで検出した値を基に設定。
- Demosaicing_imgsフォルダ内にある0.pngと1.pngに対して回転座標系変換した画像をPolarTrans_confirmフォルダ内に保存
- 上記の画像を確認し、光跡が直線に並んでいるか、最外周の光跡が完全に映っているかを確認します。
- 上記を満たさない場合には、"center","radius"の値を調整します。 - 上記を満たす場合には、Polar_Trans_confirm.pyで使用した"center","radius"の値をPolar_Trans_imgs.py内の"center","radius"の値に設定する。
- Polar_Trans_imgs.pyを実行します。
- Polar_Trans_imgs.pyでは、Demosaicing_imgsフォルダ内の全ての画像に対して、回転座標系変換を行い、変換後の画像をPolarTrans_imgsフォルダに保存します。
-
DivideToZones.py
- 座標系変換を施した後の画像をzoneごとに各フォルダに分割します
- PolarTrans_imgsフォルダの画像を各zoneのフォルダ(zone1,zone2,zone3)に振り分けます。 - 各フォルダにはそのzoneのパイロット画像とそのzoneのデータ信号が撮影された画像が格納されます。
-
以降では、各zoneごとに復調を行います。
-
ターミナルカレントディレクトリを各zoneのディレクトリに対応するように移動してください。
-
下記にzone1の場合を示します。
-
binary_pilot_zone1.py
- zone1に対応するパイロット信号画像に対して2値化を行います
- 2値化に使う閾値(threshold)を手動で設定する必要があります。
- 閾値は2値化後の各光跡がはっきり映るように設定してください。(通信距離などに依存)
- 2値化後のパイロット画像(200.png,201.png)を画像編集アプリ(ペイントなど)で適切に修正する必要があります。
- 詳細は後日追記するかも。。。
- zone1に対応するパイロット信号画像に対して2値化を行います
- 2値化に使う閾値(threshold)を手動で設定する必要があります。
-
nopolar_decoding_zone1.py
- polar符号を考慮しない場合(符号化なし)の復調を行います
- 復調の流れを以下に示します。
- 200.png,201.pngから全光跡の重心座標を特定
- 0.png,1.pngにおいて、先ほど特定した光跡の重心座標での画素値を取得。("0"および"1"のデータが同数)
- 取得した画素値の中央値をデータ判定に使う閾値として設定。
- data_start.pngを用いて、データ開始位置を特定 - data_start.pngでは最初の光跡のみを点灯させている。
- 特定した全光跡の重心座標におけるdata_start.png内の画素値を抽出し、4列すべてが画素値を持つときの行をデータ開始位置とする。
- データ画像(3.png~122.png)において、全光跡座標での画素値を抽出し、設定した閾値を用いて2値判定を行う。
- 閾値判定された結果と正解データ(zone1_data.txt)を比較し、BERを算出。
-
polar_decoding_zone1.py
-
polar符号を考慮する場合の復調を行います
-
zone2,zone3についてもzone1と同様に実行できます。
-
-
decoding_functions.py
- 復調に関する関数がまとめられたヘッダファイルです
-
Polar_Code.py
- Polar符号に関する関数がまとめられたヘッダファイルです
-
- 各プログラムについては下記を参照してください(上から順に実行します)
- 分割した画像からデータを復調するためのプログラムを格納