とあるカメラの映像をPython3で読み込みOpenCVで処理を行いたいと考えて試しています
Bufferに読んだ映像フレーム分をOpenCVのFrameに変換する方法がないかを模索しております。
知識不足で恐縮ですが、お分かりになる方がいらっしゃいましたらお願いいたします。
やりたいこと
python
1 picture = tcp_client.recv(DataLen)
上記で読み取ったpictureの変数の中身をOpenCVに1フレームとして取り込みたい
やったこと
以下のコードを含むPythonコードで取得したデータを標準出力に書き出しmplayerにリダイレクト
→ 映像を表示することができました
python
1 picture = tcp_client.recv(DataLen) 2 sys.stdout.buffer.write(picture) 3
python3 camera-receiver-mplayer.py 192.168.137.11 | mplayer -fps 10 -nosound -vc ffh264 -noidx -mc 0 -
試したこと
Python
1raw_image = picture 2image = np.frombuffer(raw_image, dtype=np.uint8) 3decoded = image 4cv2.VideoWriter_fourcc('H','2','6','4') 5cv2.namedWindow("recv",cv2.WINDOW_NORMAL) 6frame = cv2.imdecode(decoded, cv2.IMREAD_COLOR) 7cv2.imshow("recv", frame)
結果:失敗
OpenCVにフレームが渡せずサイズ認識ができていないように見える
OpenCV Error: Assertion failed (ssize.width > 0 && ssize.height > 0) in resize, file /build/opencv-XDqSFW/opencv-3.2.0+dfsg/modules/imgproc/src/imgwarp.cpp, line 3492
"cv2.VideoWriter_fourcc"は保存する時の道具なので、表示する時には別の方法でないといけないと思います。
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html
print(type(image ))
print(image.shape)
の結果を教えてもらえますか?
もしNumpy arrayかつ、(320,240,3)のような回答であれば、
cv2.imshow("recv", image )
cv2.waitKey(0)
でそのまま表示できるはずです。
> とあるカメラの映像をPython3で読み込みOpenCVで処理を行いたい
そのカメラには、URLでアクセスできないのでしょうか?
参考
https://qiita.com/haseshin/items/59aed8bae8a1fa88fa21
https://www.yasutomo57jp.com/2010/09/12/opencv%E3%81%8B%E3%82%89%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AEvideoapi%E3%82%92%E5%88%A9%E7%94%A8/
カメラにURLでアクセスできず、
> picture = tcp_client.recv(DataLen)
のデータを使う場合ですが、そのデータがh264でエンコードされてるのなら、たとえば
https://stackoverflow.com/questions/59998641/decode-and-show-h-264-chucked-video-sequence-with-python-from-pi-camera
みたいな方法でデコードしないといけないような
コメントありがとうございます
fourteenlengthさん
print(type(image ))
<class 'numpy.ndarray'>
print(image.shape)
(22660,)
となっています。
jbpb0さん
カメラはURLアクセス不可のため、ある一定周期でフレームのみを取得する仕様になっています。
フレーム自体はH264エンコードされています。
> フレーム自体はH264エンコードされています。
それならやはり、デコードして生動画データにしてからOpenCVに渡すのだと思います
私が前のコメントで紹介した方法以外にも、ググったらPythonでh264のデコードができるものがいくつか見つかるので、そういうもののどれかを使って
ありがとうございます。
ありがとうございます。
HWがJetsonなので、ここでH264decodeをさせてからOpenCVに渡す方法を検討しようと
現在H264decodeをチャレンジ中です。
まだコマンドがうまく扱えて居なくチャレンジ継続しています。