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

被折叠的 条评论
为什么被折叠?



