2017-04-13 69 views
1

我目前正在使用相機/視頻進行Android本機圖像處理。Andriod Studio OpenCV 3.2,無法用本地OpenCV打開視頻文件或安卓相機

我使用OpenCV 3.2來捕獲和處理圖像。
問題是,我無法打開任何種類的視頻源或相機

這是我的C++代碼。

cv::VideoCapture cap; 
cv::Mat frame; 

JNIEXPORT void JNICALL 
Java_com_project_vmtest_Native_openVideo(JNIEnv *env, jobject instance, jstring fileName) { 

    const char * fileNameNative; 
    jboolean isCopy; 
    fileNameNative = env->GetStringUTFChars(fileName, &isCopy); 

    cap = cv::VideoCapture(fileNameNative); 
    cap.open(fileNameNative); 
    if(cap.isOpened())  // ALWAYS FALSE HERE!!!! 
     cap.read(frame); 
} 

JNIEXPORT void JNICALL 
Java_com_project_vmtest_Native_render(JNIEnv *env, jclass type) { 
    if(engine){ 
     cap.read(frame); 
     if (frame.empty())  return; // ALWAYS RETURNS HERE!!!! 
     engine->prepare(frame); 
     engine->renderObjToFBO(); 
     engine->renderFrame(); 
     engine->clearFrameData(); 
    } 
} 

我檢查fileName,它似乎是適當的。
即這是我的文件結構:

app\src\main\cpp\native_main.cpp // native code 
app\src\main\assets\vmData\test\testFile.mp4 // video file 

然後fileName是:

fileName = "../assets/vmData/test/testFile.mp4" 

我」 .. \資產\ vmData \測試\ testFile.mp4" 並沒有什麼改變嘗試。

我試過cap.open(CV_CAP_ANDROID + 0);抓取相機預覽並得到了相同的結果,VideoCapture根本不會打開!

我使用下面的代碼啓用了Android攝像頭權限。

<uses-permission android:name="android.permission.CAMERA"/> 
<uses-feature android:name="android.hardware.camera"/> 
<uses-feature android:name="android.hardware.camera.autofocus"/> 
<uses-feature android:name="android.hardware.camera.front"/> 
<uses-feature android:name="android.hardware.camera.front.autofocus"/> 

我的測試設備是Android 5.0 Lollypop,所以我不認爲這是任何類型的權限問題。

掙扎數小時。
任何幫助表示讚賞!

+0

可能相關:https://github.com/headupinclouds/gatherer/issues/19(見最後一項)。更相關:https:// github。com/opencv/opencv/issues/5374#issuecomment-141995879 –

+0

@MorrisonChang我檢查了鏈接,找不到任何有助於我的情況的東西。無論如何感謝您的回覆;) –

回答

0

我未能在原生代碼中打開相機,而是最終使用了Android OpenCV Camera實現,opencv.android.CameraBridgeViewBase


MainActivity.java

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { 

    private CameraBridgeViewBase mCvCamView; 
    Mat matInput, matOutput; 

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) { 
       case LoaderCallbackInterface.SUCCESS: 
        mCvCamView.enableView(); 
        break; 
       default: 
        super.onManagerConnected(status); 
        break; 
      } 
     } 
    }; 


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

     mCvCamView = (CameraBridgeViewBase)findViewById(R.id.cam_view); 
     mCvCamView.setVisibility(SurfaceView.VISIBLE); 
     mCvCamView.setCvCameraViewListener(this); 
     mCvCamView.setCameraIndex(1); // front-camera(1), back-camera(0) 
     mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 
     if (mCvCamView != null) 
      mCvCamView.disableView(); 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 

     if (!OpenCVLoader.initDebug()) { 
      Log.d(TAG, "onResume :: Internal OpenCV library not found."); 
      OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mLoaderCallback); 
     } else { 
      Log.d(TAG, "onResume :: OpenCV library found inside package. Using it!"); 
      mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
     } 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
     if (mCvCamView != null) 
      mCvCamView.disableView(); 
    } 

    @Override 
    public void onCameraViewStarted(int width, int height) { 
     if (matOutput == null || matOutput.empty()) 
      matOutput = new Mat(height, width, CvType.CV_8UC4, new Scalar(255, 0, 0, 255)); 
    } 

    @Override 
    public void onCameraViewStopped() {} 

    @Override 
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 
     matInput = inputFrame.rgba(); 
     Native.extract(matInput.getNativeObjAddr(), matOutput.getNativeObjAddr()); 
     return matOutput; 
    } 

} 


activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <org.opencv.android.JavaCameraView 
     android:id="@+id/cam_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout>