前提・実現したいこと
補足情報に書いた環境でプログラミングを行っています。
最終的に実現したいことはカメラを用いたリアルタイム画像処理です。(細かい内容は話が長くなるので省略します。)
そのためには60fpsの入力とそれに間に合う処理能力が必要です。
そこで現状のプログラムで実行してみたところ、まったく希望のfps値が出なかったため、
いろいろな処理を省いた、「入力した画像をディスプレイに表示する」だけのプログラムで行いましたが
同様に10fpsほどしかでません。
使用しているカメラ(Logicool c922pro)が1280*720の解像度でのみ60fps出力が可能な仕様です。
画像処理に必要な解像度は低くて十分なので実際使う際には低解像度かつ高フレームレートが可能なカメラを用意する予定です。
同カメラで解像度を下げたところ30fpsでは表示されました。
1280*720 60fpsで実行した際のcpu使用率は5%ほどですのでpython、opencvがボトルネックとなっているのか
原因が不明です。
今回は高解像度で入力をしたため処理が遅くなってしまった原因と思われますが、
低解像度で入力しても多くの処理を行うためcpuリソースが使われないことも気になります。
入力映像のfpsが低いことと使用しているcpuリソースが低いことについてアドバイスいただけたら幸いです。
該当のソースコード
#player.py
import cv2
import sys
import numpy as np
from time import sleep
import fps
gFrameRate = fps.FrameRate() # fps表示クラスの初期化
fontcolor = (255, 255, 255)
fontface = cv2.FONT_HERSHEY_SIMPLEX
fontthick = 2
c = cv2.VideoCapture(0)
c.set(cv2.CAP_PROP_FPS, 60) # カメラプロパティ設定
c.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
c.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
sleep(3)
while(1):
r, img = c.read()
fps = gFrameRate.get() # fps算出
fps_str = '%4d' % fps # fps
cv2.putText(img, fps_str, (10, 25), fontface, 1.0, fontcolor, fontthick, cv2.LINE_AA) # fps表示
cv2.imshow("input", img)
key = cv2.waitKey(1) & 0xFF
if(key == 113):
sys.exit()
c.release()
cv2.destroyAllWindows()
該当のソースコード
#fps.py
import cv2
class FrameRate:
def init(self):
self._count = 0
self._fps = 0
self._freq = 1000 / cv2.getTickFrequency()
self._tmStart = cv2.getTickCount()
self._tmNow = cv2.getTickCount()
def get(self):
self._count += 1
self._tmNow = cv2.getTickCount()
tmDiff = (self._tmNow - self._tmStart) * self._freq
if tmDiff >= 1000 :
self._tmStart = self._tmNow
self._fps = self._count
self._count = 0
return self._fps
補足情報(FW/ツールのバージョンなど)
windows10 home, python3.6.6rc1, opencv3.4.1
webカメラ:Logicool c922 pro
カメラとpcの接続インターフェースはusb2.0、3.0どちらでも同じ状況です。
pc:
cpu:i7 4770K 4C8T
メモリ:ddr3 12GB
gpu:gtx770
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー