OpenCV 4.5.0 空 JavaCameraView 和 JavaCamera2View [英] OpenCV 4.5.0 empty JavaCameraView and JavaCamera2View

查看:51
本文介绍了OpenCV 4.5.0 空 JavaCameraView 和 JavaCamera2View的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在使用最新的 OpenCV 4.5.0 版来获取相机帧并对其进行处理.但问题是在做完所有事情之后,我的 JavaCameraView 是空的,里面什么都没有.与 JavaCamera2View 相同.我以前使用过 openCV 3.4.5 相同的代码工作正常.同样直到 4.1.0,之后从 4.1.1 到现在的问题都是一样的,尝试了很多东西但没有运气.我也尝试过这个解决方案,但在 4.5.0 中没有运气.我的应用程序中至少需要 4.4.0,因为我将在 CV 中使用 YOLO 4.我只是使用基本代码来查看框架.我的应用程序中没有收到任何类型的错误消息.这是代码.

I am using OpenCV version 4.5.0 latest currently to get the camera frames and process them. But the issue is after doing everything my JavaCameraView is empty blank with nothing in it. Same with JavaCamera2View. I have previously used openCV 3.4.5 same code working fine. Also till 4.1.0, after that from 4.1.1 till now issue is the same tried many things but no luck. I have also tried this solution but no luck with 4.5.0. I at least need 4.4.0 in my application cause I will be using YOLO 4 with CV. I am just using basic code just to get the frame in view. I am not getting any kind of error message in my app. Here are the codes.

MainActivity.java

package com.learn.ocv450;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.SurfaceView;
import android.widget.Toast;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCamera2View;
import org.opencv.android.JavaCameraView;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {

    CameraBridgeViewBase cameraBridgeViewBase;
    BaseLoaderCallback baseLoaderCallback;
    int counter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        cameraBridgeViewBase = (JavaCamera2View) findViewById(R.id.CameraView);
        cameraBridgeViewBase.setVisibility(SurfaceView.VISIBLE);
        cameraBridgeViewBase.setCvCameraViewListener(this);

        baseLoaderCallback = new BaseLoaderCallback(this) {
            @Override
            public void onManagerConnected(int status) {
                super.onManagerConnected(status);

                if (status == BaseLoaderCallback.SUCCESS) {
                    //OpenCVLoader.initDebug();
                    //System.loadLibrary("opencv_java4");
                    cameraBridgeViewBase.enableView();
                } else {
                    super.onManagerConnected(status);
                }
            }
        };
    }


    @Override
    protected void onResume() {
        super.onResume();

        if (!OpenCVLoader.initDebug()) {
            Toast.makeText(this, "There is problem", Toast.LENGTH_SHORT).show();
        } else {
            baseLoaderCallback.onManagerConnected(baseLoaderCallback.SUCCESS);
        }

    }

    @Override
    protected void onPause() {
        super.onPause();
        if (cameraBridgeViewBase != null){
            cameraBridgeViewBase.disableView();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (cameraBridgeViewBase != null){
            cameraBridgeViewBase.disableView();
        }
    }

    @Override
    public void onCameraViewStarted(int width, int height) {

    }

    @Override
    public void onCameraViewStopped() {

    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        Mat frame = inputFrame.rgba();
        if (counter % 2 == 0){
            Core.flip(frame, frame, 1);
            Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2GRAY);
        }
        counter++;

        Toast.makeText(this, "Getting Camera Frame", Toast.LENGTH_SHORT).show();

        return frame;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <org.opencv.android.JavaCamera2View
        android:id="@+id/CameraView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_gravity="start"
        android:visibility="visible">

    </org.opencv.android.JavaCamera2View>

</RelativeLayout>

清单权限

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>

顺便说一句,我遵循了基本练习并正确导入了模块并将其添加为依赖项.此外,我在调用 OpenCVLoader.initDebug(); 时收到一条成功消息,因此 openCV 已正确安装.

btw I have followed the basic drill and imported the module correctly and added it as a dependency. Also, I am getting a success message on calling OpenCVLoader.initDebug(); so openCV is installed correctly.

推荐答案

在 OpenCV 4.1.1 及更高版本中,您需要明确告诉 OpenCV 该应用程序具有相机权限.尝试插入"cameraBridgeViewBase.setCameraPermissionGranted();"前cameraBridgeViewBase.enableView();",假设该应用已经拥有相机权限?

In OpenCV 4.1.1 and later, you need to explicitly tell OpenCV that the app has camera permissions. Try to insert "cameraBridgeViewBase.setCameraPermissionGranted();" before "cameraBridgeViewBase.enableView();" , assuming the app already has camera permissions?

这篇关于OpenCV 4.5.0 空 JavaCameraView 和 JavaCamera2View的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆