2016-07-18 4 views
2

で私は、バイナリ行列の収縮と膨張を行う機能を持っている:OpenCVのAndroidのプログラムのボトルネックの形態学的機能

void Detector::morphOps(Mat& binFrame) { 
    Mat erodeElement = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); 
    Mat dilateElement = getStructuringElement(MORPH_ELLIPSE, Size(10, 10)); 

    erode(binFrame, binFrame, erodeElement); 
    dilate(binFrame, binFrame, dilateElement); 
    dilate(binFrame, binFrame, dilateElement); 
} 

これは私が追跡する物体を検出して、私のプログラムが大幅より堅牢になります。しかし、このコードは私の残りのプログラムの大きなボトルネックです。機能が有効になっていると、25〜30フレーム/秒から< 1フレーム/秒に落ちます。私のフレームレートを殺すのを防ぐために何かできることはありますか?つまり、同じタスクをより効率的に実行する別のopencv関数ですか?

私はマルチスレッド化も検討していますが、私はAndroidとopencvがかなり新しいので、ここで実装する方法はわかりません。上記のコードは私のプログラムのネイティブ(jni)部分です。

EDIT:私がこれまで試してみましたオルタナティブ:

morphologyEx()オープニング+閉鎖は - DILATEサイズが浸食されるサイズよりも大きくする必要があるためにも行いません。

morphologyEx()closing + dilate() - Androidではパフォーマンスが大幅に向上しません。

MORPH_ELLIPSEをMORPH_RECTに変更しました。私は今〜8fpsを取得しますが、これはまだ非常に遅いです。

答えて

0

私のZenfone 2でテストしたところ、パフォーマンスの問題はほとんどありませんでした.30fpsから23fpsになりましたが、640x360の解像度を使用しました。すべての時間を初期化する必要が

javaCameraView.setMaxFrameSize(size.width, size.height); 

あなたもそうでないグローバルVARSを行うことができます:

は、画像の解像度を減らしてみてください

Mat erodeElement = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); 
Mat dilateElement = getStructuringElement(MORPH_ELLIPSE, Size(10, 10)); 

void morphOps(Mat& binFrame) { 
    erode(binFrame, binFrame, erodeElement); 
    dilate(binFrame, binFrame, dilateElement); 
    dilate(binFrame, binFrame, dilateElement); 
} 

がjavaCameraViewからあなたのフレームはありますか?

.nativeObjは、データを再コピーせずにポインタを渡します。あなたがこのように使用、C++に、Javaからデータを渡す方法も重要です。

スレッドについては、それは良いアイデアかもしれませんが、それを安全に動作させるには非常に複雑です。また、「AndroidでのOpenCVマルチスレッド」に関する質問もあります。 Here

これを書いている時点でまだ答えはありませんでしたが、私に従うことができます。

+0

ありがとうございます!私もあなたの質問を見ていきます。私の解像度は640 x 480ですが、時には1920 x 1080で始まり、それを修正する方法がわかりません。あなたはグローバルバールの作成について言及しました。それはimgディメンションをグローバルとして設定することを意味しますか?私が間違って理解していない限り、それがどのように役立つか分かりません。 –

+0

また、忘れてしまったことに、別のhsvのしきい値で色付きのオブジェクトを探しているので、私はmorphOps()を別のバイナリマットオブジェクトで7または8回呼び出します。それが私の仕事を遅らせています。そのため、私は並列処理を検討しています。 –

+0

javaCameraView.setMaxFrameSize(size.width、size)を呼び出す必要があります。高さ);このように、ビューを有効にする前に : javaCameraView =(JavaCameraView)findViewById(R.id.cameraView)。 javaCameraView.setMaxFrameSize(size.width、size.height)。 javaCameraView.setVisibility(SurfaceView.VISIBLE)。 javaCameraView.setCvCameraViewListener(this); javaCameraView.enableView(); javaCameraView.enableFpsMeter(); –

関連する問題