質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1751閲覧

open cvでカメラのラグを解消したい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/01/17 09:23

前提

jetsonにカメラをUSBで接続し、顔認証のプログラムを作成しているのですが、カメラの映像がカクカクしていて、かつ若干ラグがあります。

実現したいこと

ラグや画面のカクつきを直したい。

該当のソースコード

python

1import cv2 2import os.path 3import json 4import urllib.parse 5import urllib.request 6import time 7import datetime 8import paramiko 9import ast 10import threading 11 12# 現在時刻(ミリ秒) 13epoc = int(time.time() * 1000) 14 15# カメラの接続 16cap = cv2.VideoCapture(0) 17 18cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) 19cap.set(cv2.CAP_PROP_FPS, 15) 20 21# SSH接続設定 22sftp_config = { 23 'host' : "", 24 'port' : , 25 'user' : "ubuntu" 26} 27key_file = "~.pem" 28rsa_key = paramiko.RSAKey.from_private_key_file(key_file) 29 30# クライアントを作成 31client = paramiko.SSHClient() 32#client.set_missing_host_key_policy(paramiko.WarningPolicy()) 33client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 34client.connect(sftp_config['host'], 35 port=sftp_config['port'], 36 username=sftp_config['user'], 37 pkey=rsa_key) 38 39# SFTPセッション開始 40sftp_connection = client.open_sftp() 41 42# paramikoでのssh接続・実行関数 43def safr_request(img_file): 44 # ローカルPCからリモートサーバーへファイルを転送 45 sftp_connection.put(img_file, "../send_img.jpg") 46 47 stdin, stdout, stderr = client.exec_command("python3 test5.py") 48 cmd_result = r'' 49 for line in stdout: 50 cmd_result += line 51 # 実行結果を出力 52 #print(cmd_result.split("\n")[0]) 53 54 res = cmd_result.split("\n")[0] 55 res = res.replace("'",'"') 56 res = res.replace("True","true") 57 res = res.replace("False","false") 58 59 return res 60 61def safr_analyze(imgz, tmp_time): 62 # URLリクエストとレスポンス 63 response = safr_request("tmp.jpg") 64 #print(response) 65 img = cv2.imread("tmp.jpg") 66 #thread_start("tmp.jpg") 67 # フレーム画像のサイズ 68 h,w,_ = img.shape 69 #body_json = ast.literal_eval(response) 70 body_json = json.loads(response) 71 #print(body_json) 72 73 74 if "identifiedFaces" in body_json.keys(): 75 for face in body_json["identifiedFaces"]: 76 # 顔の位置の取得 77 # 値は画像の縦横を1としたときの比率 78 start_x = int(face["offsetX"]*w) 79 start_y = int(face["offsetY"]*h) 80 end_x = int(start_x + face["relativeWidth"]*w) 81 end_y = int(start_y + face["relativeHeight"]*h) 82 # 取得した範囲を描画 83 cv2.rectangle(img, (start_x,start_y), (end_x,end_y), (255, 0, 0), thickness=3) 84 85 # 年齢や性別などのデータ取得 86 name = face.get("name","") 87 age = face.get("attributes",{}).get("age",{}).get("age",0) 88 gender = face.get("attributes",{}).get("gender",{}).get("gender","") 89 occlusion = face.get("attributes",{}).get("occlusion",0) 90 sentiment = face.get("attributes",{}).get("sentiment",0) 91 mediaid = face.get("mediaId","") 92 personid = face.get("personId","") 93 newid = face.get("newId",False) 94 95 age2 = face.get("age",0) 96 97 98 root_epoc_date = int(face.get("rootPersonAddDate",0)/1000) 99 last_epoc_date = int(face.get("lastOccurrenceDate",0)/1000) 100 rootdate = datetime.datetime.fromtimestamp(root_epoc_date) 101 lastdate = datetime.datetime.fromtimestamp(last_epoc_date) 102 #print(rootdate, lastdate, name, age, age2) 103 104 if name == "" and personid != "": 105 name = personid 106 107 # 取得したデータを描画 108 put_text = f"{name}, {int(age)}, {gender}"#, {round(sentiment,2)}" 109 cv2.putText(img, 110 text = put_text, 111 org = (start_x+10,start_y+15), 112 fontFace=cv2.FONT_HERSHEY_SIMPLEX, 113 fontScale=0.5, 114 color = (255, 0, 0), 115 thickness=2) 116 #print(put_text) 117 else: 118 pass 119 # フレームをjpgで保存 120 #cv2.imwrite(f"{tmp_time}.jpg", img) 121 cv2.imwrite(f"test.jpg", img) 122 123 124 125class thread_start: 126 def __init__(self, img, tmp_time): 127 self.img = img 128 self.tmp = tmp_time 129 self.th = threading.Thread(target=safr_analyze, args=(self.img, self.tmp)) 130 self.th.start() 131 self.th.join() 132 133 134 135tmp_time = int(time.time()) 136 137while(1): 138 if time.time() < tmp_time+1: 139 continue 140 tmp_time = int(time.time()) 141 # カメラからフレーム取得 142 _, img = cap.read() 143 if img is None: 144 print("カメラがありません") 145 break 146 147 # フレームをjpgで保存 148 cv2.imwrite("tmp.jpg", img) 149 150 thread_start(img, tmp_time) 151 152 img =cv2.imread(f"test.jpg") 153 154 cv2.imshow('prev', img) 155 156 #cv2.imwrite("tmp2.jpg", img) 157 if cv2.waitKey(1) & 0xFF == ord('q'): 158 break 159 160client.close() 161cv2.destroyAllWindows() 162cap.release()

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

カメラの映像がカクカクしていて、かつ若干ラグがあります。

カメラのバッファを1に設定するとカメラのキャッシュが事実上無効になります。これでいくらかましになります。
対応済みですね

カメラのcap.read()をするスレッドと処理をするスレッドを分けて、処理をするスレッドはバッファと同じく長さ1のpipe()からデータを受け取るようにすればいくらかましになるはずです
多分まだ実装前ですね。YOLOの作者(AlexeyABさん)がUSBカメラからデータを取ってくる部分でこういう処理をしているので参考になるはずです。

jetsonにカメラをUSBで接続し

これが一番重い原因と思います。USBはCPUの負荷を上げるのでJetsonシリーズ次第ですがmipi接続のカメラならいくらか軽いはずです。高いJetsonであればそんなにラグはなさそうですが。。。

投稿2023/01/17 16:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/01/18 00:52

回答ありがとうございます。 回答について参考にさせていただきます。 なるほど、、カメラそのものですか、、 カメラについて他で検討できないか試してみます、、、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問