IOS 实现以图查图 类似百度查图功能
根据“感知哈希算法”来实现的。如果不清楚可以自己搜索下。这不具体讲解。
实现如下(借鉴了网上高手的资料,在这不一一列举了)
//
// checkImage.m
#import "checkImage.h"
@implementation checkImage
+(NSString *)p_w_picpathSourcePath{
NSString *path=[[NSBundle mainBundle] bundlePath];
return path;
}
//1.将图片缩小到8x8的尺寸, 总共64个像素. 这一步的作用是去除各种图片尺寸和图片比例的差异, 只保留结构、明暗等基本信息.
+(UIImage *)p_w_picpathToSize:(UIImage *)p_w_picpath toSize:(CGSize)size{
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
[p_w_picpath drawInRect:CGRectMake(0, 0, size.width, size.width)];
UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
//2.将缩小后的图片, 转为64级灰度图片.
+(uint8_t *)convertTo64GreyImage:(UIImage *)p_w_picpath{
int kRed = 1;
int kGreen = 2;
int kBlue = 4;
int colors = kGreen;
int m_width = p_w_picpath.size.width;
int m_height = p_w_picpath.size.height;
uint32_t *rgbImage = (uint32_t *) malloc(m_width * m_height * sizeof(uint32_t));
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rgbImage, m_width, m_height, 8, m_width * 4, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetShouldAntialias(context, NO);
CGContextDrawImage(context, CGRectMake(0, 0, m_width, m_height), [p_w_picpath CGImage]);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
uint8_t *m_p_w_picpathData = (uint8_t *) malloc(m_width * m_height);
for(int y = 0; y < m_height; y++) {
for(int x = 0; x < m_width; x++) {
uint32_t rgbPixel=rgbImage[y*m_width+x];
uint32_t sum=0,count=0;
if (colors & kRed) {sum += (rgbPixel>>24)&255; count++;}
if (colors & kGreen) {sum += (rgbPixel>>16)&255; count++;}
if (colors & kBlue) {sum += (rgbPixel>>8)&255; count++;}
m_p_w_picpathData[y*m_width+x]=sum/count/4;
}
}
free(rgbImage);
return m_p_w_picpathData;
}
//3.计算图片中所有像素的灰度平均值
+(uint8_t)avgGreyPixel:(uint8_t *)data{
int sum = 0;
for (int i = 0; i < 64; i++) {
sum += data[i];
}
uint8_t avg = sum/64;
return avg;
}
// 4.将每个像素的灰度与平均值进行比较, 如果大于或等于平均值记为1, 小于平均值记为0.
+(NSMutableArray *)compareGreyPixelToAvgPixel:(uint8_t *)p_w_picpathData avg:(uint8_t)avgGrey{
NSMutableArray *endArr=[[NSMutableArray alloc] init];
for (int i=0; i<64; i++) {
if (p_w_picpathData[i]>=avgGrey) {
int f=1;
NSNumber *ff=[NSNumber numberWithInt:f];
[endArr addObject:ff];
}else{
int f=0;
NSNumber *ff=[NSNumber numberWithInt:f];
[endArr addObject:ff];
}
}
return endArr;
}
//5.将上一步的比较结果, 组合在一起, 就构成了一个64位的二进制整数, 这就是这张图片的指纹.
+(NSMutableString *)compareWithGroup:(NSMutableArray *)arr{
NSMutableString *ms=[[NSMutableString alloc] initWithString:@""];
for (NSNumber *i in arr) {
int f=[i intValue];
[ms appendFormat:@"%d",f];
}
return ms;
}
//6.得到图片的指纹后, 就可以对比不同的图片的指纹, 计算出64位中有多少位是不一样的. 如果不相同的数据位数不超过5, 就说明两张图片很相似, 如果大于10, 说明它们是两张不同的图片.
+(int)compareToHamdDistance:(NSMutableString *)scoureImage current:(NSMutableString *)current{
int distance=0;
for (int i=0; i<64; i++) {
unichar s=[scoureImage characterAtIndex:i];
unichar c=[current characterAtIndex:i];
if (s!=c) {
distance++;
}
}
return distance;
}
@end
运行效果如图:点击选取照片
选取第二行第三张照片去找相识图片
找到以下几张相似图片
本人能力有限,如果bug欢迎拍砖。源码可去http://down.51cto.com/data/696207下载,或邮箱至478043385@qq.com免费索取。
转载于:https://blog.51cto.com/kyoworkios/1149733
IOS 实现以图查图 类似百度查图功能相关推荐
- 在线思维导图工具百度脑图
XMind一直都在用,功能也很好.但是百度脑图的优点在于 1 在线编辑,不需下载安装 2 直接存百度网盘里.这个很赞! 官网:naotu.baidu.com
- 在线思维导图神器-百度脑图
平时工作.学习习惯用思维导图来整理所得,一是可以让知识在脑子里形成体系脉络,以后复习的时候直接把思维导图拿出来过一遍,很方便,二是勤动手加强记忆,无论看多少次思维导图,有什么不顺的地方或者发散性思维可 ...
- vue实现搜索框搜索新增_基于Vue el-autocomplete 实现类似百度搜索框功能_含真_前端开发者...
效果图如下所示: 首先上代码 让数据触手可及 class="inline-input search-input" v-model="searchContent" ...
- doc转swf,主流文档在线查看解决方案--类似百度文档功能
引言: 最近项目中对上传的文件需要在线查看功能(就是不用下载到本地,可以直接在网页里打开的查看),通过几周的研究终于搞定,在此总结下供有同样需求的同仁查询和使用. 原理: 通常的在线查看功能都是使用 ...
- uniapp实现 移动端 类似百度的联想功能
自己写的,可能有点乱 <template><view><cu-custom bgColor="bg-gradual-pink" :isBack=&qu ...
- 百度脑图解析:如何进行web复杂应用的渐进式开发
内容来源:2017 年 4 月 8 日,张博在"HTML5梦工场 & 微软开发者沙龙第05期-持续集成"进行<Web复杂应用的 「渐进式」开发>演讲分享.IT ...
- 为什么百度查到的ip地址和ipconfig查到的不同;详解公网Ip和私网ip; 网络分类ABC类;
文章目录 1.百度查到的ip和ipconfig查到的不同 1.1引出问题 1.2不一样的原因 2.IP地址分类 2.1IP类别 2.1 Public IP和Private IP 3.总结 3.1整理上 ...
- 【网络】为什么百度查到的ip和ipconfig查到的不一样;详解公网Ip和私网ip;详解网络分类ABC;
原文地址 IP可以分为Public IP 和 Private IP,出现这种规划的原因在于IPv4所能表示的IP太少而电脑太多以至于不够用,然而只有Public IP才能直接连接上网络,所以对于那些公 ...
- 以图搜图新体验:图片谷歌和百度识图
记得还是年初的时候,在公园里玩,看到路边有很漂亮的花儿,就拿手机拍下来.可是,我不知道这花儿叫什么名字,所以就算上网我也没办法了解这花儿的更多信息,或者可以发到论坛,看能不能遇到刚好打酱油的生物学家. ...
最新文章
- 取java.sql.date日期_JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转]...
- Linux 搭建Sphinx 全文检索引擎
- oracle取日期最大的一条数据_Tableau可视化分析【2】如何连SQL数据查询
- 三种跨线程控件访问方法
- data vue 全部重新渲染_vue将data恢复到初始状态 重新渲染组件实例
- 7-23 哥尼斯堡的“七桥问题”(25 分)
- SpringBoot2 Spring Cloud consul 分布式配置中心使用教程
- linux 下的下载管理工具
- 软件测试计算机硬件 64,《计算机系统与系统软件》用AIDA64测试上机报告
- Ubuntu安装Linux网页版微信
- html时间倒计时代码,html网页时间显示代码和倒计时代码大全
- luogu P1510 精卫填海
- Shader初级(纹理坐标篇)
- 本地同城小程序开发需要具备什么功能
- 吉他所有和弦的指型都靠硬记吗?
- 目前流行的装修风格_现在最流行的装修风格是什么 装修风格流行趋势是什么...
- 海康摄像头opencv实时回调
- 移远EC20设置RNDIS模式拨号上网
- 文末抽奖|为我的祖国—中国,庆生!制作 1985-2020 年天安门花坛“巡演”的视频(详情)...
- Pandas的学习之——使用Pandas进行描述性统计