Pythonで東芝テリーのカメラをつかってみた

# はじめに
Python初学者です。
仕事ではC#を使っているのですが、Pythonでプロダクトを作ってみたい！と下手の横好きで提案してみたところ実際に作ることに。

そうして、テスト用に東芝テリー製産業用カメラを使うことになったのでPythonでカメラが撮影した画像を扱える環境を作るための備忘録として記しました。

## 対象者
この記事は下記のような方を対象にしています
- Python初学者
- Windows上でPythonを利用してUSB接続の東芝テリー製カメラを扱いたい方

## 環境
- Windows 10 Pro 21H2
- Python 3.8.10
- OpenCV 4.6.0.66
- 東芝テリー BU2409M(USB3インターフェイス)

## 前提
- Pythonの開発環境が構築済みであること

# 本題
### デバイスドライバ導入
Windowsにデバイスドライバが導入されていない場合は、**TeliCamSDK**をダウンロードしインストールします。
[東芝テリー](https://www.toshiba-teli.co.jp/index_j.htm)のWebサイトの、**サポート→ソフトウェアダウンロード**と進みます(※要登録)

ソフトウェアダウンロードページへ辿り着くと、**カメラSDK開発ツール**→**TeliCamSDK**とクリックするとダウンロードが始まります。

ダウンロードが完了したらSDKをインストールしてください。

### Pythonの準備
pytelicamライブラリを上記ダウンロードページより予めダウンロードします。
**Python用ライブラリ**→**Windows 64bit win_amd64**とクリックしダウンロードします。

zipファイルがダウンロードできますので、ファイルを解凍すると**wheel_files**というフォルダがあるので、
自分の環境に適合するファイルを自分の環境下にコピーしておきます。
※予めCameraTestEnvという仮想環境を作成済みです。

今回はこのためにPython3.8を導入したのでcp38のファイルを利用します。

![teli4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381719/1c8fa562-3ab1-c26e-bb38-d66344a15531.png)

コピーが済んだらPowerShellで

```powershell:PowerShell
(CameraTestEnv) PS C:\github\CameraTestEnv> pip install .\pytelicam-1.0.1-cp38-cp38-win_amd64.whl
```
と入力でインストールできます

```powershell:PowerShell
Processing c:\github\cameratestenv\pytelicam-1.0.1-cp38-cp38-win_amd64.whl
Installing collected packages: pytelicam
Successfully installed pytelicam-1.0.1
```

問題無ければ**Successfully**と返してきます。

#### 余談:whlファイルの導入で躓いたときは

尚、Pythonの環境のバージョンと合っていないと以下のように怒られます。
こうなったら、現在導入されているPythonに適合するライブラリをチェックした上で
正しいバージョンのライブラリを探すか最悪Pythonのバージョンの変更を検討しなければなりません。
(実はここでハマりました。)

whlファイルの適合チェックは[こちら](https://note.com/tomtom_0301/n/na8fedf6f87ee)のnoteに親切に書かれていました。



```powershell:PowerShell
(CameraTestEnv) PS C:\github\CameraTestEnv> pip install .\pytelicam-1.0.1-cp37-cp37m-win_amd64.whl
ERROR: pytelicam-1.0.1-cp37-cp37m-win_amd64.whl is not a supported wheel on this platform.
```

ひとまず、環境の準備は完了です。

### Pythonで画像を取り込んでみる

以下のようなコードで試してみました。

```python:Python
import pytelicam #pytelicamのインポート
import cv2

cam_system = pytelicam.get_camera_system() #camera_systemオブジェクトを取得
cam_num = cam_system.get_num_of_cameras() #接続カメラ台数チェック
if  cam_num == 0: #接続台数が0台なら終了
    print("Camera not found")
    exit()
cam_device = cam_system.create_device_object() #camera_deviceオブジェクトを取得
cam_device.open() #カメラオープン
cam_device.cam_stream.open() #ストリームオープン
cam_device.cam_stream.start() #ストリーム開始
image_data = cam_device.cam_stream.get_next_image() #カメラのバッファに次に到着した画像をimage_dataに取得
np_arr = image_data.get_ndarray(pytelicam.OutputImageType.Bgr24) #画像をnumpy配列に
cv2.imshow("image", np_arr) #画像の表示
cv2.waitKey(0)
image_data.release() #image_dataオブジェクトの解放
cam_device.cam_stream.stop() #以下カメラの終了処理
cam_device.cam_stream.close()
cam_device.close()
cam_system.terminate()
exit()
```

何事もなく動いていれば*image*という名前のウィンドウに取り込み画像が表示されるはずです。

![teli5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381719/cb7c62e9-7ad0-cfc9-b166-899329b4e660.png)

今回のテスト機は大きな画素数のカメラだったので**途方もなく大きなウィンドウ**が表示されてきました。
テレセントリックレンズ装備な上にスマフォのカメラで適当に照明を当てたので露光オーバーで真っ白でした。

しかし、カメラが動いたのが確認できたので作業を進められそうです。

# 参考文献
- [Python-Control 環境構築 ＆ whlファイル インストールエラー対応](https://note.com/tomtom_0301/n/na8fedf6f87ee)

whlファイルの導入でハマったとき参考にさせていただきました。

# 最後に
この先tkinterでUIを作りつつ連続的に取り込みと画像処理をできるアプリケーションを作成したいと思います。
なにかおかしなところがあればコメントお願いします！