Android中的图像比较由OpenCV提供

时间:2016-05-22 10:00:23

标签: android opencv

我设计了一些图像比较代码。匹配的部分仍然有点缺陷,我希望得到一些帮助。该项目可在 - Github找到。

我有两个图像img1和img2。

enter image description here enter image description here

这些是同一个人的图像。当我想比较这两个图像时,以下代码返回false。

bmpimg1 = Bitmap.createScaledBitmap(bmpimg1, 100, 100, true);
                    bmpimg2 = Bitmap.createScaledBitmap(bmpimg2, 100, 100, true);
                    Mat img1 = new Mat();
                    Utils.bitmapToMat(bmpimg1, img1);
                    Mat img2 = new Mat();
                    Utils.bitmapToMat(bmpimg2, img2);
                    Imgproc.cvtColor(img1, img1, Imgproc.COLOR_RGBA2GRAY); 
                    Imgproc.cvtColor(img2, img2, Imgproc.COLOR_RGBA2GRAY); 
                    img1.convertTo(img1, CvType.CV_32F);
                    img2.convertTo(img2, CvType.CV_32F);
                    //Log.d("ImageComparator", "img1:"+img1.rows()+"x"+img1.cols()+" img2:"+img2.rows()+"x"+img2.cols());
                    Mat hist1 = new Mat();
                    Mat hist2 = new Mat();
                    MatOfInt histSize = new MatOfInt(180);
                    MatOfInt channels = new MatOfInt(0);
                    ArrayList<Mat> bgr_planes1= new ArrayList<Mat>();
                    ArrayList<Mat> bgr_planes2= new ArrayList<Mat>();
                    Core.split(img1, bgr_planes1);
                    Core.split(img2, bgr_planes2);
                    MatOfFloat histRanges = new MatOfFloat (0f, 180f);              
                    boolean accumulate = false;
                    Imgproc.calcHist(bgr_planes1, channels, new Mat(), hist1, histSize, histRanges, accumulate);
                    Core.normalize(hist1, hist1, 0, hist1.rows(), Core.NORM_MINMAX, -1, new Mat());
                    Imgproc.calcHist(bgr_planes2, channels, new Mat(), hist2, histSize, histRanges, accumulate);
                    Core.normalize(hist2, hist2, 0, hist2.rows(), Core.NORM_MINMAX, -1, new Mat());
                        img1.convertTo(img1, CvType.CV_32F);
                        img2.convertTo(img2, CvType.CV_32F);
                        hist1.convertTo(hist1, CvType.CV_32F);
                        hist2.convertTo(hist2, CvType.CV_32F);

                        double compare = Imgproc.compareHist(hist1, hist2, Imgproc.CV_COMP_CHISQR);
                        Log.d("ImageComparator", "compare: "+compare);
                        if(compare>0 && compare<1500) {
                            Toast.makeText(MainActivity.this, "Images may be possible duplicates, verifying", Toast.LENGTH_LONG).show();
                            new asyncTask(MainActivity.this).execute();
                        }
                        else if(compare==0)
                            Toast.makeText(MainActivity.this, "Images are exact duplicates", Toast.LENGTH_LONG).show();
                        else
                            Toast.makeText(MainActivity.this, "Images are not duplicates", Toast.LENGTH_LONG).show();

                    startTime = System.currentTimeMillis();

如何更改我的代码,以便在比较这两个图像时,它返回true?任何建议都有很大帮助。

1 个答案:

答案 0 :(得分:0)

您似乎只是在比较有限的feature vectors,在这种情况下,它只是图像的直方图。 您使用的算法不适合面部识别,因为它只能在图像色谱上识别。

请参阅this关于如何进行面部识别的可能重复。