Android 与OpenCV454,实现模式匹配,色彩空间转换,QRcode识别

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();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值