LoginSignup
0
0

More than 5 years have passed since last update.

【顕微鏡】Kenko-デジタル顕微鏡で遊んでみた♪

Last updated at Posted at 2018-12-30

物体検出や識別の応用として、デジタルデータになってしまえば対象はミクロ(顕微鏡や胃カメラみたいなファイバーカメラも(ミクロの決死圏ができるかも))も宇宙(望遠鏡も電波望遠鏡も、何でも)も拡張が可能ということで、事始めにデジタル顕微鏡の画像データ(とりあえず動画)を直接PCに取得してみた。

当面の目標

①PCに動画を取り込む
ゾウリムシとかプランクトンとか、植物発生など物体識別機能をつける
20160214220229.png
【生物基礎】第1章 生物の特徴(細胞)@http://terakoya-seibutsu.hatenablog.com/より引用
③顕微鏡から双眼鏡や天体望遠鏡へ
④。。。

今回やったこと

①PCに動画を取り込む
もともと、kenko-デジタル顕微鏡は、ソフトがCD-Romで提供されているが、自前のPythonコードで取り込んだ
今回の機種は、「Do・Nature デジタルマイクロスコープ STV-451M II」
Do・Nature デジタルマイクロスコープ STV-451M II

取得できた動画例

残念ながら、赤血球は見えませんでした。。。が凝固の時系列変化が見えました。
※どちらかというと、この顕微鏡(Max:400倍)だと肉眼で見える範囲の動的変化の観察によさそう。。
安価なデジタル顕微鏡で血液が凝固する様子を観察してみた♬(画像サイズ200x150)

安価なデジタル顕微鏡で血液が凝固する様子を観察してみた♬II(画像サイズ640x480)

※画像をクリックするとYouTube動画につながります

コードは以下に置いた

MicroScope/kenbikyo_Key.py

コード解説

動画出力するためのおまじない関数を定義

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に取り込んだ
・血液の凝固動画をコマ撮り撮影できた

・物体識別機能を追加しよう
・プランクトンや発芽などの動的観察をしよう

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0