お世話になりました。
https://qiita.com/kotai2003/items/0c96143b7d6e84629d99
https://zadig.akeo.ie/
https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/windows
東洋インタレスト出版
お世話になりました。
https://qiita.com/kotai2003/items/0c96143b7d6e84629d99
https://zadig.akeo.ie/
https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/windows
datetimeで作った時刻データでは、秒よりも細かい6桁の数字が含まれています。
単位はマイクロ秒 なので ミリ秒で出したいときは下記のように出せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import datetime import time # 1秒のsleep時間を正確に測定する time_init = datetime.datetime.now() time.sleep(1.0) time_delta = datetime.datetime.now() - time_init # 確認 print(time_delta) print(time_delta.seconds, "sec") print(time_delta.microseconds, "micro sec") print(time_delta.seconds * 1000 + time_delta.microseconds / 1000, 'msec') |
1 2 3 4 |
0:00:01.000511 1 sec 511 micro sec 1000.511 msec |
センサーから時系列で入ってくるデータを変数に格納したい時、ありますよね。
普段はlistとしてli = []のような空リストを作ってからli.append(入ってくるデータ) でどんどんリストの要素として追加していましたが、時間方向の分解能を高めるために、numpyを使おうとすると、直感ではうまくできなかったので、メモしておきます。
numpyのappendは破壊的でないため、変数に再代入しなくてはappendの結果が反映されません。注意点はここだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import numpy as np import datetime ar = [] li = [] for i in range(3): time_init = datetime.datetime.now() time.sleep(1.0) time_delta = datetime.datetime.now() - time_init ar = np.append(ar, time_delta.microseconds) li.append(time_delta.microseconds) print('ar : ', ar) print('li : ', li) |
今日はflaskが実行されているサーバーのIPアドレス127.0.0.1:5000に対して、クライアントからPOSTするやりかたを見ていきます。
flaskのメインスクリプトに下記の関数を追加します。
1 2 3 4 5 6 7 |
# get post put deleteを使う場合 @app.route('/post', methods=['GET', 'POST', 'PUT', 'DELETE']) def show_post(): # 送られてきたデータは flask.request.values に格納されている。 return str(request.values) |
これをVScode右上の再生ボタンでRUNさせておきます。
127.0.0.1:5000でRUNし始めたはずです。
これに対して、クライアント側からPOSTするために、pythonファイルを新規作成してrequestsモジュールのpostメソドを使ってアクセスしてみます。
1 2 3 4 5 6 7 8 9 10 11 |
import requests # flaskサーバーにrequestsモジュールを使用して # アクセスしてみる url = 'http://127.0.0.1:5000/post' # ディクショナリ形式でデータを渡してみる r = requests.post(url, data={'username': 'mike'}) # 返ってきたデータを確認する print(r.text) |
で、これをVScode上ではなくて、cmdを開いてそこから実行すると。
1 2 3 |
C:\Users\omoiy\scripts\flask_test>python show_post_test.py CombinedMultiDict([ImmutableMultiDict([]), ImmutableMultiDict([('username', 'mike')])]) |
以上、GET, PUT, DELETEも同じやり方です。
IPアドレスは127.0.0.1:5000がデフォルトとのこと。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from flask import Flask #クラスを作る from flask import g # グローバルな値を入れる from flask import render_template from flask import request from flask import Response # グローバル宣言 app = Flask(__name__) # トップページを作成する @app.route('/') def toppage(): return 'this is the toppage!' # トップページ以下にpage1を作成する @app.route('/page1') def page1(): return 'this is the page1' # 引数usernameを入れる場合 # 入れない場合も考慮して2個作る @app.route('/page2') @app.route('/page2/<username>') def page2(username=None): # デフォルトにNoneを入れておく return 'user :{}'.format(username) # メイン関数(flaskの実行) def main(): app.debug = True app.run(host='127.0.0.1', port=5000) # メイン実行スクリプト if __name__ == '__main__': main() |
同層にディレクトリtemplatesを作成して、その中に下記のようなhtmlファイルを作成します。{% ○○ %} を使うとif文が使用できたりします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>hello</title> </head> <body> {% if username %} Hello {{username}} {% else %} Hello {% endif %} </body> </html> |
pythonファイルにはrender_templateを使用して下記のようにhtmlファイルを呼び出します。
1 2 3 4 5 |
# テンプレートを使う場合 flask.render_template() @app.route('/page3') @app.route('/page3/<username>') def page3(username=None): return render_template('hello.html', username=username) |
次回は、get, post, ,put, delete をやっっていきます。
Jetaon Nanoで異物を検出したいのですが、まずは使い慣れたPCで作ってみます。
エレコム WEBカメラ 200万画素 マイク内蔵 MAC対応 ブラック UCAM-C0220FBNBK
2015年に買った、2000円くらいの安物です。
レア過ぎて価格にプレミアがついていました。
参考にさせていただきました:https://www.kkaneko.jp/tools/win/cv2.html
Python3.7.7を入れました。最新の3.8.2はOpenCVが対応してない可能性があるのでやめておきました。
https://www.python.org/downloads/release/python-377/
cmdでpythonとして、 3.7.7が起動させます。
pip listをすると
pip 19.2.3
setuptools 41.2.0
WARNING: You are using pip version 19.2.3, however version 20.0.2 is available.
You should consider upgrading via the ‘python -m pip install –upgrade pip’ command.
とバージョンアップを促されるので、
python -m pip install –upgrade pip
します。
numpyも入れてみましょう。
pip install numpy で1.18.2が入りました。
ではVScodeを起動させて、メニュー>view > select interpriter で python 3.7.7を選択し・・・たいところですが、ありません。
一旦VScodeを起動させ(まだpython 3.7.7は表示されない。)、そしてVScode下部のターミナルで一旦pythonを起動させます。3.7.7が起動しました。
スクリプト実行を何回かさせて、numpyがないよー、と言われながら、interpriterの指定を開くと,python 3.7.7が選択できるようになっていました。
で、スクリプトを実行すると、今度はcv2がないよー、といわれましたので、cmdから
1 |
$ py -m pip install -U opencv-python |
で入れました。opencv-python-4.2.0.34が入りました。
cmdでエラーが出るときは、Power Shellを管理者権限で開いてやってみましょう。
で、確認です。
1 2 3 4 |
> python import cv2 cv2.__version__ '4.2.0' |
VScodeをいじっているとpylintをいれてと促されるので
$ -m pip install -U pylint –user
いろんなライブラリも同時に勝手にはいりました。
Package Version
—————– ——–
astroid 2.3.3
colorama 0.4.3
isort 4.3.21
lazy-object-proxy 1.4.3
mccabe 0.6.1
numpy 1.18.2
opencv-python 4.2.0.34
pip 20.0.2
pylint 2.4.4
setuptools 41.2.0
six 1.14.0
typed-ast 1.4.1
wrapt 1.11.2
frame.shepe[:3]にして、カメラ番号を1から0に変更したら内蔵カメラが映りました。
webカメラをUSBに指して、カメラ番号1に戻したらこれでも映りました。
ということで[:3]は関係なかったと思われます。
OpenCVで
案1:BGR画像→グレースケール→検査窓トリミング→現在画像→二値化
案2:BGR画像→グレースケール→検査窓トリミング→初期画像と現在画像を差分を取る→二値化
の2案をやってみましたが、結果的に案1を採用します。
案1は、背景が動いたりカメラが動いたりしたときでも、検出精度は変わらない利点があります。
案2は、初期画像と現在画像を比較するので、背景になんらかの均一でない構造があったとしても、初期画像と現在画像で比較するので異物検出のロバスト性が高くなる利点があります。しかし、背景が動いたりカメラが動いたりして、初期画像とのズレが発生するとと検出できないか検出精度が大幅に落ちます。
今回は、よりシンプルな案1でやっていきます。
スクリプトを回すと自動的に時系列データがcsvファイルとして入ってきます、
作成されたcsvファイル読み込んでグラフ化しました。
横軸が時間、縦軸は検出された異物(黒)の画素数です。
開始5秒の画像は異物がない、まっさらな状態です。影一つありません。
開始15秒で5mm程度の異物を置いてみました。黒い点が現れます。
開始60秒で1mmと5mm程度の異物を置いてみました。どちらも黒い点になって現れます。200万画素の安物カメラでもこれだけの精度が用意に出ます。
周囲の照明コンディションが良ければ、0.5mm程度までは検出できそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
import numpy as np import cv2 import datetime import time def interval_file_save(date, current_time, time_cnt, pixels_objects, pixels_percentile): # データをcsvファイルとして書き込む file_path = r'C:\Users\omoiy\scripts\shihenDetector\data\data.csv' with open(file_path, mode='a') as f: f.write(str(date) + ',' + str(current_time) + ',' + str(time_cnt)+ ',' + str(pixels_objects) + ',' + str(pixels_percentile) + '\n') def onTrackber(position): # 2値化のスレショルド用トラックバー global threshold threshold = position if __name__ == '__main__': # グローバル変数を定義 ESC_KEY = 27 # Escキー INTERVAL= 33 # インターバル FRAME_RATE = 30 # フレームレートfps # 検出範囲を指定 x_min = 150 x_max = 640 - x_min y_min = 120 y_max = 480 - y_min # 使用カメラの選択 1: 外部UVCカメラ DEVICE_ID = 1 # カメラ映像を取得 cap = cv2.VideoCapture(DEVICE_ID) # 初期フレームを読み込む end_flag, frame = cap.read() height, width, channels = frame.shape # 基準画像の定義 img_bgr = frame img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) # RGB to Gray:Y←0.299⋅R+0.587⋅G+0.114⋅B img_partial_gray = img_gray[y_min : y_max, x_min : x_max] img_reference = img_partial_gray # 初期フレームは以後のフレームより若干暗いので補正係数を掛けて調整する c = 1.0 # 補正係数 img_reference = (img_reference * c ).astype('uint8') # 初期画像 以後、この画像を基準して参照する #2値化用トラックバー #cv2.namedWindow("img_diff_abs_adbinary") #threshold = 100 #初期値 #cv2.createTrackbar("track", "img_diff_abs_adbinary", threshold, 255, onTrackber) # 画像処理 date_init = datetime.datetime.now() pixels_objects = 0 # 初期値 pixels_percentile = 0 # 初期値 pixels_objects1 = 0 # 初期値 pixels_percentile1 = 0 # 初期値 # データ保存の時間間隔(インターバル) initial_time = datetime.datetime.now() # 初期値 time_cnt = 0 # sec 初期値 time_interval = 5 # sec 定期実行の時間間隔 # OpenCV リアルタイム処理開始 while end_flag == True: # 現在時間 sec current_time = (datetime.datetime.now() - initial_time).total_seconds() # 画像行列の取得と変換 img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) img_partial_gray = img_gray[y_min : y_max, x_min : x_max] # BGRカラー画像を表示する img_bgr = frame line_thickness = 10 cv2.rectangle(img_bgr, (x_min-line_thickness, y_min-line_thickness), (x_max+line_thickness, y_max+line_thickness), color=(100,100,255), thickness = line_thickness) cv2.imshow('img_bgr', img_bgr) # グレースケール画像を表示する #cv2.imshow('img_gray', img_gray) # 基準画像を表示する cv2.imshow('img_referece', img_reference) # リアルタイム画像を表示する cv2.imshow('img_partial_gray', img_partial_gray) # リアルタイム画像と基準画像との差を算出して表示する (負の場合は絶対値が自動的に取られる) img_diff_abs = np.abs(img_partial_gray - img_reference) cv2.imshow('img_diff_abs', img_diff_abs) # リアルタイム画像と基準画像との差の2乗算出して表示する #img_diff_sqared = np.square(img_partial_gray - img_reference) #cv2.imshow('img_diff_sqared', img_diff_sqared) # リアルタイム画像と基準画像との差の画像をアダプティブスレッショルドで2値化する # img_diff_abs_adbinary = cv2.adaptiveThreshold(img_diff_abs, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, threshold) #アダプティブスレショルド # cv2.imshow("img_diff_abs_adbinary", img_diff_abs_adbinary) # リアルタイム画像と基準画像との差の画像を固定スレッショルドで2値化する ret, img_diff_abs_binary = cv2.threshold(img_diff_abs,127, 255, cv2.THRESH_BINARY) # 上記img_diff_abs_binary画像の異物の画素数と割合を出力する(ただし1フレーム前) txt = str(time_cnt) + 's,' + str(pixels_objects) + 'pix,{:.2f}%'.format(pixels_percentile) cv2.putText(img=img_diff_abs_binary, text=txt, org=(10, 30), fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=1.5, color=(255, 255, 255), thickness=1, lineType=cv2.LINE_AA) cv2.imshow("img_diff_abs_binary", img_diff_abs_binary) # リアルタイム画像の画像を固定スレッショルドで2値化する ret, img_partial_gray_binary = cv2.threshold(img_partial_gray,127, 255, cv2.THRESH_BINARY) # 上記img_partial_gray_binary画像の異物の画素数と割合を画面内に出力する(ただし1フレーム前) txt1 = str(time_cnt) + 's,' + str(pixels_objects1) + 'pix,{:.2f}%'.format(pixels_percentile1) cv2.putText(img=img_partial_gray_binary, text=txt1, org=(10, 30), fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=1.5, color=(0, 0, 0), thickness=1, lineType=cv2.LINE_AA) cv2.imshow("img_partial_gray_binary", img_partial_gray_binary ) #cv2.imwrite(image_path + '.new.jpg', img) # ==== 異物の画素数をカウントする ==== # 検出窓の画素数 pixels_window = (img_partial_gray_binary.shape[0] * img_partial_gray_binary.shape[1]) # ---- 異物の画素数 と 割合 をターミナルに出力する ---- # img_diff_abs_binary リアルタイム画像と基準画像との差の画像を固定スレッショルドで2値化した画像 date = datetime.datetime.now() pixels_objects = np.count_nonzero(img_diff_abs_binary == 255) pixels_percentile = pixels_objects / pixels_window * 100 print(date, ' : ', date - date_init, ' : ', '異物の画素数 / pixels: ', pixels_objects, '割合 / % : {:.2f}'.format(pixels_percentile)) # img_partial_gray_binary リアルタイム画像の画像を固定スレッショルドで2値化した画像 pixels_objects1 = np.count_nonzero(img_partial_gray_binary == 0) pixels_percentile1 = pixels_objects1 / pixels_window * 100 print(date, ' : ', date - date_init, ' : ', '異物の画素数 / pixels: ', pixels_objects1, '割合 / % : {:.2f}'.format(pixels_percentile1)) # ---- time_interval毎に定期実行する内容 ---- if current_time >= time_cnt : # データをテキストデータとしてファイルに書き出す if time_cnt == 0: pixels_objects = 0 # フレーム1枚目はカメラの光量不足で大きな数値になってしまうので強制的にゼロにする else: interval_file_save(date, current_time, time_cnt, pixels_objects1, pixels_percentile1) # 画像データを保存する # file_path = r'C:\Users\omoiy\scripts\shihenDetector\img.jpg' numbering = time_cnt file_path = r'C:\Users\omoiy\scripts\shihenDetector\img\img_' + str(numbering) + r'.jpg' cv2.imwrite(file_path, img_partial_gray_binary) # 次回、定期実行する時刻 time_cntを更新 time_cnt += time_interval # sec # Escキーで終了 key = cv2.waitKey(INTERVAL) if key == ESC_KEY: break # 次のフレーム読み込み end_flag, frame = cap.read() # 終了処理 cv2.destroyAllWindows() cap.release() |
pandasとmatplotlibを使うのでインストールします。
pip install pandas
installed pandas-1.0.3 python-dateutil-2.8.1 pytz-2019.3
pip install matplotlib
installed cycler-0.10.0 kiwisolver-1.2.0 matplotlib-3.2.1 pyparsing-2.4.7
はい、ではスクリプト実行しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import numpy as np import pandas as pd import matplotlib.pyplot as plt file_path = r'C:\Users\omoiy\scripts\shihenDetector\data\data.csv' df = pd.read_csv(file_path, sep=',', names=('date', 'current_time','time_cnt', 'pixels', 'ratio')) print(df.head()) #print(df.current_time, df.time_cnt) plt.plot(df['time_cnt'], df['pixels'], label='pixels') plt.title('Object Pixels', fontsize=18) plt.xlabel('Time / sec', fontsize=18) plt.ylabel('Pixels', fontsize=18) plt.legend(loc='best', fontsize=18) plt.grid() plt.show() # time_cntとcurrent_timeとのズレを確認 : 0~70sec # plt.plot(df.time_cnt, df.current_time-df.time_cnt) # plt.show() |
以上です。
一定の時間間隔でプログラムを実行する方法を考える必要がありましたので、考えたスクリプトをメモしておきます。
これを使えば、OpenCVを使っているときに、while文の中で動画を取得し処理している最中に、任意のインターバルで時刻や分析データをファイルに保存することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# ---- 一定の時間間隔でプログラムを実行する方法 ---- # interval_test.py import datetime import numpy as np initial_time = datetime.datetime.now() time_cnt = 0 # sec 初期値 time_interval = 1 # sec 定期実行の時間間隔 while True: # 現在時間 sec current_time = (datetime.datetime.now() - initial_time).total_seconds() # time_interval毎に実行する if current_time >= time_cnt : # 定期実行の内容 print('if文の中に入りました', time_cnt, current_time) # 次回、定期実行する時刻 time_cntを更新 time_cnt += time_interval # sec |
0.001sec つまり 0~1msec程度の遅れがあります。
私の用途では、十分許容できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
if文の中に入りました 0 0.0 if文の中に入りました 1 1.0 if文の中に入りました 2 2.000031 if文の中に入りました 3 3.0 if文の中に入りました 4 4.0 if文の中に入りました 5 5.001031 if文の中に入りました 6 6.000024 if文の中に入りました 7 7.000025 if文の中に入りました 8 8.000025 if文の中に入りました 9 9.00003 if文の中に入りました 10 10.001025 if文の中に入りました 11 11.000001 if文の中に入りました 12 12.001025 if文の中に入りました 13 13.0 if文の中に入りました 14 14.0 if文の中に入りました 15 15.001025 if文の中に入りました 16 16.0 if文の中に入りました 17 17.0 if文の中に入りました 18 18.0 if文の中に入りました 19 19.0 if文の中に入りました 20 20.000024 |
以上
https://qiita.com/tsutof/items/2d2248ec098c1b8d3e32
試運転:shellからでは映像が出力できています。
1 |
$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)NV12, framerate=(fraction)30/1' ! nvoverlaysink -e |
Python3から nano_cam_test.py を実行してみるとエラーが出ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import cv2 GST_STR = 'nvarguscamerasrc \ ! video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)30/1 \ ! nvvidconv ! video/x-raw, width=(int)1920, height=(int)1080, format=(string)BGRx \ ! videoconvert \ ! appsink' WINDOW_NAME = 'Camera Test' def main(): cap = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER) while True: ret, img = cap.read() if ret != True: break cv2.imshow(WINDOW_NAME, img) key = cv2.waitKey(10) if key == 27: # ESC break if __name__ == "__main__": main() |
エラー:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
nak@jetson:~/scripts$ python3 nano_cam_test.py GST_ARGUS: Creating output stream CONSUMER: Waiting until producer is connected... GST_ARGUS: Available Sensor modes : GST_ARGUS: 3264 x 2464 FR = 21.000000 fps Duration = 47619048 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000; GST_ARGUS: 3264 x 1848 FR = 28.000001 fps Duration = 35714284 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000; GST_ARGUS: 1920 x 1080 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000; GST_ARGUS: 1280 x 720 FR = 59.999999 fps Duration = 16666667 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000; GST_ARGUS: 1280 x 720 FR = 120.000005 fps Duration = 8333333 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000; Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, threadExecute:243 Stream failed to connect. Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, threadFunction:177 (propagating) (Argus) Error InvalidState: (propagating from src/eglstream/FrameConsumerImpl.cpp, function streamEventThread(), line 135) (Argus) Error InvalidState: (propagating from src/eglstream/FrameConsumerImpl.cpp, function streamEventThreadStatic(), line 177) Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, execute:654 Frame Rate specified is greater than supported Segmentation fault (core dumped) |
たぶん、カメラが対応している解像度と違うからでしょう。
直してみましょう。
下記、シェルスクリプトをファイル名 install_opencv4.1.0_Nano.shとしてホームディレクトリに保存します。まだ保存するだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#==== Shell script for OpenCV 4.1.0 Installation ==== # File Name : install_opencv4.1.0_Nano.sh ## Update the packages sudo apt update sudo apt install -y nano sudo apt install -y build-essential cmake git libgtk2.0-dev pkg-config libswscale-dev libtbb2 libtbb-dev sudo apt install -y python-dev python3-dev python-numpy python3-numpy sudo apt install -y curl ## Install video & image formats: sudo apt install -y libjpeg-dev libpng-dev libtiff-dev libjasper-dev sudo apt install -y libavcodec-dev libavformat-dev sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev sudo apt install -y libv4l-dev v4l-utils qv4l2 v4l2ucp libdc1394-22-dev ## Download OpenCV and Contrib curl -L https://github.com/opencv/opencv/archive/4.1.0.zip -o opencv-4.1.0.zip curl -L https://github.com/opencv/opencv_contrib/archive/4.1.0.zip -o opencv_contrib-4.1.0.zip unzip opencv-4.1.0.zip unzip opencv_contrib-4.1.0.zip cd opencv-4.1.0/ ## Create directory mkdir release cd release ## Build cmake \ -D WITH_CUDA=ON \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.0/modules \ -D WITH_GSTREAMER=ON \ -D WITH_LIBV4L=ON \ -D BUILD_opencv_python2=ON \ -D BUILD_opencv_python3=ON \ -D BUILD_TESTS=OFF \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_EXAMPLES=OFF \ -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local .. ## Install OpenCv using 4 cores make -j4 sudo make install ## Delete zip files cd ~ rm opencv-4.1.0.zip rm opencv_contrib-4.1.0.zip |
メモリ領域を確保するために下記4つを、順番にやりますが、一つ一つに時間がかかりますので、進まないからといってターミナルを4つ開かないように!(やって失敗したのは私だけで十分です。)
1 |
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=6144 |
1 |
$ sudo chmod 600 /swapfile |
1 |
$ sudo mkswap /swapfile |
1 |
$ sudo swapon /swapfile |
で、この4つではOpenCV4.1.2もOpenCV4.1.1もうまくいかなかったので、気を取り直して下記の3つをやりました。
おそらく、上記4つは必要ないと思いますので試しに飛ばしてみてください。(リブートしなかったのが良くなかったのか?したかどうかも覚えてませんw)
目的は同様にメモリの確保で、4GBでよいっぽい。デフォルトが2GBなので 式中の割る2を削除すればOKです。
1 |
$ sudo apt-get install zram-config |
1 |
$ sudo sed -i -e "s/mem=\$(((totalmem \/ 2 \/ \${NRDEVICES}) \* 1024))/mem=\$(((totalmem \/ \${NRDEVICES}) \* 1024))/g" /usr/bin/init-zram-swapping |
1 |
$ sudo reboot |
1 2 |
# Move to home directory $ cd ~ |
1 2 |
# インストールのシェルスクリプトを実行します $ sh install_opencv4.1.0_Nano.sh opencv |
import cv2してprint(cv.__version__)で
4.1.0と出力されたらOKです。
・pythonからvideoCapture(0)したところ、MIPIカメラでは緑一色の画面しか出力されない。numpy.arrayなのでRGBを確認すると、きれいにすべての画素でR, G, B =[0, 255, 0] ですw 助けてくださいw
・安物のwebカメラではvideoCapture(1)したところ、問題なく映像が出力されています。ついでに顔認識などやってみましたが問題なし。
うーん、このままUVCカメラしか使えないのも尺ですしねえ。せっかくの800万画素のソニーIMX219センサが無駄になってしまう・・・
解決法ありましたら、コメントお願いします🙏
いつか4.1.2を入れられるようになりたいです。
SainSmart IMX219 AIカメラモジュールNVIDIA Jetson Nanoボード用8MPセンサー77度FoV
パラメータ
CMOSサイズ:1/4インチ
絞り(F):2.8
焦点距離:2.4mm
視野:77度
歪み:<1%
解像度:3280 x 2464
4つのネジ穴:定位置用
サイズ:25mm×24mm×19mm
パッケージ一覧
1×SainSmart IMX219 AIカメラモジュール「発送重量:0.02kg」
マニュアル
http://wiki.sainsmart.com/index.php/101-40-249
カメラモジュールが正しく認識していると /dev/video0 というディレクトリが自動的に作成されますのでcd で確認してみましょう。
同時にwebカメラを接続してみたところvideo1というディレクトリも作成されました。
デスクトップにカメラ画像を映し出すには
$ nvgstcapture
と打ちます。
http://www.neko.ne.jp/~freewing/raspberry_pi/nvidia_jetson_nano_setup_raspberry_pi_camera_module_v2/