RICOH Theta マウント Libre Calc編 #15

THETAマウント

RICOH Theta マウントの制御ソフトをLibre Calcで実現するために、下記の課題を片付けていきます。今回は、1.のライブビュー表示の部品制作をおこなっていきます。

1.「ライブビュー表示」「静止画撮影
2.「画像をシートに追加」
3.「古い画像の削除」
4.「自動OFF」

■ 下調べ

Libre Calc上でのライブビュー表示ですが、Basic、Python、OpenCV、threadを使って実現しようと思います。私は、Libre Calc上でPython、thread、OpenCVを使ったことはないので、まずは、実現に必要な最小限のテクニックと、制約事項を調査しました。
調べた項目は下記です。

Python/Basic相互呼び出し方法
Python threadを使う

結果、制約はあるものの、Basic、Python、threadに関しては、使用可能なレベルであることが確認できました。ただ、表計算ソフトで機器制御として使用する人はいないので、参考になるものが少なく、試行錯誤しながらの調査となりました。
今回は、下調べに主役の座を奪われた感じです。
残るは、OpenCVですが、こちらは実際に使用するライブビュー部品として作りこんでみました。

■ ライブビューモジュールの作成

ライブビューは、画像表示だけでなく、撮影機能も持たせますので、Basic側の関数、サブルーチンから、ライブビュー開始、停止、撮影指示ができるよう、下記のIFを用意しました。

関数名機能
camera_monitor_start()Basic 制御IF:ライブビュー(撮影画像表示)を開始する
camera_monitor_stop()Basic 制御IF:ライブビュー停止要求を行う
camera_monitor_capture()Basic 制御IF:静止画撮影要求を行う
camera_monitor()ライブビューThread:OpenCVを使用して撮影画像表示、静止画撮影を行う

下記は、Pythonスクリプトの抜粋です。参考程度に添付しておきます。
ここでは、OpenCVの使用方法など説明はしませんが、camera_monitor()内で、cv2.xxx()で呼び出しているIFがOpenCVのIFです。
prop_xxx()は、設定シート上のセルのIOを行っているIFです。
セルの設定値を参照しているんだな~程度に見ていただければと思います。
今回作成したモジュールは、「設定シート」上の制御パラメータを参照するように設計してあります。
主な理由はBasic主導でPythonスクリプトを制御したかったためです。
同様の理由で、Pythonの外部変数は使わず、代わりに「設定シート」を外部変数として使用しています。

#
#	purpose	:	entry to open the camera window.
#
def camera_monitor():
	prop_liveview_set(1)

	capture = cv2.VideoCapture(int(prop_camport_get()))
	lifecnt = 0
	prop_lifecnt1_set(lifecnt)
	prop_lifecnt2_set(lifecnt)
	lifecnt = lifecnt + 1

	while(True):
		ret, frame = capture.read()
		if (ret == True):
			cv2.imshow('monitoring live',frame)
		else:
			break

		cv2.waitKey(33)

		if (prop_liveview_get() == 0):
			break
		elif (prop_capture_get() == 1):
			cv2.imwrite(prop_imagepath_get(), frame)
			prop_capture_set(0)

		if ((lifecnt % 10) == 0):
			prop_lifecnt1_set(lifecnt)
		lifecnt = lifecnt + 1

	capture.release()
	cv2.destroyAllWindows()
	prop_capture_set(0)

#
#	purpose	:	entry to start camera window task.
#
def camera_monitor_start(*args):
	prop_liveview_set(0)
	th = threading.Thread(target=camera_monitor)
	th.setDaemon(True)
	th.start()


#
#	purpose	:	entry to stop camera window.
#
def camera_monitor_stop(*args):
	prop_liveview_set(0)

#
#	purpose	:	entry to capture image.
#
def camera_monitor_capture(*args):
	prop_capture_set(1)

■ ライブビュー動作結果

Basic側から開始、停止、静止画撮影の動作確認を行うことができました。
下記ようにThetaの画像を表示、撮影することができました。
「設定シート」との連携もできており、まずは、使い物になるモジュールができたと思います。
必要なテクニック、制約を下調べしてからモジュール設計したので、「ライブビュー」だけに集中することができました。
テクニックや制約を知らずにやるとハマっていたように思いますので、短期間で、うまくすすめられたと思います。

■ 次週

次回は、引き続き、「2.画像をシートに追加」「3.古い画像の削除」に取り掛かります。
撮影機能が出来上がりましたので、次回は、「撮影画像シート」(画像のリスト管理、撮影等)を完成させていきます。
もうしばらく進捗が滞るかもしれないですが、またよかったらのぞいていただけると嬉しいです。

タイトルとURLをコピーしました