Android上使调用OpenCV 2.4.10 实现二维码区域定位(Z

阅读: 评论:0

Android上使调用OpenCV 2.4.10 实现二维码区域定位(Z

Android上使调用OpenCV 2.4.10 实现二维码区域定位(Z

Android上使调用OpenCV 2.4.10 实现二维码区域定位(Z-xing 码)

该文章主要用于笔者自己学习中的总结,暂贴出代码部分,待以后有时间再补充算法的详细细节。

Activity class Java 文件

package cn.hjq.android_capture;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import *;
import org.opencv.highgui.*;
import org.opencv.imgproc.*;
import org.opencv.utils.Converters;aphics.Bitmap;
aphics.BitmapFactory;
aphics.Matrix;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.app.Activity;
t.pm.ActivityInfo;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;public class capture extends Activity {private SurfaceView picSV;private Camera camera;private String strPicPath;//OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作  private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {  @Override  public void onManagerConnected(int status) {  switch (status) {  case LoaderCallbackInterface.SUCCESS:{  } break;  default:{  ManagerConnected(status);  } break;  }  }  };@SuppressWarnings("deprecation")@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);setContentView(R.layout.main);picSV = (SurfaceView) findViewById(R.id.picSV);Holder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);	Holder().addCallback(new MyCallback());}private class MyCallback implements Callback{//我们在SurfaceView创建的时候就要进行打开摄像头、设置预览取景所在的SurfaceView、设置拍照的参数、开启预览取景等操作@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {camera = Camera.open();//打开摄像头camera.Holder());//设置picSV来进行预览取景Parameters params = Parameters();//获取照相机的参数params.setPictureSize(800, 480);//设置照片的大小为800*480params.setPreviewSize(800, 480);//设置预览取景的大小为800*480params.setFlashMode("auto");//开启闪光灯params.setJpegQuality(50);//设置图片质量为50       camera.setParameters(params);//设置以上参数为照相机的参数camera.startPreview();} catch (IOException e) {				//开始预览取景,然后我们就可以拍照了e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {//当SurfaceView销毁时,我们进行停止预览、释放摄像机、垃圾回收等工作camera.stopPreview();lease();camera = null;} }public void takepic(View v){//在我们开始拍照前,实现自动对焦camera.autoFocus(new MyAutoFocusCallback());}private class MyAutoFocusCallback implements AutoFocusCallback{@Overridepublic void onAutoFocus(boolean success, Camera camera) {//开始拍照camera.takePicture(null, null, null, new MyPictureCallback());}}private class MyPictureCallback implements PictureCallback{@Overridepublic void onPictureTaken(byte[] data, Camera camera) {try {Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  Matrix matrix = new Matrix();  matrix.preRotate(90);  bitmap = ateBitmap(bitmap ,0,0, Width(),Height(),matrix,true);strPicPath = ExternalStorageDirectory()+"/1Zxing/"+System.currentTimeMillis()+".jpg";FileOutputStream fos = new FileOutputStream( strPicPath );bitmappress(Bitmap.CompressFormat.PNG, 100, fos);fos.close();Handler mHandler = new Handler();mHandler.post(mRunnable);camera.startPreview();} catch (Exception e) {e.printStackTrace();}} }public boolean onTouchEvent (MotionEvent event){int Action = Action();if ( 1 == Action ) {camera.autoFocus(new MyAutoFocusCallback1());}return true;}private class MyAutoFocusCallback1 implements AutoFocusCallback {@Overridepublic void onAutoFocus(boolean success, Camera camera) {}}@Override  public void onResume(){  Resume();  //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是  //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中  OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback);  }Runnable mRunnable = new Runnable() {public void run() {List<MatOfPoint> contours = new ArrayList<MatOfPoint>();String strMissingTime = null;Mat srcColor = new Mat(), srcColorResize = new Mat();Mat srcGray = new Mat(), srcGrayResize = new Mat(), srcGrayResizeThresh = new Mat();srcGray = Highgui.imread(strPicPath, 0);srcColor = Highgui.imread(strPicPath, 1);size(srcGray, srcGrayResize, new ls()*0.ws()*0.2));size(srcColor, srcColorResize, new ls()*0.ws()*0.2));long start = System.currentTimeMillis();//二值化加轮廓寻找Imgproc.adaptiveThreshold(srcGrayResize, srcGrayResizeThresh, 255,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,Imgproc.THRESH_BINARY, 35, 5);Imgproc.findContours(srcGrayResizeThresh, contours, new Mat(),Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_NONE);long end = System.currentTimeMillis();strMissingTime = String.valueOf( end - start );strMissingTime = strMissingTime + "r";//轮廓绘制for ( int i = contours.size()-1; i >= 0; i-- ){MatOfPoint2f NewMtx = new MatOfPoint2f( (i).toArray() );RotatedRect rotRect = Imgproc.minAreaRect( NewMtx );Point vertices[] = new Point[4];rotRect.points(vertices);List<Point> rectArea = new ArrayList<Point>();for ( int n = 0; n < 4; n ++ ){Point temp = new Point();temp.x = vertices[n].x;temp.y = vertices[n].y;rectArea.add(temp);}Mat rectMat = Converters.vector_Point_to_Mat(rectArea);double minRectArea = urArea( rectMat );Point center = new Point();float radius[] = {0};Imgproc.minEnclosingCircle(NewMtx, center, radius);if( urArea( (i)) < 300 ||urArea( (i)) > 3000|| minRectArea < radius[0]*radius[0]*1.57) ve(i);}Imgproc.drawContours(srcColorResize, contours, -1, new Scalar(255,0,0));Highgui.ExternalStorageDirectory()+"/1Zxing/"+System.currentTimeMillis()+"contour.jpg", srcColorResize);			File file=new ExternalStorageDirectory()+"/1Zxing/",&#");  BufferedWriter out = null;  try {out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));  out.write(strMissingTime); out.close();}catch (Exception e) {e.printStackTrace();}			}};
}
<FrameLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><SurfaceViewandroid:id="@+id/picSV"android:layout_width="match_parent"android:layout_height="match_parent"></SurfaceView><ImageButtonandroid:contentDescription="@string/desc"android:onClick="takepic"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right|top"android:src="@android:drawable/ic_menu_camera" /></FrameLayout>

<resources><string name="app_name">Code</string><string name="desc">Take picture button</string>
</resources>

<resources><!--Base application theme, dependent on API level. This theme is replacedby AppBaseTheme from res/l on newer devices.--><style name="AppBaseTheme" parent="android:Theme.Light"><!--Theme customizations available in newer API levels can go inres/l, while customizations related tobackward-compatibility can go here.--></style><!-- Application theme. --><style name="AppTheme" parent="AppBaseTheme"><!-- All customizations that are NOT specific to a particular API-level can go here. --><item name="android:windowNoTitle">true</item><item name="android:windowFullscreen">true</item></style></resources>

<manifest xmlns:android=""package="cn.hjq.android_capture"android:versionCode="1"android:versionName="1.0" ><uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="19" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activity android:name=".capture" >  <intent-filter >  <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER" />  </intent-filter>  </activity></application></manifest>



本文发布于:2024-02-05 07:51:11,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170727759364694.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:区域   二维码   OpenCV   Android
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23