android 字符串相似度对比,Android中的OpenCV图像比较和相似度
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图像比较和相似度相关推荐
- android字符串块,一种Android系统字符串提取及合并方法与流程
本发明涉及字符串提取及合并方法,尤其涉及一种Android系统字符串提取及合并方法. 背景技术: 随着智能通讯终端的日益普及,采用Android系统的智能通讯终端设备越来越走向世界各地,而对于多国语言 ...
- android视频播放器sdk对比,Android项目之android SDK视频播放与vitamio视频播放
尊重原创,转载请注明:From zsml2016(http://blog.csdn.net/qq_29269233)Power byzsml2016侵权必究! 前言: 今天我想给大家分享Android ...
- php用户名相似度对比,PHP-如何快速计算出用户的相似度
首先,我假设你是想给用户推荐相似用户,因为如果给用户推荐文章或其他内容,思路是不同的. 一.先创建向量模型,根据不同的网站类型,需要考虑的因素不同,以下几种方式可以做合起来使用 1.考虑用户的哪些数据 ...
- android字符串加删除线,android textview 添加上划线 中划线 删除线
很简单:两个例子一样 例如1: android textview 添加下划线 中划线 删除线 tv=(TextView)findViewById(R.id.tvId); tv.getPaint().s ...
- android布局的效率对比,Android使用ViewStub提高布局性能
在Android开发中,View是我们必须要接触的用来展示的技术.通常情况下随着View视图的越来越复杂,整体布局的性能也会随之下降.这里介绍一个在某些场景下提升布局性能的View,它就是ViewSt ...
- Android常用播放器对比,Android平台四大音乐播放器对比评测
现如今,谷歌android手机系统越来越流行,在此平台上的应用软件也逐渐增多.今天,我们就天天动听.Winamp.酷我听听.QQ音乐等四款较常用的播放软件作一番评比,看看它们在android平台上的表 ...
- android字符串点击事件,Android匹配字符串高亮并设置点击事件
public class TextRichUtil { public interface RichClickLisentner { void onClick(); } /** * 获取高亮字符串 * ...
- android字符串加删除线,android TextView 设置和取消删除线的两种方法
一.TextView 设置删除线有两种方式: (推荐)方式一: 通过按位或运算符|,将 TextView 原本的 Flags 属性和删除线一块设置.setPaintFlags内会对 TextView ...
- 在Qt界面中显示OpenCV图像
OpenCV中的图像主要存储在Mat类中,要让其显示在Qt的Label控件上,必须先将其转换为Qt的QImage类. Mat类图像是按照BGR顺序存储的图像,而QImage是按照RGB顺序存储的,在类 ...
最新文章
- 微信小程序实例源码大全demo下载
- 写给工程师的十条精进原则
- 基于新唐M0的XXTEA加密解密算法源码
- Java引入import其它目录的自定义包或java源文件
- OpenCV HDF和建立群组Group
- RISC与CISC比较
- HDU - 5876 Sparse Graph(bfs+set)
- SAP CRM SPRO Customizing 里 Text Object 属性 continue 的含义
- [css] 怎么使用css选择空链接?
- 使用函数统计指定c语言,浙大版《C语言程序设计(第3版)》题目集 习题5-5 使用函数统计指定数字的个数...
- 扔鸡蛋问题具体解释(Egg Dropping Puzzle)
- htpasswd用法
- UTS安装与卸载-Linux篇
- 为什么不建议使用免费的IP代理?
- 小白必读:计算机网络入门
- 项目启动失败解决方法
- 23、LZ77压缩和解压
- Java与数据库中的datetime Timestamp以及String之间的转换
- python 投掷骰子实验
- AI中台与数据中台在智能投顾机器人的实践(附PDF下载)
热门文章
- 散列(哈希 hash)
- feign调用第三方接口_讲一个你不知道的事:SringCloud的feign的继承特性
- 弱引用什么时候被回收_Java引用类型有哪些
- 表名含有后缀 mysql 怎么删除_mysql批量删除指定前缀或后缀表
- SpringBoot 2.0 教程实战 MySQL 读写分离
- pandas教程:series和dataframe
- java数字转字符串及字符串转数字
- Java中设计模式之装饰者模式-2
- jquery找祖先包含_jquery如何获取祖先元素
- 安居客检测到网页抓取_安居客天津租房情况分析