物体検出や識別の応用として、デジタルデータになってしまえば対象はミクロ(顕微鏡や胃カメラみたいなファイバーカメラも(ミクロの決死圏ができるかも))も宇宙(望遠鏡も電波望遠鏡も、何でも)も拡張が可能ということで、事始めにデジタル顕微鏡の画像データ(とりあえず動画)を直接PCに取得してみた。
当面の目標
①PCに動画を取り込む
②ゾウリムシとかプランクトンとか、植物発生など物体識別機能をつける
【生物基礎】第1章 生物の特徴(細胞)@http://terakoya-seibutsu.hatenablog.com/より引用
③顕微鏡から双眼鏡や天体望遠鏡へ
④。。。
今回やったこと
①PCに動画を取り込む
もともと、kenko-デジタル顕微鏡は、ソフトがCD-Romで提供されているが、自前のPythonコードで取り込んだ
今回の機種は、「Do・Nature デジタルマイクロスコープ STV-451M II」
取得できた動画例
残念ながら、赤血球は見えませんでした。。。が凝固の時系列変化が見えました。
※どちらかというと、この顕微鏡(Max:400倍)だと肉眼で見える範囲の動的変化の観察によさそう。。
安価なデジタル顕微鏡で血液が凝固する様子を観察してみた♬(画像サイズ200x150)
<img src="http://img.youtube.com/vi/2PEXXtszcUI/0.jpg"
安価なデジタル顕微鏡で血液が凝固する様子を観察してみた♬II(画像サイズ640x480)
<img src="http://img.youtube.com/vi/a5dkGYPwXq8/0.jpg"
※画像をクリックするとYouTube動画につながります
コードは以下に置いた
コード解説
動画出力するためのおまじない関数を定義
from time import sleep
import cv2
def cv_fourcc(c1, c2, c3, c4):
return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)
動画のファイル名と出力関数の定義
動画サイズは(200,150)で実際の縦横サイズと同じ形状になった。
このカメラの素子の画素数は200万画素
そして付属ソフトの動画は640×480(VGA)となっているので、ここまで大きく出来る。
※実際には1280x960=1,228,800でもできた
ただ、ファイルが大きくなるので分解能は落ちるが200,150でも今回程度の分解能は出る。
イメージセンサー 約200万画素CMOS
静止画 約130万画素CMOS
動画 320×240(QVGA)、640×480(VGA)、※5~12fps
以下main関数。
def main():
OUT_FILE_NAME = "kenbikyo_video.mp4"
FRAME_RATE=30
w=200 #1280
h=150 #960
out = cv2.VideoWriter(OUT_FILE_NAME, \
cv_fourcc('M', 'P', '4', 'V'), \
FRAME_RATE, \
(w, h), \
True)
カメラの番号は内臓カメラが0、外付けUSBカメラが1である。
cap = cv2.VideoCapture(1)
sleep(s)のsの大きさにより動画のfpsを調整している。
すなわち、ピント調整のためには小さな値0.1とし、動画撮影・保存時は1s/コマや5s/コマなどの大きな値にすることにより、fpsを調整できる。
※外から与えることもできるが、実験時なのであまり凝らないこととした
また、当初はピント調整が入るので最初は非撮影モードのis_video = 'False'としている。
frameにfpsを書き込んで、cv2.imshow('test',frame)。
※名称がtestなのはまだまだ作成途中だということを意味する
is_video = 'False'
s=0.1
while True:
timer = cv2.getTickCount()
ret, frame = cap.read()
sleep(s)
fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
# Display FPS on frame
cv2.putText(frame, "FPS : " + str(int(1000*fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);
cv2.imshow('test',frame)
key = cv2.waitKey(1)&0xffでkey入力を受付、動画保存の切り替えやアプリの終了などを制御している。
key = cv2.waitKey(1)&0xff
#print("key=",key,ord('q'))
if is_video=="True":
img_dst = cv2.resize(frame, (int(200), 150)) #1280x960
out.write(img_dst)
print(is_video)
if key == ord('q'): #113
#cv2.destroyAllWindows()
break
elif key == ord('p'):
s=1
is_video = "True"
elif key == ord('s'):
s=0.1
is_video = "False"
以下で、testを呼び出す。
if __name__ == '__main__':
main()
まとめ
・デジタル顕微鏡の動画をPCに取り込んだ
・血液の凝固動画をコマ撮り撮影できた
・物体識別機能を追加しよう
・プランクトンや発芽などの動的観察をしよう