Android OpenCV应用程序的静态初始化使它慢得多

时间:2014-04-11 10:58:00

标签: android performance opencv static-linking native-code

我使用Android OpenCV创建了一个简单的应用程序。它也有一个jni部分。一切都很好。现在,我想静态地初始化它,所以我跟着instructions它似乎工作。

问题

应用程序工作真的很慢。我正在使用CameraBridgeViewBase从相机捕捉图像。我使用jni在C ++中处理它并在另一个相邻窗口(ImageView)上显示已处理的图像。当我使用OpenCV的Android管理器链接应用程序时,它正在 10 FPS 下工作。但是当我静态地链接它时,它减慢到 2 FPS 。我从native camera更改为java camera,这更慢。 (即使链接到opencv管理器,本机相机似乎也很慢)。我正在 NEXUS 4 上使用 Android 4.4 并使用 OpenCV 2.4.8 对此进行测试。

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include /home/jay/Android_OpenCV/OpenCV-2.4.8-android-sdk/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := light_exposure
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS +=  -llog -ldl
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-9

Java代码

public class ExposureActivity extends Activity implements CvCameraViewListener2 {

    private static final String TAG = "exposure::ExposureActivity";
    private CameraBridgeViewBase mOpenCvCameraView;
    private int tFrame=0;
    // other code

    static {
     if(!OpenCVLoader.initDebug())
     {
             Log.i(TAG, "Static linking failed");
     }
     else
         {
               System.loadLibrary("opencv_java");
               System.loadLibrary("light_exposure"); // jni module  
               Log.i(TAG, "static linking success");
         }
    }

     // other code

     @Override
     public void onResume()
     {
         super.onResume();
         //OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_8, this, mLoaderCallback);
     }

     // When I press start button in the application
     public void onClickStartButton(View view){
         mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.opencv_part_java_surface_view);
         mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
         mOpenCvCameraView.setCvCameraViewListener(this);
         mOpenCvCameraView.enableView();
     }

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        tFrames ++;
        Log.i(TAG, "frame number " + String.valueOf(tFrames));
        mRgba = inputFrame.rgba();
        processForExposure(mRgba.getNativeObjAddr(), mDis.getNativeObjAddr()); // native function

        int w = mDis.width();
        int h = mDis.height();
        Bitmap.Config conf = Bitmap.Config.ARGB_8888;
        Bitmap retBmp = Bitmap.createBitmap(w, h, conf);

        Utils.matToBitmap(mDis, retBmp);

        Message msg = new Message();
        msg.obj = retBmp;
        mHandler.sendMessage(msg); // to set the bitmap image in ImageView

        return mRgba;
   }

}

我错过了什么吗?为什么性能如此之慢?此外,java_camera似乎丢帧。 enter image description here

1 个答案:

答案 0 :(得分:0)

本文关于embedded.com

似乎说动态链接器为硬件选择最好的库,这可以解释加速

动态链接与OpenCV Manager相结合的另一个优势是后者的自动硬件检测功能。 OpenCV Manager自动检测其安装的平台,并为该硬件选择最佳的OpenCV库