OpenCV 调用 Android智能手机摄像头

编程入门 行业动态 更新时间:2024-10-27 09:32:59

OpenCV 调用 Android<a href=https://www.elefans.com/category/jswz/34/1764815.html style=智能手机摄像头"/>

OpenCV 调用 Android智能手机摄像头

目录

环境配置

示例效果

关键代码

源代码文件

JavaCameraView

CvCameraViewListener2


环境配置

Android Studio 配置OpenCV,参考下面的链接:


示例效果

注意:本例程没有使用自定义View的方式实现

使用自定义View方式实现的例程有空了更新


关键代码

RealtimeActivity.java

package cn.edu.zju.myopencv;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.Surface;
import android.view.SurfaceView;
import android.view.WindowManager;import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;public class RealtimeActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {private CameraBridgeViewBase mOpenCvCameraView;private static final String TAG = "nikolajohn";private boolean mIsJavaCamera = true;private MenuItem mItemSwitchCamera = null;private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {switch (status){case LoaderCallbackInterface.SUCCESS:{Log.i(TAG,"OpenCV loaded successfully");mOpenCvCameraView.enableView();}break;default:{super.onManagerConnected(status);}break;}}};public RealtimeActivity() {// InstantiateLog.i(TAG, "Instantiated new " + this.getClass());}@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.i(TAG,"Called on Create");super.onCreate(savedInstanceState);// 屏幕常亮getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setContentView(R.layout.activity_realtime);mOpenCvCameraView = findViewById(R.id.tutorial1_activity_java_surface_view);mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);mOpenCvCameraView.setCvCameraViewListener(this);}@Overridepublic void onPause(){super.onPause();if (mOpenCvCameraView != null)mOpenCvCameraView.disableView();}@Overridepublic void onResume(){super.onResume();if(!OpenCVLoader.initDebug()){Log.d(TAG,"Internal OpenCV library not found , Using OpenCV Manager for initialization");OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0,this,mLoaderCallback);}else{Log.d(TAG,"OpenCV library found inside package , Using it");mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);}}public void onDestroy() {super.onDestroy();if (mOpenCvCameraView != null)mOpenCvCameraView.disableView();}@Overridepublic void onCameraViewStarted(int width, int height) {}@Overridepublic void onCameraViewStopped() {}@Overridepublic Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {Mat src = inputFrame.rgba();Mat temp = new Mat();Mat dst = new Mat();Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGBA2BGR);Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2HLS);return src;}
}

activity_realtime.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android=""xmlns:opencv=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".RealtimeActivity"><org.opencv.android.JavaCameraViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:visibility="visible"android:id="@+id/tutorial1_activity_java_surface_view"opencv:show_fps="true"opencv:camera_id="any" /></FrameLayout>

源代码文件

链接:

提取码: qeh8


JavaCameraView

先看一下类的派生关系

显然,其父类是CameraBridgeViewBase

JavaCameraView类是View的子类,可以认为是用于OpenCV和Java Camera之间衔接的一种Bridge View

这个类继承了基类中可用的功能,并实现一些必要的方法:

  • connectCamera 

打开java camera 并设置需要被传递的变量PreviewCallback

  • disconnectCamera 

关闭摄像头并停止预览

当一帧一帧的图像数据通过callback从摄像头传递过来时,图像数据将会通过OpenCV转换为RGBA32格式


CvCameraViewListener2

这个是Activity需要实现的接口类

implement这个接口类后,我们需要实现以下几个方法:

  • onCameraFrame

当图像的数据需要被传递时调用此方法,返回值是被修改过的帧数据

  • onCameraViewStarted

当摄像头的预览开启时,此方法被调用。当这个方法被调用后,图像数据才能通过onCameraFrame函数返回给屏幕

  • onCameraViewStopped

当摄像头的预览由于某些原因而被终止时该方法将会被调用,当该方法被调用后,图像无法再通过onCameraFrame显示到屏幕


BaseLoaderCallback

用法如下图:


参考

可以看一下这些文章:

.0-beta/platforms/android/service/doc/BaseLoaderCallback.html

更多推荐

OpenCV 调用 Android智能手机摄像头

本文发布于:2024-03-06 11:33:11,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1715218.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:智能手机   摄像头   OpenCV   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!