Darkside(https対応しました)

2021年10月02日の記事

2021年10月2日(土) 21:09

なかなか動かない

 2台のカメラそれぞれに別のオブジェクト cam1 と cam2 を作成し、送信機操作によって cam1.read() するか cam2.read() するかを切り分けてみた。すると、切り分けたとたんにエラー。
 その後は、カメラが1台しか接続されていない!とエラーで怒られるようになった。
 リブートしても直らない。ACアダプターを挿し直しても、直らない。

 ケーブルとコネクターが緩んでいる可能性が疑われるが、目視ではそんなことはない。
 本格的に挿し直すためには、Jetson Nano を車体から外さねばならない。むちゃ面倒臭い。
 そこで、ACアダプターを抜いて放置。かなり時間が経ってから電源入れ直してみる。すると、2台めのカメラが復活した。いちおう1台めが操縦用広角カメラ、2台めが照準用望遠カメラとなるように接続している。

 しかし、複数台のカメラ映像を同時に表示している前例って、あちこちで見かけた気がする。不可能な訳はないだろう。
 そこで改めて前例を調べてみる。

 まず、cv2.VideoCapture() で複数カメラのオブジェクトを同時に生成保持することは、何ら問題無さそうである。

cam1 = cv2.VideoCapture(GST_STR1, cv2.CAP_GSTREAMER)
cam2 = cv2.VideoCapture(GST_STR2, cv2.CAP_GSTREAMER)

 送信機操作の結果として、pin1 が0か1に変化する。その値に応じて cam1 と cam2 のいずれから read() するかを切り分けると、前述の通り切り替えた瞬間にエラーになった。そこで、今回は両方とも別々にイメージを読み込んでおく。

pin1 = GPIO.input(19)
ret, img1 = cam1.read()
ret, img2 = cam2.read()

 そして jpeg 画像を作成する段階で、切り分ける。

if pin1 == 0:
    ret, jpeg = cv2.imencode('.jpg', img1)
if pin1 == 1:
    ret, jpeg = cv2.imencode('.jpg', img2)

 作成された jpeg を html ヘッダー付きで送り出す。

jpeg = jpeg.tobytes()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + jpeg + b'\r\n')

 だがこれでも、最初と同様のエラーになった。cam1 から cam2 に切り替えた瞬間にアウト。

Debugging middleware caught exception in streamed response at a point where response headers were already sent.
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/werkzeug/wsgi.py", line 462, in __next__
return self._next()
File "/usr/local/lib/python3.6/dist-packages/werkzeug/wrappers/response.py", line 49, in _iter_encoded
for item in iterable:
File "/var/www/html/cam.py", line 68, in get_image
ret, jpeg = cv2.imencode('.jpg', img2)
cv2.error: OpenCV(4.1.1) /home/nvidia/host/build_opencv/nv_opencv/modules/imgcodecs/src/grfmt_base.cpp:145:error: (-10:Unknown error code -10) Raw image encoder error: Empty JPEG image (DNL not supported) in function 'throwOnEror'

 関数の返り値を調べると、cv2.VideoCapture() は2つ同時でも成功しているのに対し、cam2.read() は失敗していた。それに気づかず cv2.imencode('.jpg', img2) したせいで Empty JPEG image とエラーになった訳で、エラー表示の内容は全くもって正しい。つまり問題は、なぜ cam2.read() が失敗したのか?という点。

written by higashino [Sタンク 1/16] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL
Darkside(https対応しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4