安卓摄像头的简单使用-黄

本文档记录了2014年10月25日至31日期间,作者完成的一个安卓简单摄像头项目。项目使用OpenCV库实现了摄像头图像的捕获和保存,但未实现对焦功能和区域识别算法设计。关键在于从onCameraFrame获取rgba图像,转化为矩阵并存储,通过onTouch事件以jpg格式保存。同时提到了需要的权限和OpenCV库的使用。

日期:2014年10月25日—2014年10月31日

1.本周已完成任务:安卓简单的摄像机

2.本周未完成任务:简单的区域识别算法设计,整体UI设计

3.下周计划:对项目进行规划并且验证可行性

4.关键技术点说明:

这里使用了OpenCV做了一个简单的摄像头,能进行图像的拍摄,暂时没有做对焦功能,其实是对OpenCV例程的简单修改,整个程序比较简单,这里不多做叙述,详细见注释,这里只说明修改的部分。

首先是图像的获取,可以在onCameraFrame函数里面通过inputFrame.rgba()获得rgba格式的图像,然后转换成矩阵存储到一个全局变量里面,就获得了当前一帧摄像头获得的图像。然后在onTouch函数将矩阵以jpg 的格式写入储存中,这里使用的文件名是当前的时间。

需要注意的点是需要添加摄像头和外置储存修改的权限以及需要OpenCV库

 

以下附上程序以及配置文件。


package com.example.house;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.highgui.Highgui;  

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.Toast;

@SuppressLint("ShowToast") public class MainActivity extends Activity implements CvCameraViewListener2 ,OnTouchListener{
    
	private static final String  TAG                 = "OCVSample::Activity";
    private CameraBridgeViewBase mOpenCvCameraView;
    Mat rgbatakePicture;
    Mat rgbaInnerWindow;
    // OpenCV库加载并初始化成功后的回调函数
    private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i(TAG, "OpenCV loaded successfully");
                    mOpenCvCameraView.enableView();
                    mOpenCvCameraView.enableFpsMeter();
                    mOpenCvCameraView.setOnTouchListener(MainActivity.this);
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };

    public MainActivity() {
        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.activity_main);
        
        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.image_manipulations_activity_surface_view);
        mOpenCvCameraView.setCvCameraViewListener(this);
    }

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

    @Override
    public void onResume()
    {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
    }

    public void onDestroy() {
        super.onDestroy();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    //Camera打开函数
    public void onCameraViewStarted(int width, int height) {
    }

	// Camera关闭函数
	public void onCameraViewStopped() {
	}

	// 预览的图片帧到函数
	public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
		Mat rgba = inputFrame.rgba();
		Size sizeRgba = rgba.size();

		int rows = (int) sizeRgba.height;
		int cols = (int) sizeRgba.width;
		rgbaInnerWindow = rgba.submat(0, rows, 0, cols);
		rgbatakePicture = rgbaInnerWindow;
		return rgba;
	}
    
    
	@SuppressLint("SimpleDateFormat")
	public boolean onTouch(View v, MotionEvent event) {
		Log.i(TAG, "onTouch event");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
		String currentDateandTime = sdf.format(new Date());
		String fileName = Environment.getExternalStorageDirectory().getPath()
				+ "/sample_picture_" + currentDateandTime + ".jpg";

		boolean flag = Highgui.imwrite(fileName, rgbatakePicture);
		if (flag)
			Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT)
					.show();
		else
			Toast.makeText(this, "图片写入失败!", 0).show();

		return false;
	}
}


<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" >

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


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.house"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
        <activity
            android:name="com.example.house.MainActivity"
            android:screenOrientation="landscape"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <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"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
</manifest>


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值