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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

12858閲覧

python opencvにてwebカメラのfps値が低い件

mi_yu

総合スコア9

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/07/04 06:22

編集2018/07/04 07:02

前提・実現したいこと

補足情報に書いた環境でプログラミングを行っています。
最終的に実現したいことはカメラを用いたリアルタイム画像処理です。(細かい内容は話が長くなるので省略します。)
そのためには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

ここにより詳細な情報を記載してください。

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

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

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

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

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

Wind

2018/07/04 06:55

動作環境に接続I/Fも必要です。USB2.0で非圧縮なら帯域不足です。
guest

回答1

0

ベストアンサー

今までの経験で最高のFPSを発揮させるには、opencvのvideo libraryのモジュールは性能的に貧弱。なので私の場合はdirect show系の入力でopencvに映像を渡して実現しています。
一番簡単なのは’EWCLIB.H'で(これでググると出ますよ)C++では実現しています。(貴殿はpythonですので工夫は必要ですが)

またサンプルにあるのですが、カメラを指定すると可能なコーデックとFPSが表示されるものも。

ただしEWCLIB.Hでは映像が32bitなので変換が必要。ライブラリー内のopencv用はうまく動作しない場合があるのでopencv側でcvtcolor関数で一発変換。
あとは試してみて。

投稿2018/07/04 11:40

編集2018/07/04 23:53
MasahikoHirata

総合スコア3747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問