android-layout - Android 预览相机未填充其 FrameLayout

标签 android-layout opencv android-camera

我已经开始研究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>

我用过的教程是
this

本教程使用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)

最佳答案

解决了手动设置“CameraBridgeViewBase”类的变量“mScale”的值的问题。就我而言,它等于 1.0。如果设置为 1.3,相机会被拉伸(stretch)(结果是预览似乎有点缩放),因此会删除黑色边框。

关于android-layout - Android 预览相机未填充其 FrameLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16837518/

相关文章:

android - 如何使用新的 Android 约束布局来减少 View 层次结构

java - Android - 在 TableRow 上设置固定高度似乎不起作用

android - 如何搜索搜索字符串中的任何字符?

c++ - 将数据放入 Opencv 中的 Mat 对象中

python - 如何跟踪具有特定颜色的矩形

android - Samsung galaxy S4 图像捕捉问题

android - 如何在 fragment 中添加tabhost

python - 如何从opencv中的图像中删除多余的空格?

android - 当我在不同的设备中尝试时,应用程序内的相机强制关闭数据为空

Android 弃用了 android.hardware.Camera,现在建议使用 android.hardware.camera2 但这在 API 21 以下的任何内容中都不可用