Android - 与相机图片匹配的OpenCV模板

时间:2016-08-01 10:50:41

标签: android opencv android-camera template-matching

我试图制作一个应用程序,将从相机拍摄的照片与存储在SD卡中的其他照片进行比较。 如果我尝试比较存储在SD卡中的两个图像,它可以正常工作,但是当我尝试使用相机时,它会冻结。

这是我的代码的一部分:

private boolean isSame = false;
final int c = 2;


@Override
protected void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (!OpenCVLoader.initDebug()) {

        System.out.println("Errore");

    }

    final Mat[] vector = new Mat[2];

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {



            try {

                File fotofatte = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/images"+"/taken");

                if(!fotofatte.exists()) {

                    fotofatte.mkdirs();

                }

                Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                File image = new File(fotofatte, "image_001.jpeg");
                Uri uriSavedImage = Uri.fromFile(image);

                imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
                startActivityForResult(imageIntent, 1);

                for (int i = 0; i < c; i++) {

                    final String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();

                    if (baseDir == null) {

                        throw new IOException();

                    }

                    Bitmap bm = BitmapFactory.decodeResource( getResources(), R.drawable.tmp);
                    Mat img = new Mat(bm.getHeight(), bm.getWidth(), CvType.CV_8UC1);
                    Utils.bitmapToMat(bm, img);


                    Bitmap bm2 = BitmapFactory.decodeFile(fotofatte+ "/image_001.jpeg");
                    Mat templ = new Mat(bm2.getHeight(), bm2.getWidth(), CvType.CV_8UC1);
                    Utils.bitmapToMat(bm2, templ);

                    Bitmap bm3 = BitmapFactory.decodeResource( getResources(), R.drawable.dd);
                    Mat img2 = new Mat(bm3.getHeight(), bm3.getWidth(), CvType.CV_8UC1);
                    Utils.bitmapToMat(bm3, img2);


                    vector[0] = img;
                    vector[1] = img2;


                    int result_cols = templ.cols() - vector[i].cols() + 1;
                    int result_rows = templ.rows() - vector[i].rows() + 1;
                    Mat result = new Mat(result_cols, result_rows, CvType.CV_32FC1);

                    // / Do the Matching and Normalize
                    Imgproc.matchTemplate(templ, vector[i], result, Imgproc.TM_CCOEFF_NORMED);
             /*   Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1,
                        new Mat());*/

                    // / Localizing the best match with minMaxLoc
                    Core.MinMaxLocResult mmr = Core.minMaxLoc(result);

                    //  Point matchLoc;
          /*      if (Imgproc.TM_CCOEFF == Imgproc.TM_SQDIFF
                        || Imgproc.TM_CCOEFF == Imgproc.TM_SQDIFF_NORMED) {
                    matchLoc = mmr.minLoc;
                    System.out.println(mmr.maxVal);
                    System.out.println(mmr.minVal);


                } else {
                    matchLoc = mmr.maxLoc;
                    System.out.println(mmr.maxVal);
                    System.out.println(mmr.minVal);

                }*/

                    System.out.println(mmr.maxVal);

                }

            } catch (IOException e) {

                System.out.println(e.toString());

            }


        }
    });
}}

我的日志中没有收到任何错误。

感谢您的帮助。

更新

大家好,我已经调整了我的位图大小,现在我可以将从相机拍摄的照片与存储在SD卡中的模板进行比较。

但现在我面临一个新问题。 如果我用玻璃制作一张照片作为模板,然后我用另一张相同玻璃的照片进行比较,结果只有0.4175666272640228(mmr.MaxValue)。 我该如何解决这个问题?

0 个答案:

没有答案