第四周-huang

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值