我试图制作一个应用程序,将从相机拍摄的照片与存储在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)。 我该如何解决这个问题?