2016-11-18 79 views
11

我正在使用OpenCV4Android版本2.4.10,並在三星Galayx GT-I9300上測試我的代碼。我的問題是,我必須從Play商店下載Opencv管理器,以便我的opencv代碼能夠運行,否則應用程序無法啓動。 我提到了一些postes「How to integrate OpenCV Manager in Android App」,知道如何在android上運行opncv代碼,而無需下載OpenCV管理器 ,但不幸的是,只要未安裝OpenCV管理器,該應用程序無法啓動。如何在沒有OpenCv管理器的情況下運行OpenCV代碼

我試過follwoing

static { 
    if (!OpenCVLoader.initDebug()) { 
     // Handle initialization error 
    } 
} 

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: 
      { 
       Log.i(TAG, "OpenCV loaded successfully"); 
       mOpenCvCameraView.enableView(); 
      } break; 
      default: 
      { 
       super.onManagerConnected(status); 
      } break; 
     } 
    } 
}; 
... 
... 
... 

@Override 
public void onResume() { 
    super.onResume(); 
    Log.w(TAG, "onResume"); 

    if (!OpenCVLoader.initDebug()) { 
     Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); 
     OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, getActivity(), mLoaderCallback); 
    } else { 
     Log.d(TAG, "OpenCV library found inside package. Using it!"); 
     mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
    } 
} 

但這並沒有解決問題。 請讓我知道如何在沒有下載Opencv管理器的情況下在android上運行opencv代碼?

更新

使用initAsync的:

請你提供一個示例演示如何使用 「initAsync()」 中的應用程序的生產版本?因爲我試圖這樣做,但當然我不能在靜態塊中使用它,因爲「intiAsync」的簽名如下所示:「OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10,this,mLoaderCallback);」我不能使用「this」關鍵字,也不是靜態塊

public class MainActivity extends AppCompatActivity { 

static { 
    //OpenCVLoader.initDebug(); 
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); //this keyword and "mLoaderCallback" are not defined in this scope 
} 

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: { 
       Log.i("MainActivity", "OpenCV loaded successfully"); 
      } 
      break; 
      default: { 
       super.onManagerConnected(status); 
      } 
      break; 
     } 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Mat m = new Mat(100, 100, CvType.CV_8UC4); 
    Log.d("MainActivity", "m.width()" + m.width()); 
    Log.d("MainActivity", "m.height()" + m.height()); 
} 
} 

回答

20

當你想一步一步的過程中回調「mLoaderCallback」的引用,所以我會從頭開始創建SampleOpenCV項目啓動,並會還建議在新項目中執行以下步驟,一旦開始工作,您可以嘗試將更改遷移到主項目。

  1. 下載OpenCV的包爲Android從Opencv.org [Direct Download Link V3.1]
  2. 拆開壓縮到您選擇的位置,在Android Studio中打開SampleOpenCV項目,然後文件 - >新建 - >導入模塊,這會打開一個新的彈出窗口進入模塊路徑,選擇{unzipped_opencv}/sdk/java,這將在SampleOpenCV下創建一個OpenCVLibrary310目錄。
  3. 現在打開SampleOpenCV/OpenCVLibrary310/build.gradleSampleOpenCV/app/build.gradle複製以下字段:
    • compileSdkVersion
    • buildToolsVersion
    • 的minSdkVersion
    • targetSdkVersion
  4. SampleOpenCV項目現在右鍵單擊,然後單擊打開模塊Srttings,尋找Modules >> app只選擇依賴

enter image description here

  • 點擊在右上方+符號,在彈出窗口中,並選擇3模塊依賴 。現在選擇OpencvLibrary310。關閉彈出窗口並讓Gradle同步。

  • 將libs文件夾{unzipped_opencv}/sdk/native/libs複製到app/src/main下的Android Studio中,並將其重命名爲jniLibs(請注意此處的情況)。

  • 已完成。

  • public class MainActivity extends AppCompatActivity { 
        static { 
         OpenCVLoader.initDebug(); 
        } 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
         Mat m = new Mat(100, 100, CvType.CV_8UC4); 
        } 
    } 
    

    注意OpenCVLoader.initDebug()必須用於調試的目的只有當你在你的機器上本地開發的。但對於需要在Play商店等平臺上發佈應用程序的製作目的,您必須使用OpenCVLoader.initAsync()。實際上,初始化OpenCVLoader需要一些時間,具體取決於手機。所以如果你加載它,那麼它會在主線程中執行,這可能會阻塞UI的一小部分時間。因此,建議加載在後臺OpenCV的可使用實現initAsync()

    +0

    謝謝您的回答和你的努力..我只是混淆生產版本和調試版本! ..regarding我正在開發包含opencv代碼的應用程序是它的調試版本還是生產版本?請諮詢 – user2121

    +0

    編輯... @ user2121 – ZdaR

    +0

    非常感謝您的詳細答案..但請耐心等待,我仍然有一個問題,請......如你在更新的答案中提到的 - 「所以建議加載OpenCV在後臺可以使用initAsync()實現 - 「爲什麼不總是使用」initAsync()「而不是」initDebug()「? – user2121

    相關問題