4

我正在尝试使用 opencv 将视频设置为全屏。输入来自相机。它显示在中心的屏幕上,但不是全屏显示。相关代码:

public class Sample3Native extends Activity implements CvCameraViewListener {
private static final String TAG = "OCVSample::Activity";

private Mat                    mRgba;
private Mat                    mGrayMat;
private Mat                    mFinalMat;

private CameraBridgeViewBase   mOpenCvCameraView;


private BaseLoaderCallback     mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");

                // Load native library after(!) OpenCV initialization
                System.loadLibrary("native_sample");




                mOpenCvCameraView.enableView();



            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

public Sample3Native() {
    Log.i(TAG, "Instantiated new " + this.getClass());
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "called onCreate");
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    setContentView(R.layout.tutorial3_surface_view);

    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial4_activity_surface_view);
    mOpenCvCameraView.setCvCameraViewListener(this);


}

我试过使用:

//mOpenCvCameraView.setScaleX(0.8f);
                   // mOpenCvCameraView.setScaleY(0.4f);

                //mOpenCvCameraView.setMinimumHeight(800);
               // mOpenCvCameraView.setMinimumWidth(1000);

但它不起作用。

我怎样才能拉伸框架以填满整个屏幕?

4

6 回答 6

4

您可以获取可用分辨率列表或手动设置。

如果您想获取可用尺寸列表并获得最佳相机尺寸。

   if (mOpenCvCameraView != null) {
        List<Size> sizes = mOpenCvCameraView.getSupportedPreviewSizes();
        int mFrameWidth = width;
        int mFrameHeight = height;

        // selecting optimal camera size
        {

            double minDiff = Double.MAX_VALUE;
            for (Size size : sizes) {
                if (Math.abs(size.height - height) < minDiff) {
                    mFrameWidth = (int) size.width;
                    mFrameHeight = (int) size.height;
                    minDiff = Math.abs(size.height - height);
                }
            }
        }

        mOpenCvCameraView.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth);
        mOpenCvCameraView.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight);
    }

如果最佳相机尺寸不是全屏,则很容易从列表中获得相机支持的大尺寸。

其他选项是手动设置大小:

        mOpenCvCameraView.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, 1000);
        mOpenCvCameraView.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, 800);

代码来源来自人脸检测 OpenCV 2.4.2 版本。

于 2012-11-14T11:32:21.710 回答
2

对于那些在这里谷歌并只想更改分辨率的人,

mOpenCvCameraView.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, 1000)方法不起作用。

尝试使用mOpenCvCameraView.setMaxFrameSize(640, 480);

它适用于OCV4Android2.4.5,教程 2,混合处理。

于 2013-07-08T08:48:12.063 回答
1

对于仍在寻找这个的人,我已经解决了这个问题(有点)。我似乎无法让它适用于 OpenCV v 2.4.3。我已经尝试了互联网上的所有内容。但是,在 OpenCV 2.4.3.2 中,他们添加了一种设置相机尺寸的方法

disconnectCamera();
mMaxHeight = //your desired height
mMaxWidth = //your desired width
connectCamera(mMaxWidth, mMaxHeight);

查看 OpenCV 教程 5,特别是 SampleJavaCameraView -> setResolution 方法

于 2013-02-01T17:46:38.107 回答
0

不是最好的解决方案,但你可以去AndroidManifest.xml和设置android:screenOrientation="landscape"

有了这个,您不需要将相机旋转 90º,但您的应用程序将始终处于横向模式。

于 2017-06-01T09:23:07.727 回答
0

OpenCV 相机的自然相机方向是横向的,所以让你的活动就像

android:screenOrientation="landscape"

并在活动中应用这个主题

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        ...
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
</style> 

这个技巧给你一个全屏相机。

于 2020-08-18T15:41:14.963 回答
-2

试试这个替换

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

onCreate 中的代码

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                            WindowManager.LayoutParams.FLAG_FULLSCREEN);
于 2012-11-14T11:54:10.357 回答