ねののお庭。

かりかりもふもふ。

openCVの描画が遅い問題を解決しました。


2018/3/10追記

どうもこのブログ、この記事だけ閲覧数がやたら多いので同じ問題にぶつかる人多いのかなぁという気持ちになりましたので。

https://github.com/nenoNaninu/glImshow

(じーえるあいえむしょう)

って感じでコード(たぶん)読みやすくシンプルなライブラリ(?)調にして使いやすくしてみました。

もしよければgithubの方に☆スター☆お願いします!


 

進捗が生れなくてつらいのでブログを書くなどします。現実逃避です。

 

さて私はopenCVでよく遊んでるんですが。それなりの処理をするとすぐにフレームレートが下がってしまい、うーんといった感じになります。opencvは高速なハズ...。

そこで原因を探るべくいろいろ計測してると、なんと描画関連が悪さをしていることが判明しました。

そこでその情報をもとにググるとこんな記事がありました。とても有益でした、ありがとうございます。

http://13mzawa2.hateblo.jp/entry/2015/12/28/180021

なるほど。って感じ。

cv::waitKeyが諸悪の根源らしい。15msもそこで固まってればそりゃ遅くなりますわ。

そして上記の記事上でも言及されていますが、描画が遅いなら他の描画できるライブラリ叩いでどうにかしちゃえばいいじゃない!

ということですのでどうにかしました。

 

描画の方だけopenglに投げる形の簡単なサンプルを書きました。

https://github.com/nenoNaninu/drawSpeedTest

自分のメモ用で作った感じだからだいぶソースが汚いけどそこらへんはまぁ。

 

ざっくり解説メモおいておくと。

glutIdleFuncに登録した関数は暇なときに呼ばれます。

ぶちゃけこれに登録した関数がコールバックとかなければ最速でループされ続けるっぽい。ので最速で回したい処理を書いておきます。

でvoid idleでは画像をopencv用からopenglのフォーマットに変えてあげて、glDrawPixels使ってデータ流し込んで描画してもらってる形です。

 

計測の結果ですが。

opencvで静止画をdrawopencv.cppみたいな形でwhileで描画し続けるとfpsはだいたい60くらいなんですが、openglで描画すると最高で300fpsくらい出ました。

これで描画が遅くて問題になるなんてことはなくなりました!やったね!

 

ちなみになんですが。

realsense、公式ではカラーカメラが60fpsまで出るらしいのですが、うちの子は34fpsが限界のようでした。悲しい。realseseから画像引っ張ってきてリアルタイム処理なにかかけて比較したかった。

カメラのfpsが遅いんじゃどうしようもないので静止画で描画速度の比較をしました。。。

point grayとかの高速なカメラが大学の部室に転がってたはずだし試してみたいところ。