Andrii Omelc..

7

但是我们可以看到两个图像都具有相同的视觉元素(in).

因此,我们应该比较不是整个图像,而是"相同的视觉元素".Match如果不比较"模板"和"相机"图像本身,您可以更多地提高价值,但处理方式相同(例如转换为二进制黑/白)"模板"和"相机"图像.例如,尝试在两个("模板"和"相机")图像上找到蓝色(模板徽标的背景)正方形,并比较该正方形(感兴趣的区域).代码可能是这样的:

Bitmap bmImageTemplate = ;

Bitmap bmTemplate = findLogo(bmImageTemplate); // process template image

Bitmap bmImage = ;

Bitmap bmLogo = findLogo(bmImage); // process camera image same way

compareBitmaps(bmTemplate, bmLogo);

哪里

private Bitmap findLogo(Bitmap sourceBitmap) {

Bitmap roiBitmap = null;

Mat sourceMat = new Mat(sourceBitmap.getWidth(), sourceBitmap.getHeight(), CvType.CV_8UC3);

Utils.bitmapToMat(sourceBitmap, sourceMat);

Mat roiTmp = sourceMat.clone();

final Mat hsvMat = new Mat();

sourceMat.copyTo(hsvMat);

// convert mat to HSV format for Core.inRange()

Imgproc.cvtColor(hsvMat, hsvMat, Imgproc.COLOR_RGB2HSV);

Scalar lowerb = new Scalar(85, 50, 40); // lower color border for BLUE

Scalar upperb = new Scalar(135, 255, 255); // upper color border for BLUE

Core.inRange(hsvMat, lowerb, upperb, roiTmp); // select only blue pixels

// find contours

List contours = new ArrayList<>();

List squares = new ArrayList<>();

Imgproc.findContours(roiTmp, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

// find appropriate bounding rectangles

for (MatOfPoint contour : contours) {

MatOfPoint2f areaPoints = new MatOfPoint2f(contour.toArray());

RotatedRect boundingRect = Imgproc.minAreaRect(areaPoints);

double rectangleArea = boundingRect.size.area();

// test min ROI area in pixels

if (rectangleArea > 400) {

Point rotated_rect_points[] = new Point[4];

boundingRect.points(rotated_rect_points);

Rect rect = Imgproc.boundingRect(new MatOfPoint(rotated_rect_points));

double aspectRatio = rect.width > rect.height ?

(double) rect.height / (double) rect.width : (double) rect.width / (double) rect.height;

if (aspectRatio >= 0.9) {

squares.add(rect);

}

}

}

Mat logoMat = extractSquareMat(roiTmp, getBiggestSquare(squares));

roiBitmap = Bitmap.createBitmap(logoMat.cols(), logoMat.rows(), Bitmap.Config.ARGB_8888);

Utils.matToBitmap(logoMat, roiBitmap);

return roiBitmap;

}

方法extractSquareMat()只从整个图像中提取感兴趣区域(徽标)

public static Mat extractSquareMat(Mat sourceMat, Rect rect) {

Mat squareMat = null;

int padding = 50;

if (rect != null) {

Rect truncatedRect = new Rect((int) rect.tl().x + padding, (int) rect.tl().y + padding,

rect.width - 2 * padding, rect.height - 2 * padding);

squareMat = new Mat(sourceMat, truncatedRect);

}

return squareMat ;

}

并compareBitmaps()为您的代码包装:

private void compareBitmaps(Bitmap bitmap1, Bitmap bitmap2) {

Mat mat1 = new Mat(bitmap1.getWidth(), bitmap1.getHeight(), CvType.CV_8UC3);

Utils.bitmapToMat(bitmap1, mat1);

Mat mat2 = new Mat(bitmap2.getWidth(), bitmap2.getHeight(), CvType.CV_8UC3);

Utils.bitmapToMat(bitmap2, mat2);

compareMats(mat1, mat2);

}

你的代码作为方法:

private void compareMats(Mat img1, Mat img2) {

FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);

DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.BRIEF);

DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);

Mat descriptors1 = new Mat();

MatOfKeyPoint keypoints1 = new MatOfKeyPoint();

detector.detect(img1, keypoints1);

extractor.compute(img1, keypoints1, descriptors1);

//second image

// Mat img2 = Imgcodecs.imread(path2);

Mat descriptors2 = new Mat();

MatOfKeyPoint keypoints2 = new MatOfKeyPoint();

detector.detect(img2, keypoints2);

extractor.compute(img2, keypoints2, descriptors2);

//matcher image descriptors

MatOfDMatch matches = new MatOfDMatch();

matcher.match(descriptors1,descriptors2,matches);

// Filter matches by distance

MatOfDMatch filtered = filterMatchesByDistance(matches);

int total = (int) matches.size().height;

int Match= (int) filtered.size().height;

Log.d("LOG", "total:" + total + " Match:" + Match);

}

static MatOfDMatch filterMatchesByDistance(MatOfDMatch matches){

List matches_original = matches.toList();

List matches_filtered = new ArrayList();

int DIST_LIMIT = 30;

// Check all the matches distance and if it passes add to list of filtered matches

Log.d("DISTFILTER", "ORG SIZE:" + matches_original.size() + "");

for (int i = 0; i < matches_original.size(); i++) {

DMatch d = matches_original.get(i);

if (Math.abs(d.distance) <= DIST_LIMIT) {

matches_filtered.add(d);

}

}

Log.d("DISTFILTER", "FIL SIZE:" + matches_filtered.size() + "");

MatOfDMatch mat = new MatOfDMatch();

mat.fromList(matches_filtered);

return mat;

}

调整大小(缩放为50%)的结果是从您的问题结果中保存的图像是:

D/DISTFILTER: ORG SIZE:237

D/DISTFILTER: FIL SIZE:230

D/LOG: total:237 Match:230

NB!这是一个快速而肮脏的例子,仅用于演示给定模板的方法.

PS getBiggestSquare()可以是那样的(基于面积比较):

public static Rect getBiggestSquare(List squares) {

Rect biggestSquare = null;

if (squares != null && squares.size() >= 1) {

Rect square;

double maxArea;

int ixMaxArea = 0;

square = squares.get(ixMaxArea);

maxArea = square.area();

for (int ix = 1; ix < squares.size(); ix++) {

square = squares.get(ix);

if (square.area() > maxArea) {

maxArea = square.area();

ixMaxArea = ix;

}

}

biggestSquare = squares.get(ixMaxArea);

}

return biggestSquare;

}

android 字符串相似度对比,Android中的OpenCV图像比较和相似度相关推荐

  1. android字符串块,一种Android系统字符串提取及合并方法与流程

    本发明涉及字符串提取及合并方法,尤其涉及一种Android系统字符串提取及合并方法. 背景技术: 随着智能通讯终端的日益普及,采用Android系统的智能通讯终端设备越来越走向世界各地,而对于多国语言 ...

  2. android视频播放器sdk对比,Android项目之android SDK视频播放与vitamio视频播放

    尊重原创,转载请注明:From zsml2016(http://blog.csdn.net/qq_29269233)Power byzsml2016侵权必究! 前言: 今天我想给大家分享Android ...

  3. php用户名相似度对比,PHP-如何快速计算出用户的相似度

    首先,我假设你是想给用户推荐相似用户,因为如果给用户推荐文章或其他内容,思路是不同的. 一.先创建向量模型,根据不同的网站类型,需要考虑的因素不同,以下几种方式可以做合起来使用 1.考虑用户的哪些数据 ...

  4. android字符串加删除线,android textview 添加上划线 中划线 删除线

    很简单:两个例子一样 例如1: android textview 添加下划线 中划线 删除线 tv=(TextView)findViewById(R.id.tvId); tv.getPaint().s ...

  5. android布局的效率对比,Android使用ViewStub提高布局性能

    在Android开发中,View是我们必须要接触的用来展示的技术.通常情况下随着View视图的越来越复杂,整体布局的性能也会随之下降.这里介绍一个在某些场景下提升布局性能的View,它就是ViewSt ...

  6. Android常用播放器对比,Android平台四大音乐播放器对比评测

    现如今,谷歌android手机系统越来越流行,在此平台上的应用软件也逐渐增多.今天,我们就天天动听.Winamp.酷我听听.QQ音乐等四款较常用的播放软件作一番评比,看看它们在android平台上的表 ...

  7. android字符串点击事件,Android匹配字符串高亮并设置点击事件

    public class TextRichUtil { public interface RichClickLisentner { void onClick(); } /** * 获取高亮字符串 * ...

  8. android字符串加删除线,android TextView 设置和取消删除线的两种方法

    一.TextView 设置删除线有两种方式: (推荐)方式一: 通过按位或运算符|,将 TextView 原本的 Flags 属性和删除线一块设置.setPaintFlags内会对 TextView ...

  9. 在Qt界面中显示OpenCV图像

    OpenCV中的图像主要存储在Mat类中,要让其显示在Qt的Label控件上,必须先将其转换为Qt的QImage类. Mat类图像是按照BGR顺序存储的图像,而QImage是按照RGB顺序存储的,在类 ...

最新文章

  1. 微信小程序实例源码大全demo下载
  2. 写给工程师的十条精进原则
  3. 基于新唐M0的XXTEA加密解密算法源码
  4. Java引入import其它目录的自定义包或java源文件
  5. OpenCV HDF和建立群组Group
  6. RISC与CISC比较
  7. HDU - 5876 Sparse Graph(bfs+set)
  8. SAP CRM SPRO Customizing 里 Text Object 属性 continue 的含义
  9. [css] 怎么使用css选择空链接?
  10. 使用函数统计指定c语言,浙大版《C语言程序设计(第3版)》题目集 习题5-5 使用函数统计指定数字的个数...
  11. 扔鸡蛋问题具体解释(Egg Dropping Puzzle)
  12. htpasswd用法
  13. UTS安装与卸载-Linux篇
  14. 为什么不建议使用免费的IP代理?
  15. 小白必读:计算机网络入门
  16. 项目启动失败解决方法
  17. 23、LZ77压缩和解压
  18. Java与数据库中的datetime Timestamp以及String之间的转换
  19. python 投掷骰子实验
  20. AI中台与数据中台在智能投顾机器人的实践(附PDF下载)

热门文章

  1. 散列(哈希 hash)
  2. feign调用第三方接口_讲一个你不知道的事:SringCloud的feign的继承特性
  3. 弱引用什么时候被回收_Java引用类型有哪些
  4. 表名含有后缀 mysql 怎么删除_mysql批量删除指定前缀或后缀表
  5. SpringBoot 2.0 教程实战 MySQL 读写分离
  6. pandas教程:series和dataframe
  7. java数字转字符串及字符串转数字
  8. Java中设计模式之装饰者模式-2
  9. jquery找祖先包含_jquery如何获取祖先元素
  10. 安居客检测到网页抓取_安居客天津租房情况分析