日期: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>