日期:2014年10月18日—2014年10月24日
1.本周已完成任务:通过触摸屏幕上显示的图片,在图片上留下标记,类似画图板一样的功能
2.本周未完成任务:简单的区域识别算法设计,整体UI设计
3.下周计划:照相机使用,对焦,保存
4.关键技术点说明:
首先是获得触摸的点在图片中的相对坐标,然后通过控件的OnTouchListener事件获得点击事件,注意这里与onTouch事件不一样的是坐标,onTouch获得的是绝对坐标是相对于屏幕左上角的像素,而OnTouchListener是获得相对于控件左上角的像素,通过控件属性设置将图片显示在左上角从而获取点击的相对坐标。
获得坐标后如果直接在坐标写入一定范围内的颜色,则会出现新的问题——比例不对,由于图片和屏幕不是同等大小,所以图片可能被压缩后显示出来,这个时候可以在图片载入后获取图片的大小和控件的大小来获得缩放比例。
在写入数据的时候需要注意超出图片范围的情况,因为我这里为了方便识别对触摸的点开始右20个像素,下20个像素写入,所以在点击图片右下角的时候会超出范围,这个可以在一开始确定比例的时候就预先减去20来预防。
以下程序还是用以前的改的,所以需要先进行边缘处理之后才能正常使用(偷懒啊)。
package com.example.opencv_test;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
Button btnProcess;
Bitmap srcBitmap;
Bitmap grayBitmap;
ImageView imgHuaishi;
float scale_bmp;
private static boolean flag = true;
private static boolean isFirst = true;
private static final String TAG = "MainActivity";
// OpenCV库加载并初始化成功后的回调函数
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
// TODO Auto-generated method stub
switch (status) {
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, "成功加载");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "加载失败");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnProcess = (Button) findViewById(R.id.btn_gray_process);
imgHuaishi = (ImageView) findViewById(R.id.img_huaishi);
Log.i(TAG, "initUI sucess...");
imgHuaishi.setOnTouchListener(onTouchListener);
btnProcess.setOnClickListener(new ProcessClickListener());
}
private OnTouchListener onTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!flag) {
int x,y;
int j,i;
x = (int) ((int) event.getX()*scale_bmp);
y = (int) ((int) event.getY()*scale_bmp);
Log.i("x,y", String.valueOf(x) + "," + String.valueOf(y));
for (i = x; i < x + 20; i++)
for (j = y; j < y + 20; j++)
grayBitmap.setPixel(i, j, 0xFFFFFF);// 修改像素
imgHuaishi.setImageBitmap(grayBitmap);
}
break;
default:
break;
}
return false;
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void procSrc2Gray() {
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.r);
grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),
srcBitmap.getHeight(), Config.RGB_565);
Utils.bitmapToMat(srcBitmap, rgbMat);// convert original bitmap to Mat,
// R G B.
// Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to
Imgproc.Canny(rgbMat, grayMat, 150, 90);
Utils.matToBitmap(grayMat, grayBitmap); // convert mat to bitmap
scale_bmp = ((float)grayBitmap.getWidth()-20)/imgHuaishi.getWidth();
Log.i("bmpscale",String.valueOf(scale_bmp));
Log.i(TAG, "procSrc2Gray sucess...");
}
private class ProcessClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (isFirst) {
procSrc2Gray();
isFirst = false;
}
if (flag) {
imgHuaishi.setImageBitmap(grayBitmap);
btnProcess.setText("查看原图");
flag = false;
} else {
imgHuaishi.setImageBitmap(srcBitmap);
btnProcess.setText("边缘处理");
flag = true;
}
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
// load OpenCV engine and init OpenCV library
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9,
getApplicationContext(), mLoaderCallback);
Log.i(TAG, "onResume sucess load OpenCV...");
}
}
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.opencv_test.MainActivity"
tools:ignore="MergeRootFrame" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btn_gray_process"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="44dp"
android:text="边缘处理" />
<ImageView
android:id="@+id/img_huaishi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:adjustViewBounds="true"
android:src="@drawable/r" />
</RelativeLayout>
</FrameLayout>