OpenCV Android 实例笔记2--摄像头操作

关于OpenCV在Android Studio 上的环境搭建,请看实例笔记1
最近更新  160806

一、第一种方式打开前置后置摄像头

通过OpenCV Library的方式,不需要编写C、C++代码,只需要引入OpenCV 的Library,一般的路径是OpenCV-3.1.0-android-sdk\OpenCV-android-sdk\sdk\java
(这里以OPENCV V3.1版本为准,采用的是第一种方法,需要安装OPENCVMANAGER)
需要在自己创建的工程时引入该Library,同时需要引入libopencv_java3.so,这是Library依赖的库。

工程中通过静态域的方式引入即可。

static {  
    OpenCVLoader.initDebug();  

}  

代码

package com.wang.opencv;  

import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;  

import org.opencv.core.Core;  
import org.opencv.core.Mat;  
import org.opencv.android.CameraBridgeViewBase;  
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;  
import org.opencv.android.OpenCVLoader;  

import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.view.WindowManager;  

public class OpenCameraActivity extends Activity implements CvCameraViewListener2 {  

    private static final String TAG = "OpenCameraActivity";  

    static {  
        OpenCVLoader.initDebug();  

    }  

    private Mat mRgba;  
    private Mat mFlipRgba;  

    private CameraBridgeViewBase mOpenCvCameraView;  

    public OpenCameraActivity() {  

        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);  
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  

        setContentView(R.layout.camera_surface_view);  

        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.fd_activity_surface_view);  
        mOpenCvCameraView.enableView();//  
        mOpenCvCameraView.setCvCameraViewListener(this);  
        mOpenCvCameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_FRONT);//前置摄像头 CAMERA_ID_BACK为后置摄像头  

    }  

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

    @Override  
    public void onResume() {  
        super.onResume();  
    }  

    public void onDestroy() {  
        super.onDestroy();  
        mOpenCvCameraView.disableView();  
    }  

    public void onCameraViewStarted(int width, int height) {  
        mRgba = new Mat();  
        mFlipRgba = new Mat();  

    }  

    public void onCameraViewStopped() {  
        mRgba.release();  
    }  

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {  
        mRgba = inputFrame.rgba();//注意  
        Core.flip(mRgba, mFlipRgba, 1);  
        return mFlipRgba;  
    }  

    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  

        return true;  
    }  

    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  

        return true;  
    }  

}  

xml配置简单:

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical" >  

    <org.opencv.android.JavaCameraView  
        android:id="@+id/fd_activity_surface_view"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent" />  

</LinearLayout>
AndroidManifest记得添加摄像头权限。
<uses-permission android:name="android.permission.CAMERA"/>  

需要注意的是前置摄像头获取的图像是倒置的,需要通过flip方法翻转一次。

Core.flip(mRgba, mFlipRgba, 1);   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值