2

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

5 回答 5

2

一般opencv摄像头是4:3的比例,所以用命令让action bar和notifcation bar不可见

requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

把它放在 onCreate() 和 setContentView() 之间。

这使相机预览全屏..它适用于我:D

于 2015-03-27T16:04:30.390 回答
2

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

于 2013-06-03T15:29:32.907 回答
0

有一个功能可以改变预览的分辨率,所以应该可以适应框架布局的大小

不幸的是,生活并不像看起来那么容易。预览的分辨率可能会更改,但只能更改为SizegetSupportedPreviewSizes() 为您的相机返回的其中一个(请注意,前置摄像头和后置摄像头通常支持不同的列表)。

关于缩放,您可以这样做,但它会导致预览图像失真。最好的解决方案是裁剪相机视图:

HelloOpenCvView.setX(-0.5*(HelloOpenCvView.get width()-screenWidth))
于 2015-03-27T21:20:41.913 回答
0

您可以使用对象的setMaxFrameSize()方法CameraBridgeViewBase来设置传入帧大小。

只需在您的onCreate()方法中或在您初始化CameraBridgeViewBase对象的任何地方调用它,然后将其放在后面......

对我来说是..

mOpenCvCameraView.setMaxFrameSize(720, 480);

请注意,720 和 480 是我的设备的值,您可以根据需要设置它来填充 FrameLayout。

于 2018-03-15T16:14:09.267 回答
0

我进入CameraBridgeViewBase,进入deliverAndDraw Frame函数,只是改变了canvas.drawBitmap函数的参数

  if (mScale != 0) {
            // My new parameters for drawBitmap:
                canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
                        new Rect(0,0,canvas.getWidth(),canvas.getHeight()) ,null);

    // I commented out the lines below
   /*         canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
                     new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2), //0
                     (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2), //0
                     (int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2 + mScale*mCacheBitmap.getWidth()),
                     (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2 + mScale*mCacheBitmap.getHeight())), null);
          */
 } 
于 2015-12-12T19:06:57.060 回答