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

物体検出や識別の応用として、デジタルデータになってしまえば対象はミクロ(顕微鏡や胃カメラみたいなファイバーカメラも（ミクロの決死圏ができるかも）)も宇宙（望遠鏡も電波望遠鏡も、何でも）も拡張が可能ということで、事始めにデジタル顕微鏡の画像データ(とりあえず動画)を直接PCに取得してみた。
###当面の目標
①PCに動画を取り込む
②[ゾウリムシ](https://www.google.com/search?rlz=1C1NHXL_jaJP800JP800&biw=1184&bih=738&tbm=isch&sa=1&ei=FZ4oXJiUMoyW8wX4q5n4Bw&q=%E3%82%BE%E3%82%A6%E3%83%AA%E3%83%A0%E3%82%B7&oq=%E3%82%BE%E3%82%A6%E3%83%AA%E3%83%A0%E3%82%B7&gs_l=img.3..0l9j0i4.67080.77140..77917...5.0..1.94.1947.22......2....1..gws-wiz-img.....0..0i4i24j35i39._chxFZgT6qc)とか[プランクトン](https://www.google.com/search?q=%E3%83%97%E3%83%A9%E3%83%B3%E3%82%AF%E3%83%88%E3%83%B3&rlz=1C1NHXL_jaJP800JP800&source=lnms&tbm=isch&sa=X&ved=0ahUKEwil47qqrMffAhUMe7wKHec-BfMQ_AUIDigB&biw=1184&bih=738&dpr=2.5)とか、植物発生など物体識別機能をつける
![20160214220229.png](https://qiita-image-store.s3.amazonaws.com/0/233744/e0ce1869-099e-3b71-1083-c1aadfba2e94.png)
[【生物基礎】第１章　生物の特徴（細胞）＠http://terakoya-seibutsu.hatenablog.com/より引用](http://terakoya-seibutsu.hatenablog.com/entry/2016/01/31/%E3%80%90%E7%94%9F%E7%89%A9%E5%9F%BA%E7%A4%8E%E3%80%91%E7%AC%AC%EF%BC%91%E7%AB%A0_%E7%94%9F%E7%89%A9%E3%81%AE%E7%89%B9%E5%BE%B4%EF%BC%88%E7%B4%B0%E8%83%9E%E7%B7%A8%EF%BC%89#f-e6e0dbe0)
③顕微鏡から双眼鏡や天体望遠鏡へ
④。。。
####今回やったこと
①PCに動画を取り込む
もともと、kenko-デジタル顕微鏡は、ソフトがCD-Romで提供されているが、自前のPythonコードで取り込んだ
今回の機種は、[「Do・Nature　デジタルマイクロスコープ　STV-451M II」](https://www.kenko-tokina.co.jp/optics/micro_scope/4961607207406.html)
<img width="200" style="float: left;" alt="Do・Nature　デジタルマイクロスコープ　STV-451M II" src="https://qiita-image-store.s3.amazonaws.com/0/233744/a3ba997d-039e-e937-a3fa-5b28af273cf1.jpeg">
###取得できた動画例
残念ながら、赤血球は見えませんでした。。。が凝固の時系列変化が見えました。
※どちらかというと、この顕微鏡（Max：４００倍）だと肉眼で見える範囲の動的変化の観察によさそう。。
[安価なデジタル顕微鏡で血液が凝固する様子を観察してみた♬（画像サイズ２００ｘ１５０）](https://youtu.be/2PEXXtszcUI)
<a href="http://www.youtube.com/watch?feature=player_embedded&v=2PEXXtszcUI" target="_blank"><img src="http://img.youtube.com/vi/2PEXXtszcUI/0.jpg" 
 </a>
[安価なデジタル顕微鏡で血液が凝固する様子を観察してみた♬II（画像サイズ６４０ｘ４８０）](https://youtu.be/a5dkGYPwXq8)
<a href="http://www.youtube.com/watch?feature=player_embedded&v=a5dkGYPwXq8" target="_blank"><img src="http://img.youtube.com/vi/a5dkGYPwXq8/0.jpg" 
 </a>
※画像をクリックするとYouTube動画につながります
###コードは以下に置いた
[MicroScope/kenbikyo_Key.py](https://github.com/MuAuan/MicroScope/blob/master/kenbikyo_Key.py)

###コード解説
動画出力するためのおまじない関数を定義

```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)で実際の縦横サイズと同じ形状になった。
このカメラの素子の画素数は２００万画素
そして付属ソフトの動画は640×480(VGA)となっているので、ここまで大きく出来る。
※実際には1280ｘ960＝1,228,800でもできた
ただ、ファイルが大きくなるので分解能は落ちるが200,150でも今回程度の分解能は出る。

```
イメージセンサー	約200万画素CMOS
静止画	約130万画素CMOS
動画	320×240(QVGA)、640×480(VGA)、※5～12fps
```
以下main関数。

```py
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)
```
カメラの番号は内臓カメラが０、外付けUSBカメラが１である。

```py
    cap = cv2.VideoCapture(1)
```
sleep(s)のsの大きさにより動画のfpsを調整している。
すなわち、ピント調整のためには小さな値0.1とし、動画撮影・保存時は１s／コマや５ｓ／コマなどの大きな値にすることにより、fpsを調整できる。
※外から与えることもできるが、実験時なのであまり凝らないこととした

また、当初はピント調整が入るので最初は非撮影モードのis_video = 'False'としている。
frameにfpsを書き込んで、cv2.imshow('test',frame)。
※名称がtestなのはまだまだ作成途中だということを意味する

```py
    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入力を受付、動画保存の切り替えやアプリの終了などを制御している。


```py
        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を呼び出す。

```py
if __name__ == '__main__':
    main()
```
###まとめ
・デジタル顕微鏡の動画をPCに取り込んだ
・血液の凝固動画をコマ撮り撮影できた

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