我已经开始研究Android的一些东西,以便开发一些应用程序。为此,我使用 Eclipse Juno。然后,我还下载了 Opencv4Android(2.4.5 版本),以使用这些库的功能。我已经在 Eclipse 中导入了所有教程,并且我决定使用示例“cameracontrol”作为我的应用程序的基础。现在,我有一个问题:我在界面顶部的框架布局中找到了相机的预览。但是框架布局是这样出现的:相机预览周围有黑边,因为预览大小和框架布局不同,所以不匹配。
在相机控制中,在Tutorial3View类中,有一个函数可以改变预览的分辨率,所以应该可以适应框架布局的大小,但是如果我在onCreate()方法中插入主要活动,应用程序崩溃。方法是:
public void setResolution(Size resolution) {
disconnectCamera();
mMaxHeight = resolution.height;
mMaxWidth = resolution.width;
connectCamera(getWidth(), getHeight());
}
因此,如果在 OnCreate() 方法中我尝试获取框架布局的宽度和高度,并将其作为 Size 传递给 setResolution,我的代码将不起作用。
否则,我宁愿将框架布局的大小调整为预览的大小,以免预览失真。
这是框架布局的xml代码:
<FrameLayout
android:id="@+id/frame_capture"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="visible"
android:clickable="false" android:foregroundGravity="fill" android:layout_weight="0.7"
android:layout_gravity="top">
<com.micaela.myapp.MyView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/HelloOpenCvView"
android:visibility="gone"
opencv:show_fps="true"
/>
<ImageButton
android:layout_width="51dp"
android:layout_height="43dp"
android:id="@+id/imageButton"
android:layout_gravity="bottom|left"
android:src="@drawable/switch_cam"
android:background="#FF000000" android:cropToPadding="false" android:scaleType="centerCrop"/>
</FrameLayout>
我使用的教程是
这个
本教程使用 org.opencv.android.JavaCameraView 类来打开设备的摄像头。我能怎么做?
我还考虑在捕获时动态调整每一帧的大小。所以在onCameraFrame方法中,我调用了这个函数:
public void manageSize(Mat matrix){
size = new org.opencv.core.Size(frameLayout.getMeasuredWidth(),frameLayout.getMeasuredHeight());
Log.i(TAG,"ciao "+frameLayout.getMeasuredHeight());
Log.i(TAG,"ciao "+frameLayout.getMeasuredWidth());
Log.i(TAG,"prova "+size); //arrivano perfettamente i valori.
Imgproc.resize(matrix,matrix,size);
}
传递框架,其中 frameLayout 是预览的容器。我已经验证框架的宽度和高度值正确到达。在这种情况下,我收到此错误:
05-31 11:34:47.548: ERROR/cv::error()(17253): OpenCV Error: Assertion failed (src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file /home/reports/ci/slave/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp, line 97
05-31 11:34:47.548: ERROR/org.opencv.android.Utils(17253): nMatToBitmap catched cv::Exception: /home/reports/ci/slave/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
05-31 11:34:47.548: ERROR/CameraBridge(17253): Mat type: Mat [ 1013*1050*CV_8UC4, isCont=true, isSubmat=false, nativeObj=0x70b0c4b0, dataAddr=0x74f6d010 ]
05-31 11:34:47.548: ERROR/CameraBridge(17253): Bitmap type: 960*720
05-31 11:34:47.548: ERROR/CameraBridge(17253): Utils.matToBitmap() throws an exception: /home/reports/ci/slave/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)