OpenCV 调用 Android智能手机摄像头

ゞ 浴缸里的玫瑰 2022-03-12 10:10 625阅读 0赞

目录

环境配置

示例效果

关键代码

源代码文件

JavaCameraView

CvCameraViewListener2


环境配置

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

https://blog.csdn.net/qq_24118527/article/details/87923390


示例效果

20190305184107788.gif

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

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


关键代码

RealtimeActivity.java

  1. package cn.edu.zju.myopencv;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.MenuItem;
  6. import android.view.Surface;
  7. import android.view.SurfaceView;
  8. import android.view.WindowManager;
  9. import org.opencv.android.BaseLoaderCallback;
  10. import org.opencv.android.CameraBridgeViewBase;
  11. import org.opencv.android.LoaderCallbackInterface;
  12. import org.opencv.android.OpenCVLoader;
  13. import org.opencv.core.Mat;
  14. import org.opencv.imgproc.Imgproc;
  15. public class RealtimeActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
  16. private CameraBridgeViewBase mOpenCvCameraView;
  17. private static final String TAG = "nikolajohn";
  18. private boolean mIsJavaCamera = true;
  19. private MenuItem mItemSwitchCamera = null;
  20. private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
  21. @Override
  22. public void onManagerConnected(int status) {
  23. switch (status){
  24. case LoaderCallbackInterface.SUCCESS:
  25. {
  26. Log.i(TAG,"OpenCV loaded successfully");
  27. mOpenCvCameraView.enableView();
  28. }break;
  29. default:
  30. {
  31. super.onManagerConnected(status);
  32. }break;
  33. }
  34. }
  35. };
  36. public RealtimeActivity() {
  37. // Instantiate
  38. Log.i(TAG, "Instantiated new " + this.getClass());
  39. }
  40. @Override
  41. protected void onCreate(Bundle savedInstanceState) {
  42. Log.i(TAG,"Called on Create");
  43. super.onCreate(savedInstanceState);
  44. // 屏幕常亮
  45. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  46. setContentView(R.layout.activity_realtime);
  47. mOpenCvCameraView = findViewById(R.id.tutorial1_activity_java_surface_view);
  48. mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
  49. mOpenCvCameraView.setCvCameraViewListener(this);
  50. }
  51. @Override
  52. public void onPause()
  53. {
  54. super.onPause();
  55. if (mOpenCvCameraView != null)
  56. mOpenCvCameraView.disableView();
  57. }
  58. @Override
  59. public void onResume()
  60. {
  61. super.onResume();
  62. if(!OpenCVLoader.initDebug()){
  63. Log.d(TAG,"Internal OpenCV library not found , Using OpenCV Manager for initialization");
  64. OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0,this,mLoaderCallback);
  65. }else{
  66. Log.d(TAG,"OpenCV library found inside package , Using it");
  67. mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
  68. }
  69. }
  70. public void onDestroy() {
  71. super.onDestroy();
  72. if (mOpenCvCameraView != null)
  73. mOpenCvCameraView.disableView();
  74. }
  75. @Override
  76. public void onCameraViewStarted(int width, int height) {
  77. }
  78. @Override
  79. public void onCameraViewStopped() {
  80. }
  81. @Override
  82. public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
  83. Mat src = inputFrame.rgba();
  84. Mat temp = new Mat();
  85. Mat dst = new Mat();
  86. Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGBA2BGR);
  87. Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2HLS);
  88. return src;
  89. }
  90. }

activity_realtime.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:opencv="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".RealtimeActivity">
  8. <org.opencv.android.JavaCameraView
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. android:visibility="visible"
  12. android:id="@+id/tutorial1_activity_java_surface_view"
  13. opencv:show_fps="true"
  14. opencv:camera_id="any" />
  15. </FrameLayout>

源代码文件

链接: https://pan.baidu.com/s/1uFvg\_KvB7IIBaqgSANuAtg

提取码: qeh8


JavaCameraView

先看一下类的派生关系

20190305185135892.png

显然,其父类是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

用法如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MTE4NTI3_size_16_color_FFFFFF_t_70


参考

可以看一下这些文章:

https://jayrambhia.com/blog/beginning-android-opencv

https://docs.opencv.org/3.0-beta/platforms/android/service/doc/BaseLoaderCallback.html

发表评论

表情:
评论列表 (有 0 条评论,625人围观)

还没有评论,来说两句吧...

相关阅读