我目前正在进行与相机/视频相关的Android本地图像处理工作。
我正在使用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"
我尝试使用“..\assets\vmData\test\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,所以我不认为这是任何权限问题。
我已经苦苦挣扎了几个小时。
非常感谢您的帮助!