OPL 株式会社 オプトライン

English

技術情報

2019.10.29Pythonを使ったカメラの制御について

## はじめに
前回の記事
[pySerialを使った顕微鏡用多波長LED光源の高速波長切り替えについて]

【オプトライン 技術情報ページ】

http://www.opto-line.co.jp/technical/tech78.html

【オプトライン Qiitaページ】

https://qiita.com/opto-line/items/3be4e0a1f8ac00442807

 

前回は顕微鏡用多波長LED光源の制御方法について書きました。今回はPythonによるカメラ制御について書きたいと思います。
顕微鏡といえば肉眼で接眼レンズをのぞき込むイメージがありますが、実はカメラで撮影する場合が多いです。
バイオ分野の研究者の中には顕微鏡メーカー各社が配布しているソフトウェアや有償ソフトを購入し、使っている方もいらっしゃいます。
Pythonは無償ですので手軽に始められます。また、すでに解析をPythonで書かれている方は既存のプログラムにハードウェアの
制御プログラムを組み込むことで測定フローの自動化ができるでしょう。
定番である画像処理モジュールOpenCVを使ってカメラから画像を取得する方法について共有できればと思います。

%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%b0%e7%94%bb%e5%83%8f%ef%bc%88from-%e9%ab%98%e6%b2%a2%ef%bc%89
## 開発環境

– Windows10 (x64)
– Python 3.6
– Anaconda 3
– OpenCV 3.4.1

 

## 使用する機材

– カメラ: ARTCAM-226IMX-BW-USB3-T2(Artray)
– PC

 

## 画像取得

以下の関数をメイン関数で呼び出すと画像を取得できます。

まずはコピペして実行してみてください。

import cv2

# VideoCapture オブジェクトを取得します
capture = cv2.VideoCapture(1)

while(True):
ret, frame = capture.read()
# resize the window
windowsize = (800, 600)
frame = cv2.resize(frame, windowsize)

cv2.imshow(‘title’,frame)
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break

capture.release()
cv2.destroyAllWindows()

できない場合は、`cv2.VideoCapture(1)`の引数を`0`に変えてみてください。
>参考
>https://weblabo.oscasierra.net/python/opencv-videocapture-camera.html
ここでカメラの切り替えは`cv2.VideoCapture(0)`の引数で切り替えます。0が引数として設定されていますが2台目のカメラを使いたい場合は`cv2.VideoCapture(1)`と指定します。
以下の関数のように、引数を`0, 1, 2, …`と変えてあげると接続されたカメラの台数を調べられます。

“`python:

def check_camera_connection():
“””
Check the connection between any camera and the PC.

“””
print(‘[‘, datetime.datetime.now(), ‘]’, ‘searching any camera…’)
true_camera_is = []  # 空の配列を用意

# カメラ番号を0~9まで変えて、COM_PORTに認識されているカメラを探す
for camera_number in range(0, 10):
cap = cv2.VideoCapture(camera_number)
ret, frame = cap.read()

if ret is True:
true_camera_is.append(camera_number)
print(“port number”, camera_number, “Find!”)

else:
print(“port number”, camera_number, “None”)
print(“接続されているカメラは”, len(true_camera_is), “台です。”)
“`
実行結果

“`
[ 2019-10-04 18:17:51.607549 ] searching any camera…
port number 0 Find!
port number 1 Find!
port number 2 None
port number 3 None
port number 4 None
port number 5 None
port number 6 None
port number 7 None
port number 8 None
port number 9 None
接続されているカメラは 2 台です。
“`
カメラが2台みつかりました。

 

保存
名前と画像配列を指定して保存します。
cv2.imwrite(‘test.tif’, image_array)

## カメラのプロパティの設定
カメラの画素数や露光時間等の各種パラメーターを取得できる関数がOpenCVには用意されています。
`cap.get()`でカメラのプロパティを取得できます。
引数は下の表を参考にしてください。
cap = cv2.VideoCapture(0)
for num in range(22):
print(num, ‘.’,cap.get(num))

0 . -1.0
1 . -1.0
2 . -1.0
3 . 640.0
4 . 480.0
5 . 0.0
6 . 844715353.0
7 . -1.0
8 . -1.0
9 . -1.0
10 . 0.0
11 . 0.0
12 . 64.0
13 . 0.0
14 . -1038556352.0
15 . -1038556352.0
16 . -1.0
17 . 4600.0
18 . -1.0
19 . -1038556352.0
20 . 2.0
21 . -1.0
“`
3のCV_CAP_PROP_FRAME_WIDTH 幅 640.0
4のCV_CAP_PROP_FRAME_HEIGHT 高さ 480.0
5のCV_CAP_PROP_FPS フレームレート 0.0
6のCV_CAP_PROP_FOURCC コーデックの4文字のコード 844715
12のCV_CAP_PROP_SATURATION 彩度 64
13のCV_CAP_PROP_HUE Hue of the image 色相 0.0
17のCV_CAP_PROP_WHITE_BALANCE_U The U 4600
20のCV_CAP_PROP_ISO_SPEED シャッタースピード 2.0
は値が取れている。

python%e3%82%ab%e3%83%a1%e3%83%a9

詳細についてのお問合せは、下記フォームよりお気軽にご連絡ください。

http://www.opto-line.co.jp/contact/