Android 与OpenCV454,实现模式匹配,色彩空间转换,QRcode识别
模板识别训练过程使用opencv3自带的模板训练工具
主要实现了1:使用直方图方式训练模板与模板匹配,见MainActivity
2:yuv格式图像转换为RGB,对接大疆设备,见yuvConvter
3:使用opencv多二维码识别与定位,见QRActivity
Android与OpenCV454项目demo-Android文档类资源-优快云下载
模式识别代码: public class TargetDetec { private static TargetDetec ins=null; private static boolean CVLOADED=false; private static final String TAG="TargetDetec"; public static Context context; CascadeClassifier cascade; /*** * 单例方法 * @return */ public static TargetDetec getInstance(){ if(ins==null){ ins=new TargetDetec(); } if(!CVLOADED){ ins.initOpencv();//初始opencv } return ins; } public TargetDetec(){ if(CVLOADED){ initTemplate(); } else{ initOpencv(); } } /** * 初始化opencv */ public void initOpencv(){ if (!OpenCVLoader.initDebug()) { Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, context, mLoaderCallback); } else { Log.d(TAG, "OpenCV library found inside package. Using it!"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } } /** * yuv 数据转换为bitmap * @param buf * @return */ public Bitmap getBitmap(byte[] buf){ if(cascade==null || !CVLOADED)return null; Mat mat=new Mat(1080,1280, CvType.CV_8UC1); mat.put(0,0,buf); Mat img=new Mat(); Imgproc.cvtColor(mat,img,Imgproc.COLOR_YUV2BGR_NV21); Bitmap bmp=Bitmap.createBitmap(1280,720, Bitmap.Config.ARGB_8888); Utils.matToBitmap(img,bmp); img.release(); mat.release(); return bmp; } /** * 进行检测 * @param buf * @return */ public List<Point> doDetect(byte[] buf){ if(cascade==null || !CVLOADED)return null; List<Point> ps=new ArrayList<Point>();// Mat yuv=new Mat(1080,1280, CvType.CV_8UC1); yuv.put(0,0,buf); Mat rgb=new Mat(); Imgproc.cvtColor(yuv,rgb,Imgproc.COLOR_YUV2BGR_NV21); MatOfRect rst = new MatOfRect(); //Log.i("start",System.currentTimeMillis()+""); cascade.detectMultiScale(rgb,rst,1.1,70,0); //Log.i("end",System.currentTimeMillis()+""); List<Rect> rects=rst.toList(); for (Rect r: rects ) { Point p=new Point(r.x+r.width/2,r.y+r.height/2); ps.add(p); } return ps; } private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(context) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.i(TAG, "OpenCV loaded successfully"); CVLOADED=true; // mOpenCvCameraView.enableView(); initTemplate();//必须在这里初始化opencv对象 } break; default: { super.onManagerConnected(status); } break; } } }; void initTemplate(){ String path=getTemplate("cascade.xml"); //初始化分类器 cascade=new CascadeClassifier(); Log.i("opencv","start load cascaed file "+path); cascade.load(path); Log.i("opencv","cascaed file load ok"); } //assets文件到缓存路径 private String getTemplate(String fileName){ try { File cacheDir=context.getCacheDir(); if (!cacheDir.exists()){ cacheDir.mkdirs(); } File outFile =new File(cacheDir,fileName); if (!outFile.exists()){ boolean res=outFile.createNewFile(); if (!res){ return null; } } InputStream is=context.getAssets().open(fileName); FileOutputStream fos = new FileOutputStream(outFile); byte[] buffer = new byte[1024]; int byteCount; while ((byteCount = is.read(buffer)) != -1) { fos.write(buffer, 0, byteCount); } fos.flush(); is.close(); fos.close(); return outFile.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } return null; }
色彩空间转换
public class YuvConverter extends AppCompatActivity implements View.OnClickListener { ImageView imgview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_yuv_converter); imgview=findViewById(R.id.img); imgview.setOnClickListener(this); //loadyuv(); } @Override public void onResume() { super.onResume(); TargetDetec.context=this;//context 赋值进去 TargetDetec.getInstance();//初始化 } void loadyuv() { try { InputStream is = getAssets().open("test.yuv"); Log.i("yue","size"+is.available()); byte[] buffer=new byte[is.available()]; is.read(buffer); /* Bitmap bmp=TargetDetec.getInstance().getBitmap(buffer); imgview.setImageBitmap(bmp); */ List<Point> ps=TargetDetec.getInstance().doDetect(buffer); if(ps!=null){ Log.i("yuv test",ps.size()+" points "); } else{ Log.i("yuv error","load opencv error"); } } catch (Exception e){ e.printStackTrace(); } } @Override public void onClick(View view) { loadyuv(); }