OpenCVforAndroid应用之银行卡号识别 ------ 实战篇

上文中讲述了两种在android平台中使用opencv的办法,这里我将使用的是opencvforandroid的方法,也就是直接使用opencv提供的Java的API,这种方法对开发者来说是比较简单省事的。由于算法原理在《银行卡号识别》中已经阐述过,这里不再详细介绍,直接上关键代码!

activity_main.xml

<RelativeLayout 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"
    android:background="@drawable/backgroud"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.test.MainActivity" >
              <!-- 
         android:background="@drawable/bank" 
           --> 
           
                <ImageView
         android:id="@+id/img_huaishi"
         android:layout_width="250dp"
         android:layout_height="160dp"
         android:layout_alignParentTop="true"
         android:layout_marginTop="208dp" 
         android:layout_marginLeft="41dp" 
         />
             
     <Button   
         android:id = "@+id/btn_gray_process"   
         android:layout_width = "70dp"   
         android:layout_height = "70dp"   
         android:background="@drawable/xiangji"
         android:layout_below = "@id/img_huaishi"   
     	 android:layout_marginLeft="45dp"
     	 android:layout_marginTop="47dp"
           />
     
          <Button   
         android:id = "@+id/btn_pic"   
         android:layout_width = "70dp"   
         android:layout_height = "70dp"   
         android:background="@drawable/pic"
         android:layout_below = "@id/img_huaishi"   
     	 android:layout_marginLeft="197dp"
     	 android:layout_marginTop="47dp"
           /> 

   <!--   <ImageView
         android:id="@+id/title"
         android:layout_width="220dp"
         android:layout_height="wrap_content"
         android:layout_alignParentRight="false"
         android:layout_alignParentTop="true"
         android:background="@drawable/title" /> -->


     <TextView
         android:id="@+id/mttext"
         android:layout_width="wrap_content"
         android:layout_height="40dp"
         android:layout_below="@+id/btn_pic"
         android:layout_marginTop="27dp"
         android:text="*******************"
         android:textColor="@android:color/black" 
         android:textSize="45px"
         android:layout_marginLeft="50dp"
          android:textStyle="bold"  
          />


</RelativeLayout>

效果预览图(图片效果请自行下载图片添加):
                                                    

MainActivity.java

package com.example.test;

import java.io.File;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import org.opencv.ml.CvKNearest;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


@SuppressLint("NewApi") public   class  MainActivity  extends  Activity {  
	
	//手机相册or手机相机相关参数
	private static int RESULT_LOAD_IMAGE = 1;
	
	int hehe = 0;
	
	int jisuan = 0;
	int error = 0;
	Button btnPic;  
    Button btnProcess;  
    Bitmap srcBitmap;  
    Bitmap grayBitmap;  
    Bitmap tempBitmap;  
    ImageView imgHuaishi;  
     private   static   boolean  flag =  false ;   
     private   static   boolean  isFirst =  true ;   
     private   static   final  String TAG =  "MyLogcat" ;  
     
     int numX1 = 0, numX2 = 0;
     int aa[], bb[];
     int bankX[];//19个银行卡号的位置信息----x
     int bankNum[];//19个银行卡号
     int classes = 10, train_samples = 1, K = 1;
     int new_width = 32;
     int new_height = 32;
     CvKNearest knn;
     Mat trainData, trainClasses;
     
     //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);  
        initUI();  
        //procSrc2Gray();
        pretreatment();//测试用
        btnProcess.setOnClickListener( new  ProcessClickListener());  
        btnPic.setOnClickListener( new  ProcessPicClickListener());  
    }  
  
  
     @Override   
     public   boolean  onCreateOptionsMenu(Menu menu) {  
           
        getMenuInflater().inflate(R.menu.main, menu);  
         return   true ;  
    }  
  
     public   void  initUI(){  
        btnProcess = (Button)findViewById(R.id.btn_gray_process);
        btnPic = (Button)findViewById(R.id.btn_pic); 
        imgHuaishi = (ImageView)findViewById(R.id.img_huaishi);  
        Log.i(TAG,  "initUI sucess..." ); 
        aa = new int[18];
        bb = new int[18];
        for(int i = 0; i < 18; ++i)
        {
        	aa[i] = 0;
        	bb[i] = 0;
        }
        bankX = new int[18];
        bankNum = new int[18];
		tempBitmap = getRes("shuai");
		this.imgHuaishi.setImageBitmap(tempBitmap); 
     }  
     
     public Bitmap getRes(String name) {//获得res文件夹下的图片,得到bmp图片
    	 ApplicationInfo appInfo = getApplicationInfo();
    	 int resID = getResources().getIdentifier(name, "drawable", appInfo.packageName);
    	 return BitmapFactory.decodeResource(getResources(), resID);
    	 }
     
     void getData()
     {//训练集的生成与保存
    	 Mat src_image = new Mat();
    	 Mat prs_image = new Mat(new Size(new_width, new_height),CvType.CV_8UC1);
    	 //Mat prs_image = new Mat();
    	 Mat row = new Mat(),data = new Mat(),rowb = new Mat(),datab = new Mat();
    	 int x,y;
  	   	 int c = 0;
  	     int cc = 0;
  	   	 int i,j,k = 0;
  		 int m = 0,n = 0;
    	 for (m = 0; m < classes; m++)
    	 {
    		 for (n = 0; n < train_samples; n++)
    		 {
    			 String name = "a" + String.valueOf(m) + String.valueOf(n);
    			 Bitmap bmp = getRes(name);
    			 if (bmp == null)
    			 {
    				 System.out.println("NULL Image");
    			 }
    			 Utils.bitmapToMat(bmp, src_image);
  		 		 /*src_image = Highgui.imread("/assets/a00.bmp");
  		 		 if (src_image == null)
    			 {
    				 System.out.println("NULL Image");
    			 }*/
  		 		 //System.out.println(String.valueOf(src_image.width()));
    			 //System.out.println(String.valueOf(src_image.channels()));
    			 Mat grayMat =  new  Mat();  //灰度图
    		     Mat binaryMat = new Mat(); //二值化图
    		     Mat mytemp = new Mat(new Size(new_width, new_height),CvType.CV_8U);
    		     Imgproc.cvtColor(src_image, grayMat, Imgproc.COLOR_RGBA2GRAY); //rgbMat to gray grayMat
   		         Imgproc.threshold(grayMat, binaryMat, 100, 255, Imgproc.THRESH_BINARY);//二值化
   		         //binaryMat = changeMat(binaryMat);
   		         binaryMat.copyTo(prs_image);
 		         Imgproc.resize(prs_image, mytemp, new Size(new_width, new_height));
   		         float imgData[] = new float[1];
   		         imgData[0] = (float)m;
   		         trainClasses.put(m * train_samples + n, 0, imgData);//trainClasses存入数据,注意trainClasses是32位浮点数
   		         Mat img = new Mat(new Size(mytemp.width(), mytemp.height()),CvType.CV_32FC1);
   		         mytemp.convertTo(img, CvType.CV_32FC1, 0.0039215);
   		         //prs_image.copyTo(img);
   		         img = img.reshape(0, 1);
 		         //Mat2IntArr(img);
   		         float tempData[] = new float[img.cols()];
   		         img.get(0, 0, tempData);
   		         //Mat2IntArr(binaryMat);
   		         trainData.put(m*train_samples + n, 0, tempData);
   		         //grayBitmap = Bitmap.createBitmap(prs_image.width(), prs_image.height(), Config.RGB_565);  
   	             //grayBitmap.setPixels(result, 0, w, 0, 0, w, h);
   		         //Utils.matToBitmap(prs_image, grayBitmap);  //convert mat to bitmap 
    		 }
    	 }
    	 //Mat2IntArr(trainData);
     }
     
     
     float do_ocr(Mat mat)
     {
    	 Mat pimage = new Mat();
    	 Mat data = new Mat();
    	 Imgproc.resize(mat, pimage, new Size(new_width, new_height));
    	 Mat image = new Mat(new Size(pimage.width(), pimage.height()),CvType.CV_32FC1);
    	 pimage.convertTo(image, CvType.CV_32FC1, 0.0039215);
    	 //Mat2IntArr(image);
    	 data = image.reshape(0, 1);
    	 Mat nearest = new Mat(new Size(K, 1), CvType.CV_32FC1);
    	 Mat results = new Mat();
    	 Mat dists = new Mat();
    	 //Mat2IntArr(data);
    	 float res = knn.find_nearest(data, K, results, nearest, dists);
    	 return res;
     }
     
     
     void sortBankNum()//对银行卡进行排序
     {
     	int i,j,temp; 
     	for(j=0;j<=17;j++) 
     	{
     		for (i=0;i<17-j;i++) 
     			if (bankX[i]>bankX[i+1]) 
     			{ 
     				temp=bankX[i]; 
     				bankX[i]=bankX[i+1]; 
     				bankX[i+1]=temp;
     				temp=bankNum[i]; 
     				bankNum[i]=bankNum[i+1]; 
     				bankNum[i+1]=temp;
     			}
     	} 
     	/*bankNum[0] = 6;
     	bankNum[1] = 2;
     	bankNum[2] = 2;
     	bankNum[3] = 8;
     	bankNum[4] = 4;
     	bankNum[5] = 8;*/
     }
     
     
     Mat  Filter(Mat imgSrc, Mat src, int t2)
     {//过滤图像
     	int a = 0, b = 0;//保存有效行号
     	int h = 0;
     	int state = 0;//标志位,0则表示还未到有效行,1则表示到了有效行,2表示搜寻完毕
     	for (int y = 0; y < imgSrc.height(); y++)
     	{
     		int count = 0;
     		for (int x = 0; x < imgSrc.width(); x++)
     		{
     			//System.out.println("ok");
     			byte[] data = new byte[1];
     			imgSrc.get(y, x, data);
     			//System.out.println("ok2");
     			if (data[0] == 0)
     				count = count + 1;
     		}
     		if (state == 0)//还未到有效行
     		{
     			if (count >= 10)//找到了有效行
     				{//有效行允许十个像素点的噪声
     					a = y;
     					state = 1;
     				}
     		}
     		else if (state == 1)
     		{
     			if (count <= 10)//找到了有效行
     				{//有效行允许十个像素点的噪声
     					b = y;
     					state = 2;
     				}
     		}
     	}
     	numX1 = a;
     	numX2 = b;
     	System.out.println(Integer.toString(a));
     	System.out.println(Integer.toString(b));
     	
     	if (b - a > 10)
     	{   	
     			Rect roi = new Rect(0, a, src.width(), b - a);   
     			//Mat res = cvCreateImage(cvSize(roi.width, roi.height), 8, 1);  
     			Mat res = new Mat(new Size(roi.width, roi.height),CvType.CV_8UC1);
     			//IplImage *orig = cvCreateImage(cvSize(roi.width, roi.height), 8, 1);
     			Mat orig = new Mat(new Size(roi.width, roi.height),CvType.CV_8UC1);
     			//cvSetImageROI(src, roi);   
     			byte[] data = new byte[roi.width * roi.height];
     			src.get(a, 0, data);
     			orig.put(0, 0, data);
     			Imgproc.threshold(orig, res, t2, 255, Imgproc.THRESH_BINARY);//二值化 55
     	        /*Size size = new Size(3, 3);
     	        Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, size);
     	        Imgproc.erode(res, res, element);//腐蚀图像	
     			*/
     			int newW = (int)(res.width()/3);
     			int newW2 = (int)(2 * res.width()/3);
     			Mat temp = new Mat(new Size(newW2, res.height()),CvType.CV_8UC1);
     			byte[] Tempdata = new byte[newW2];
     			for (int i = 0; i < res.height(); ++i)
     			{
     				res.get(i, newW, Tempdata);
     				temp.put(i, 0, Tempdata);
     			}
     			System.out.println("矩阵赋值成功了!");
     			System.out.println(String.valueOf(temp.cols())+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +String.valueOf(temp.rows()));
     			tempBitmap = Bitmap.createBitmap(temp.cols(), temp.rows(), Config.RGB_565);
     			Utils.matToBitmap(temp, tempBitmap);
     			//this.imgHuaishi.setImageBitmap(tempBitmap);  
     		//return res;
     			return temp;
     	}
     	else
     		return null;
     }
  
     
    void coutIntArr(int[] temp, int[] temp2)
    {
    	for (int i = 0; i < temp.length; ++i)
    	{
    		  System.out.println(String.valueOf(temp[i])+ "+" + String.valueOf(temp2[i]));
    	}
    }
    
    public Mat cutMat(Mat imgSrc)
    {
     	int a = 0, b = 0;//保存有效行号
     	int h = 0;
     	int state = 0;//标志位,0则表示还未到有效行,1则表示到了有效行,2表示搜寻完毕
     	for (int y = 0; y < imgSrc.height(); y++)
     	{
     		int count = 0;
     		for (int x = 0; x < imgSrc.width(); x++)
     		{
     			//System.out.println("ok");
     			byte[] data = new byte[1];
     			imgSrc.get(y, x, data);
     			//System.out.println("ok2");
     			if (data[0] == 0)
     				count = count + 1;
     		}
     		if (state == 0)//还未到有效行
     		{
     			if (count >= 10)//找到了有效行
     				{//有效行允许十个像素点的噪声
     					a = y;
     					state = 1;
     				}
     		}
     		else if (state == 1)
     		{
     			if (count <= 3)//找到了有效行
     				{//有效行允许十个像素点的噪声
     					b = y;
     					state = 2;
     					break;
     				}
     		}
     	}
     	Log.i("MyLogcat",  "开始截取图片"+String.valueOf(imgSrc.width())+"+"+ String.valueOf(b - a));  
     	Rect roi = new Rect(0, a, imgSrc.width(), b - a); 
     	Mat res = new Mat(new Size(roi.width, roi.height),CvType.CV_8UC1);
     	res = imgSrc.submat(roi);
     	Log.i("MyLogcat",  "截取成功");  
     	if (hehe == 5)
     	{
			//tempBitmap = Bitmap.createBitmap(res.cols(), res.rows(), Config.RGB_565);
 			//Utils.matToBitmap(res, tempBitmap);
 			//this.imgHuaishi.setImageBitmap(tempBitmap);  
     	}
    	return res;
    }
     
   
     
     public   int  procSrc2Gray(int t, int t2){  
        Mat rgbMat =  new  Mat(); //原图 
        Mat grayMat =  new  Mat();  //灰度图
        Mat binaryMat = new Mat(); //二值化图
        Mat erode = new Mat();
        Mat last = new Mat();

        //srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a2);  
        //srcBitmap = getRes("a00");
        
        //grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Config.RGB_565);  
        Utils.bitmapToMat(srcBitmap, rgbMat); //convert original bitmap to Mat, R G B. 
        Bitmap bitP = srcBitmap;
        Imgproc.resize(rgbMat, rgbMat, new Size(589, 374));
        Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY); //rgbMat to gray grayMat
        //Mat2IntArr(grayMat);
        //继续预处理
        Imgproc.threshold(grayMat, binaryMat, t, 255, Imgproc.THRESH_BINARY);//二值化

         //Mat2IntArr(binaryMat);
        Imgproc.medianBlur(binaryMat, binaryMat, 3);
        Size size = new Size(3, 3);
        Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, size);
        Imgproc.erode(binaryMat, erode, element);//腐蚀图像      
        //System.out.println(Integer.toString(erode.channels()));
        Log.i("MyLogcat",  "进入Filter" );  
        last = Filter(erode,grayMat, t2);
        Log.i("MyLogcat",  "完成Filter" );  
 	
	       //Mat2IntArr(res); 
        boolean a1;
        if (last != null)
        {
	        Log.i("MyLogcat",  "进入findRect" );  
	        a1 = findRect(last);
        }
        else
        {
        	a1 = false;
        }
        if(a1)
        {
            Log.i("MyLogcat",  "完成findRect1111" ); 
	        //System.out.println(String.valueOf(aa.length)+" "+String.valueOf(bb.length));
	        /*for (int a = 0; a < 19; a++)
	        {
	        	System.out.println(String.valueOf(aa[a])+" "+String.valueOf(bb[a]));
	        }*/
	        
	        //Imgproc.medianBlur(last, last, 3);
	       
	        //************将mat转换成int[],送给c++进行处理*************
	        /*int h = last.height();
	        int w = last.width();
	        int temp[] = new int[h*w];
	        int result[] = new int[h*w];
	        temp = Mat2IntArr(last);
	        result = LibImgFun.ImgFun(temp, w, h);
	        System.out.println(String.valueOf(result[0]));
			*/
	        /*String path = "bank";
	        Bitmap bmp = getRes(path);
	        if (bmp == null)
	        {
	        	System.out.println("NULL Image");
	        }
	        System.out.println(String.valueOf(bmp.getHeight()) + " " + String.valueOf(srcBitmap.getHeight()));
	        imgHuaishi.setImageBitmap(bmp);*/
	       
	        trainData = new Mat(new Size(new_width * new_height, classes * train_samples),CvType.CV_32FC1);
	        trainClasses = new Mat(new Size(1, classes * train_samples),CvType.CV_32FC1);
	       
	       getData();//得到训练数据
	       knn = new CvKNearest();
	       Mat sampleIdx = new Mat();
	       //boolean a = knn.train(trainData, trainClasses, sampleIdx, false, K, false);
	       boolean a = knn.train(trainData, trainClasses);
	       
	       //float ret = do_ocr(binaryMat);
	       //System.out.println(String.valueOf(ret));
	       
	       //分割得到数字
	       Mat orig = new Mat();
	       last.copyTo(orig);
	       Mat bininv_img = new Mat();
	       int c = 0;
	       hehe = 0;
	       error = 0;
	       for (int i = 0; i < 18; i++)
	       {	
	    	   c++;
	    	   hehe++;
	    		if (bb[i] - aa[i] < 5)
	     		{
	    			Log.i("MyLogcat",  "忽略" ); 
	    			bankX[i] = 0;
	    			bankNum[i] = 0;
	    			error++;
	     			continue;
	     		}
	    	   Rect roi = new Rect(aa[i], 0, bb[i] - aa[i], numX2 - numX1);
	    	   bankX[i] = aa[i];//保存位置信息
	    	   Mat res = new Mat();
	    	   res = orig.submat(roi);
	    	   if(c == 7)
	    	   {
	    		   //grayBitmap = Bitmap.createBitmap(res.width(), res.height(), Config.RGB_565);  
	    	       //Utils.matToBitmap(res, grayBitmap);  //convert mat to bitmap 
	    	       //Mat2IntArr(res); 
	    	   }
	    	   
	    	   float ret = do_ocr(res); 
	    	   bankNum[i] = (int)ret;
	       }
	        Log.i("MyLogcat",  "本次识别失败数是:"+String.valueOf(error));  
	        Log.i("MyLogcat",  "进入sortBankNum" );  
	   		coutIntArr(bankNum, bankX);
	   		
	   		sortBankNum();
	   		coutIntArr(bankNum, bankX);
	   		Log.i("MyLogcat",  "完成sortBankNum" );  
	
	   		String x = new String();
	   		x = "622848";
	   		int finish = 0;
	   		for (int i = 0; i < 18; ++i)
	   		{
	   			if(i + error > 17)
	   			{
	   				break;
	   			}
	   			if(bankX[i + error] != 0)
	   			{
	   				x = x + String.valueOf(bankNum[i + error]);
	   				Log.i("MyLogcat",  String.valueOf(bankNum[i + error]) + "+" +  String.valueOf(i + error) );  
	   				finish++;
	   				if(finish >= 13)
	   				{
	   					break;
	   				}
	   			}
	   		}
	   	
	   	        this.imgHuaishi.setImageBitmap(bitP);
		   		Log.i("MyLogcat",  "准备放置结果了!" );  
		   		Toast.makeText(MainActivity.this, "卡号已经复制到剪切板!!!", 3).show();  
		   		TextView text = (TextView)findViewById(R.id.mttext);
		   		//x = "6228481099312404479";
		   		text.setText(x);
		   		ClipboardManager myClipboard;
		   		myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
		   		ClipData myClip;
		   		myClip = ClipData.newPlainText("text", x);
		   		myClipboard.setPrimaryClip(myClip);
	   		
	      /* grayBitmap = Bitmap.createBitmap(last.width(), last.height(), Config.RGB_565);  
	       //grayBitmap.setPixels(result, 0, w, 0, 0, w, h);
	       Utils.matToBitmap(last, grayBitmap);  //convert mat to bitmap*/ 
	       Log.i("MyLogcat",  "procSrc2Gray sucess..." );  
	       return error;
        }
        else
        {
    		TextView text = (TextView)findViewById(R.id.mttext);
	   		text.setText("*******************");
        tempBitmap = getRes("shuai");
    	this.imgHuaishi.setImageBitmap(tempBitmap); 
         Log.i("MyLogcat",  "完成findRect2222" ); 
         System.out.println("?????????????????????????????????");
   		 Toast.makeText(MainActivity.this, "本次识别失败,请在光线较亮的地方再次尝试!!", 3).show();  
   		 srcBitmap.recycle();   //回收图片所占的内存
   		 return 1;
        }
     }  
     
     
     boolean findRect(Mat srcA)
     {//将银行数字分割,黑点为前景点,白点为背景点。
     	int count = 0;
     	int judgeA = 0;//0代表当前要判断有效列,1代表当前要判断无效列
     	int i = 0;
     	Mat src = new Mat();
     	if (srcA == null)
     	{
     		return false;
     	}
     	Imgproc.medianBlur(srcA, src, 3);
     	//srcA.copyTo(src);
     	//cvSmooth(srcA, src, CV_MEDIAN);
     	for (int x = 0; x < src.width(); x++)
     	{
     		count  = 0;
     		for (int y = 0; y < src.height(); y++)
     		{
     			byte[] data = new byte[1];
     			src.get(y, x, data);
     			if (data[0] == 0)//遇到前景点就加1
     			{
     				count ++;
     			}
     		}
     		if (judgeA == 0)
     		{
     			if (count >= 5)//有效行到了
     			{
     				judgeA = 1;
     				if (i > 17)
     				{
     					i = 17;
     				}
     				aa[i] = x;
     			}
     		}
     		else if(judgeA == 1)
     		{
     			if (count < 5)
     			{
     				judgeA = 0;
     				if (i > 17)
     				{
     					i = 17;
     				}
     				bb[i] = x;
     				i++;
     			}
     		}
     	}
     	//coutIntArr(bb, aa);
     	/*
     	for (int ii = 0; ii < 19; ++ii)
     	{
     		if (bb[ii] - aa[ii] < 5)
     		{
     			return false;
     		}
     	}*/
     	return true;
     	
     	/*for (int m = 0; m < i; m++)
     	{
     	
     		cvLine(src, cvPoint(aa[m], 0), cvPoint(aa[m], src->height), cvScalar(0, 0, 0));
     		cvLine(src, cvPoint(bb[m], 0), cvPoint(bb[m], src->height), cvScalar(0, 0, 0));
     	}*/
     	
         /*cvNamedWindow("img");
     	cvShowImage("img", src);
     	cvWaitKey(0);
     		*/	 
     }
     
     
     public float[] Mat2IntArr(Mat mat)
     {
		 int h = mat.height();
		 int w = mat.width();
		 float result[] = new float[h*w];
		 for (int i = 0; i < h; ++i)
		 {
			 for (int j = 0; j < w; ++j)
			 {
				 float[] data = new float[1];
	     			mat.get(i, j, data);
	     			if( data[0] == 0)
	     				result[w * i + j] = 0;
	     			else
	     				result[w * i + j] = 255;
	     		    System.out.println("("+String.valueOf(i)+","+String.valueOf(j)+")"+String.valueOf((float)data[0]));
			 }
		 }
		 System.out.println(String.valueOf(h)+","+String.valueOf(w));
    	 return result;
     }
     
     public Mat changeMat(Mat mat)
     {
    	 int h = mat.height();
		 int w = mat.width();
		 //int result[] = new int[h*w];
		 for (int i = 0; i < h; ++i)
		 {
			 for (int j = 0; j < w; ++j)
			 {
					byte[] data = new byte[1];
	     			mat.get(i, j, data);
	     			if( data[0] != 0)
	     			{
	     				data[0] = (byte)255;
	     				mat.put(i, j, data);
	     			}
			 }
		 }
		 return mat;
     }
     
     
     
     public void pretreatment()
     {//读入原始图片
    	 	/*Mat src = Highgui.imread("bank.jpg");
    	 	if (src == null)
    	 	{
    	 		 Log.i(TAG,  "LOAD FAILED ..." ); 
    	 		 return;
    	 	}*/
    	 Bitmap bm1=BitmapFactory.decodeFile("/drawable-hdpi/bank.jpg");  
    	 if (bm1 == null)
 	 	{
    		 //Toast.makeText(MainActivity.this, "===========图片读取失败!============!!", 3).show();  
 	 		 return;
 	 	}
    	 imgHuaishi.setImageBitmap(bm1); 
    	 	
     }
  
     
     
     
     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 ;  
            }  */
        	/* Intent i = new Intent(
                     Intent.ACTION_PICK,
                     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
             startActivityForResult(i, RESULT_LOAD_IMAGE);*/
        	 camera();
        }  
    }  
     
     private   class  ProcessPicClickListener  implements  OnClickListener{  
         
         @Override   
         public   void  onClick(View v) {  
             // TODO Auto-generated method stub   
          
        	 Intent intent = new Intent(
                     Intent.ACTION_PICK,
                     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
             startActivityForResult(intent, RESULT_LOAD_IMAGE);
        }  
    }  
     
    /* @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
    	 System.out.println("图片选择成功");
         if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
             Uri selectedImage = data.getData();
             String[] filePathColumn = { MediaStore.Images.Media.DATA };
   
             Cursor cursor = getContentResolver().query(selectedImage,
                     filePathColumn, null, null, null);
             cursor.moveToFirst();
   
             int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
             String picturePath = cursor.getString(columnIndex);
             cursor.close();
             System.out.println("是不是这里的问题?");
             imgHuaishi.setImageBitmap(BitmapFactory.decodeFile(picturePath));
             srcBitmap = BitmapFactory.decodeFile(picturePath);
        	 System.out.println("进入主函数");
        	 System.out.println(String.valueOf(srcBitmap.getWidth()) + " and " + String.valueOf(srcBitmap.getHeight()));
             procSrc2Gray();
             new Thread(new Runnable() {
				@Override
				public void run() {
					// TODO Auto-generated method stub
					MainActivity.this.runOnUiThread(new Runnable() {
						
						@Override
						public void run() {
							// TODO Auto-generated method stub
							//procSrc2Gray();
							 System.out.println("线程进来了");
						}
					});
				}
			}).start();
         }
   
     }*/
     
     
     /*
      * 从相机获取
      */
     
     private static final int PHOTO_REQUEST_CAREMA = 1;
     private static final int PHOTO_REQUEST_GALLERY = 2;
     private static final int PHOTO_REQUEST_CUT = 3;
     private static final String PHOTO_FILE_NAME = "temp_photo.jpg";
     private File tempFile;
     /**
     * 判断手机是否有SD卡。
     * 
     * @return 有SD卡返回true,没有返回false。
     */
     public static boolean hasSDCard() {
     return Environment.MEDIA_MOUNTED.equals(Environment
     .getExternalStorageState());
     }
     public void camera() {
         // 激活相机
         Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
         // 判断存储卡是否可以用,可用进行存储
         if (hasSDCard()) {
             tempFile = new File(Environment.getExternalStorageDirectory(),
                     PHOTO_FILE_NAME);
             // 从文件中创建uri
             Uri uri = Uri.fromFile(tempFile);
             intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
         }
         // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
         startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
     }
     
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    	 if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
             Uri selectedImage = data.getData();
             String[] filePathColumn = { MediaStore.Images.Media.DATA };
   
             Cursor cursor = getContentResolver().query(selectedImage,
                     filePathColumn, null, null, null);
             cursor.moveToFirst();
   
             int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
             String picturePath = cursor.getString(columnIndex);
             cursor.close();
             System.out.println("是不是这里的问题?");
             imgHuaishi.setImageBitmap(BitmapFactory.decodeFile(picturePath));
             srcBitmap = BitmapFactory.decodeFile(picturePath);
        	 System.out.println("进入主函数");
        	 System.out.println(String.valueOf(srcBitmap.getWidth()) + " and " + String.valueOf(srcBitmap.getHeight()));
             procSrc2Gray(28, 30);
    	 }
    	 
    	 
    	 
    	 
    	 else if (requestCode == PHOTO_REQUEST_GALLERY) {
             // 从相册返回的数据
             if (data != null) {
                 // 得到图片的全路径
                 Uri uri = data.getData();
                 crop(uri);
             }
  
         } else if (requestCode == PHOTO_REQUEST_CAREMA) {
             // 从相机返回的数据
             if (hasSDCard()) {
                 crop(Uri.fromFile(tempFile));
             } else {
                 Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!", 0).show();
             }
  
         } else if (requestCode == PHOTO_REQUEST_CUT) {
             // 从剪切图片返回的数据
             if (data != null) {
                 Bitmap bitmap = data.getParcelableExtra("data");
                 //this.imgHuaishi.setImageBitmap(bitmap);
                 srcBitmap = bitmap;
                 Log.i("MyLogcat",  "procSrc2Gray 进来了!" );  
                 //int i = 40;
                 //int judge = 1;
                 //while(judge > 0)
                 //{//错误大于0则继续
                	  procSrc2Gray(45, 55);//43
                	 //i++;
                	 //if (i >= 45)
                	 //{
                		 //System.out.println("?????????????????????????????????");
                   		 //Toast.makeText(MainActivity.this, "本次识别失败,请在光线较亮的地方再次尝试!!", 3).show();  
                		 //break;
                	 //}
                 //}
             }
             try {
                 // 将临时文件删除
                 tempFile.delete();
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
  
         super.onActivityResult(requestCode, resultCode, data);
     }
     
     /*
      * 剪切图片
      */
     private void crop(Uri uri) {
         // 裁剪图片意图
         Intent intent = new Intent("com.android.camera.action.CROP");
         intent.setDataAndType(uri, "image/*");
         intent.putExtra("crop", "true");
         // 裁剪框的比例,1:1
         intent.putExtra("aspectX", 8);
         intent.putExtra("aspectY", 1);
         // 裁剪后输出图片的尺寸大小
         intent.putExtra("outputX", 800);
         intent.putExtra("outputY", 100);
  
         intent.putExtra("outputFormat", "JPEG");// 图片格式
         intent.putExtra("noFaceDetection", true);// 取消人脸识别
         intent.putExtra("return-data", true);
         // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
         startActivityForResult(intent, PHOTO_REQUEST_CUT);
     }

  
  
     @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_4, getApplicationContext(), mLoaderCallback);  
        Log.i(TAG,  "onResume sucess load OpenCV..." );  
//      new Handler().postDelayed(new Runnable(){   
//   
//          @Override   
//          public void run() {   
//              // TODO Auto-generated method stub   
//              procSrc2Gray();   
//          }   
//             
//      }, 1000);   
          
    }  
      
      
      
  
}  

 简易APP编写完毕

猜你喜欢

转载自lps-683.iteye.com/blog/2273467