で私は、バイナリ行列の収縮と膨張を行う機能を持っている: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を取得しますが、これはまだ非常に遅いです。
ありがとうございます!私もあなたの質問を見ていきます。私の解像度は640 x 480ですが、時には1920 x 1080で始まり、それを修正する方法がわかりません。あなたはグローバルバールの作成について言及しました。それはimgディメンションをグローバルとして設定することを意味しますか?私が間違って理解していない限り、それがどのように役立つか分かりません。 –
また、忘れてしまったことに、別のhsvのしきい値で色付きのオブジェクトを探しているので、私はmorphOps()を別のバイナリマットオブジェクトで7または8回呼び出します。それが私の仕事を遅らせています。そのため、私は並列処理を検討しています。 –
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(); –