android - 通过 OpenCV 在 Android 中进行图像比较

标签 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?任何建议都有很大帮助。

最佳答案

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

参见 this关于如何执行面部识别的可能重复项。

关于android - 通过 OpenCV 在 Android 中进行图像比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37372878/

相关文章:

java - Firebase 未更新当前用户显示名称

c# - 使用emgu 3.0,MorphologyEx,C#打开和关闭图像处理

matlab - Opencv 中的直方图

android - phonegap 中的 Gps 精度

android - Instant 应用程序 InstantException

android - 绑定(bind)/取消绑定(bind)服务示例 (android)

android - 如何在带有 JAR 导出的 Gradle 脚本中包含 "implementation"依赖项?

python - 如何在python中使用cv2知道文件中的总帧数

c++ - 从OpenCV中的旋转图像旋转回点

opencv - 如何计算 OpenCV 中的行数(霍夫变换)