今更、Python2のサンプルアプリのメモ
イロイロと野暮用が発生し、この記事ではPython2でのサンプルアプリのメモを書いていきたいと思っています。今更感がありますが、すぐに忘れてしまうので…(-ω-)■UVCカメラからのキャプチャ画像表示UVC(USB video device class)カメラを使って画像をキャプチャを行うサンプルです。また、キャプチャ機能に関しては、私的に実装が一番楽なOpenCV2.4系のライブラリをかましています。以下がソースコードです。#!/usr/bin/env python2# -*- coding: utf-8 -*-import cv2if __name__=="__main__": # UVC規格カメラの設定(例:Linuxの場合でこの設定では/dev/video0に紐づく) capture = cv2.VideoCapture(0) # フレームレートの希望設定 capture.set(cv2.cv.CV_CAP_PROP_FPS, 30) # キャプチャ画像の幅の希望設定 capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 640) # キャプチャ画像の高さの希望設定 capture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 480) if capture.isOpened() is False: print "Can not find webcam..." exit(0) # 表示画面の名前の設定 cv2.namedWindow("Capture", cv2.WINDOW_AUTOSIZE) while True: # キャプチャ画像の取得 ret, image = capture.read() # キャプチャ画像の表示 cv2.imshow("Capture", image) # 1msのキー押下待ち(OpenCVではその歴史から,waitKey(...)がなければ画面表示されない) if cv2.waitKey(1) >= 0: break # 表示画面の後始末 cv2.destroyAllWindows()うまく動けば、こんな感じになるはずです(例:Jetson TX1)。また、JetsonTX1の最近のOSイメージは、ファイルディスクリプタ/dev/video0が既にキャリアボードに組み込まれたカメラに割り当てられているので、UVCカメラに割り当てられるのは/dev/video1になるかと思います。また、NVIDIA系開発ボード用のOpenCVをソースコードからビルドしたい場合は、以下のサイトをご参考。・Building OpenCV for Tegra with CUDAちなみに、Python3(v3.5)の場合は、以下のような記述になります(OpenCV3.3を使用)。#!/usr/bin/env python3# -*- coding: utf-8 -*-import cv2if __name__=="__main__": # UVC規格カメラの設定 capture = cv2.VideoCapture(0) # フレームレートの希望設定 capture.set(cv2.CAP_PROP_FPS, 30) # キャプチャ画像の幅の希望設定 capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640) # キャプチャ画像の高さの希望設定 capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) if capture.isOpened() is False: print ("Can not find webcam...") exit(0) # 表示画面の名前の設定 cv2.namedWindow("Capture", cv2.WINDOW_AUTOSIZE) while True: # キャプチャ画像の取得 ret, image = capture.read() # キャプチャ画像の表示 cv2.imshow("Capture", image) if cv2.waitKey(1)&0xFF == ord('q'): break # 表示画面の後始末 capture.release() cv2.destroyAllWindows()■画像切出し(例:カウントダウン)需要はまず無いですのが、画面全体に数字(厳密には数字が描かれた画像)をカウントダウン表示し、それまでに何かのキー押下をすれば、その後の処理を実施せずに終了するサンプルです。まあ、実際はOpenCVによるフルスクリーン設定と画像に対する注目部分(ROI:region of interest)制御に関するメモになります。以下がソースコードです。#!/usr/bin/env python2# -*- coding: utf-8 -*-import cv2if __name__=="__main__": # ベース画像の読込み img = cv2.imread("170816_count.png") # カウント画面の名前及びフルスクリーンの設定 cv2.namedWindow("count", cv2.WND_PROP_FULLSCREEN) cv2.setWindowProperty("count", cv2.WND_PROP_FULLSCREEN, cv2.cv.CV_WINDOW_FULLSCREEN) cv2.imshow("count",img) # 注目部分の幅と高さの設定 roiWidth = img.shape[1] roiHeight = int(float(img.shape[0])*0.2) i = 0 while True: # 注目部分の設定 roi_img = img[roiHeight*i:roiHeight*(i+1), 0:roiWidth] # カウント画像の表示 cv2.imshow("count", roi_img) # 1秒のキー押下待ち if cv2.waitKey(1000) >= 0: cv2.destroyAllWindows() exit(0) # 5秒後ループ終了 i+=1 if i==5: break # カウント画面の後始末 cv2.destroyWindow("count") # 本実装(もちろん、これは例) import subprocess ret = subprocess.check_output(["echo", "bomb!!"]) print retちなみに、ロードするベース画像ファイルは、例えば以下のような画像(192×540px)になります。要は192×108px(16:9)の画像を5枚縦に連結したファイルですね。この画像サイズの場合、フルスクリーン表示で引き延ばされますので、フルHDのディスプレイで観るとかなり荒くなります。さすがに小さすぎました…。■PythonのバージョンとOpenCVのバージョンまあ、この部分は目的によりますがPython2の場合はOpenCV2.4系、Python3の場合はOpenCV3系が無難かなぁと考えています。まあ、Python3の場合は選択肢がOpenCV3もしくは4かもしれませんが…(・ω・)■Pythonのfloat型は倍精度これも、Pythonは浮動小数点はfloat型しかないので当たり前なのですが時々忘れます。最近は64bitが主流ですね。pi@raspberrypi:~ $ pythonPython 2.7.13 (default, Nov 24 2017, 17:33:09) [GCC 6.3.0 20170516] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> a=1.01>>> b=1.02>>> a+b2.0300000000000002>>> 以上です。