图片识别 订阅
图片识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。一般工业使用中,采用工业相机拍摄图片,然后再利用软件根据图片灰阶差做进一步识别处理,图像识别软件国外代表的有康耐视等,国内代表的有图智能等。另外在地理学中指将遥感图像进行分类的技术。 展开全文
图片识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。一般工业使用中,采用工业相机拍摄图片,然后再利用软件根据图片灰阶差做进一步识别处理,图像识别软件国外代表的有康耐视等,国内代表的有图智能等。另外在地理学中指将遥感图像进行分类的技术。
信息
所属学科
计算机科学
外文名
image identification
应用对象
图片
中文名
图片识别
目    的
识别各种不同模式的目标和对像
应用领域
计算机等
图片识别简介
图形刺激作用于感觉器官,人们辨认出它是经验过的某一图形的过程,也叫图像再认。在图像识别中,既要有当时进入感官的信息,也要有记忆中存储的信息。只有通过存储的信息与当前的信息进行比较的加工过程,才能实现对图像的再认。
收起全文
精华内容
下载资源
问答
  • C++ OCR图片识别文字

    2015-11-19 16:01:30
    利用霍夫变换直线,检测出名片边界,计算倾斜角,对其校正,然后利用开源ocr库,对文字识别
  • java指纹识别-图片识别技术

    千次下载 热门讨论 2012-04-17 13:39:11
    java指纹识别-图片识别技术。 这是一个项目工程。里面有图片的测试。可以根据指纹图片进行比对。
  • 通过网上的一些资料结合,用c#写的验证码识别器,里面有代码,
  • 基于google Zxing实现二维码的生成,识别和长按识别的效果,仿微信选择相册里的二维码图片直接识别的效果 ,选择相册在主页面点击打开摄像机进行扫描,进入扫描页面,在里面有选择相册的选项,直接点击就可以调用...
  • 微信小程序——图片识别

    万次阅读 多人点赞 2020-01-03 13:55:11
    我的微信小程序 期末大作业——基于百度大脑API的图片识别小程序 具体实现了动物识别、植物识别、车辆识别 三个功能 实验源码已经放到了我的GitHub,欢迎测试修改 下面给大家分享该项目的实验报告???? 目录1 概述...

    我的微信小程序 期末大作业——基于百度大脑API的图片识别小程序

    具体实现了动物识别植物识别车辆识别 三个功能
    实验源码已经放到了我的GitHub,欢迎测试修改
    GitHub仓库地址:https://github.com/ZHJ0125/ImageMaster
    备用码云仓库地址:https://gitee.com/zhj0125/ImageMaster
    下面给大家分享该项目的实验报告😜

    1 概述

    1.1 课程大作业目的与要求

    课程大作业的目的是:运用在本次课程中学到的知识来指导实践,了解程序设计其实现方法,学会解决实际问题。掌握微信小程序设计的具体步骤与基本方法,针对选定的程序做调研分析。通过课程大作业,提高实践动手技能,培养独立分析分析问题和解决问题的能力。
    课程大作业的要求:本次课程大作业的选题比较灵活,可以是自主选题,也可以参考课本中的案例自行修改完善,题目要符合课程大作业的要求,并且具备一定的水平和深度。

    1.2 课程大作业简介

    图像识别是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。在众多的图像识别分支中,拍照识别是一个重要的应用。利用图像识别技术,识别拍摄到的图片内容,已经广泛应用于各类图像识别App中。
    微信小程序是一种不需要下载安装即可使用的应用,它实现了应用的“触手可及”和“即用即走”,用户扫一扫或搜一下即可打开应用。利用微信小程序使用便捷的特点,结合图片识别应用,本次大作业选定了制作微信小程序的图片识别应用——ImageMaster。本应用实现了基于微信小程序的动植物识别和车辆识别,使用便捷,充分发挥了微信小程序“即用即走”的特点。
    同时,本次大作业项目制作过程只用了Git进行进度跟踪,便于进行版本回退和功能更新。

    2 设计思路

    根据初步选定的设计题目,查找相关资料,针对系统所涉及内容,查阅相关背景知识,将设计思路在此做一个概括。
    本课题需要实现一个基本的图片识别应用,实现动物识别、植物识别和车辆识别三种主要功能。查阅的资料主要包括两方面:图片识别API的选择以及微信小程序UI框架的选择。

    2.1 图片识别API

    首先需要查阅图片识别API的相关资料,以便确定课题最终使用哪个API。下面我将在接口能力、是否有参考例程、个人评价三方面简要分析一下常见的几种图片识别API。

    百度大脑

    • 接口能力

    表2-1 百度图片识别API接口能力

    接口名称接口能力简要描述
    图像主体检测识别图像中的主体具体坐标位置。
    通用物体和场景识别高级版识别图片中的场景及物体标签,支持10w+标签类型。
    菜品识别检测用户上传的菜品图片,返回具体的菜名、卡路里、置信度信息。
    自定义菜品识别入库自定义的单菜品图,实现上传多菜品图的精准识别,返回具体的菜名、位置、置信度
    logo商标识别识别图片中包含的商品LOGO信息,返回LOGO品牌名称、在图片中的位置、置信度。
    动物识别检测用户上传的动物图片,返回动物名称、置信度信息。
    植物识别检测用户上传的植物图片,返回植物名称、置信度信息。
    果蔬食材识别检测用户上传的果蔬类图片,返回果蔬名称、置信度信息。
    地标识别检测用户上传的地标图片,返回地标名称。
    红酒识别识别图像中的红酒标签,返回红酒名称、国家、产区、酒庄、类型、糖分、葡萄品种等信息。
    货币识别识别图像中的货币类型,返回货币名称、代码、面值、年份信息,可识别百余种国内外常见货币。
    • 调用方式
      API 和 SDK 两种方式,SDK文档包含 Java、PHP、Python、C#、C++、Node语言,有丰富的 Demo。

    腾讯AI开放平台

    接口包含OCR、人体与人脸识别、物体识别、图片特效、图片识别、敏感信息审核、闲聊机器人、基础文本分析、语义解析、语音识别 等等,有 PHP 参考例程。

    华为HiAI

    接口包含人脸识别、人体识别、图片识别、图像分辨率、场景识别、文档检测矫正、人像分割、视频语音等等。有详细的开发指南,但是其针对的是 Android 手机平台的开发。

    旷世 Face++

    接口包含人脸识别、人体识别、证件识别、图像识别,拥有详细的开发指南。
    综合比较之后,决定采用百度大脑 API平台。

    2.2 微信小程序UI框架

    查阅各种微信小程序UI框架资料,决定使用哪种 UI 框架作为本项目的UI框架。

    • WeUI

      • 项目地址
      • 简介
        WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。包含button、cell、dialog、 progress、 toast、article、actionsheet、icon等各式元素。
      • 使用体验
        毕竟是微信官方提供的UI框架,界面肯定是与微信小程序的适配度最好。但是感觉没有特别的亮点。
    • Vant Weapp

      • 项目地址
      • 简介
        Vant Weapp 是有赞移动端组件库 Vant 的小程序版本,两者基于相同的视觉规范,提供一致的 API 接口,助力开发者快速搭建小程序应用。
      • 使用体验
        组件分类做得不错,样式也很简洁美观。
    • iView Weapp

      • 项目地址
      • 简介
        一套高质量的微信小程序 UI 组件库
      • 使用体验
        界面简单,没亮点。
    • MinUI

      • 项目地址
      • 简介
        MinUI 是基于微信小程序自定义组件特性开发而成的一套简洁、易用、高效的组件库,适用场景广。覆盖小程序原生框架,各种小程序组件主流框架等,并且提供了专门的命令行工具
      • 使用体验
        组件还算齐全,没有亮点。官方Demo还有广告链接。
    • Wux Weapp

      • 项目地址
      • 简介
        Wux Weapp 是一套组件化、可复用、易扩展的微信小程序 UI 组件库。UI 样式可配置,拓展灵活,轻松适应不同的设计风格。60多个丰富的组件,能够满足移动端开发的基本需求。
      • 使用体验
        没有特别炫酷的效果,但组件齐全。
    • ColorUI

      • 项目地址
      • 简介
        鲜亮的高饱和色彩,专注视觉的小程序组件库。
      • 使用体验
        功能齐全,各种组件分类明确。
    • Taro UI

      • 项目地址
      • 简介
        一款基于 Taro 框架开发的多端 UI 组件库。基于 Taro 开发 UI 组件一套组件,可以在微信小程序,支付宝小程序,百度小程序,H5 多端适配运行(ReactNative 端暂不支持)。提供友好的 API,可灵活的使用组件。
      • 使用体验
        界面简介,功能丰富。

    经过亲自体验各种UI框架的官方Demo,最后感觉 Taro UI 使我印象很深刻。界面简洁,组件分类明确。我起初决定使用 Taro UI 框架,但是在项目进行到UI设计阶段,发现Taro使用有些许难度,为简化开发过程,最终使用了微信小程序的官方UI框架——WeUI框架。

    3 设计方案

    在需求分析的基础上,查阅资料,对在小程序设计中可能用到的相关技术做一定的调研分析,做一个概要性的描述。
    因为微信小程序本身就是联网的应用平台,因此在微信小程序平台进行图片识别,就不必担心网络连接问题。从源头上追溯,实现图片识别需要用户首先上传图片或拍摄图片,需要解决图片上传问题;之后发送API请求时,图片需要作为请求的参数,需要解决图片转码的问题;最后API请求调用成功后,需要将识别的数据输出,就涉及数据处理以及UI界面设计的问题。通过解决关键的“图片上传”、“图片转码”、“API调用”、“界面设计”这几个问题,就可以实现基本的图片识别小程序了。

    4 设计过程

    根据初步选定的课程大作业程序设计题目,查找相关资料,结合课本中的案例以及前期的学习,整理设计过程。
    在这里插入图片描述

    图1 设计过程

    4.1 百度开放平台注册

    在这里插入图片描述

    图4.1 服务条款

    首先登陆百度智能云平台,同意它的服务条款。
    之后填写相关的信息,在控制台概览中创建应用。
    在这里插入图片描述

    图4.2 创建新应用

    在这里插入图片描述

    图4.3 获取密钥

    现在已经申请好了百度的API接口,下面尝试在微信小程序中进行调用。

    4.2 获取asscee_token

    在百度AI的官方文档中可以看到,这个API接口有两种调用方式,两种不同的调用方式有相同的接口URL地址,区别在于请求方式和鉴权方式不同。下面我将尝试使用微信小程序中常用的POST请求方式,调用该接口。

    在这里插入图片描述

    图4.4 调用方式

    在官方文档中可以看到,使用post请求需要用到access_token,所以现在去查看如何获取access_token。

    在这里插入图片描述

    图4.5获取Access_Token

    获取access_token需要下个授权的服务器地址发送post请求,使用固定的参数,即可得到服务器返回的json数据。

    在这里插入图片描述

    图4.6 服务器返回参数

    下面就开始进行小程序的编写,实现access_token的获取。
    首先,在空的小程序中添加一个按钮,在按钮按下后,调用wx.request方法向服务器发送POST请求。

    在这里插入图片描述

    图4.7 布局文件

    按钮绑定事件处理函数,这个事件处理函数就是用来发送POST请求的。

    在这里插入图片描述

    图4.8 绑定事件

    上面图片就是编写的事件处理函数,利用wx.request方法,请求百度API的URL地址,请求方式按要求是POST方式。然后分别编写了请求完成、请求成功、请求失败的回调函数,目的就是让我能在控制台中看到请求的状态。
    下面就需要在微信小程序的后台添加合法域名,以便wx.request方法能够正确使用。

    在这里插入图片描述

    图4.9 添加域名

    箭头所指的就是百度大脑的请求网址,上面那个URL是以前做地图API添加的,这里没有用到。运行模拟器之后成功获取到了access_token的值。

    在这里插入图片描述

    图4.10 获取token

    可以看到,控制台执行了success回调函数,成功返回了access_token。现在Access_token的问题已经解决了。接下来就要尝试去请求百度图片识别的API接口了。
    通过阅读百度大脑API接口文档,我大概理解了百度API的接口使用方式。看一下下面的API文档的截图就可以了解其流程。

    在这里插入图片描述

    图4.11 请求说明

    我们首先需要使用微信封装的request方法请求这个API的URL地址,注意要使用该POST方式。然后这个URL的具体内容就是文档中给出的地址,不同的API接口有不同的请求地址。URL地址需要添加一些参数,如access_token、Content-Type等等。同时,还需要一个image参数作为图片的标识,这个image是将图片转换成了base64编码的格式,也就是将图片传换成了一串字符。
    再查阅微信小程序wx.request方法就可以知道,image这个参数可以通过小程序的data属性表示。这样,API接口的请求过程就可以在小程序中表示出来了。

    在这里插入图片描述

    图4.12 参数说明

    下面尝试在小程序中进行程序编写。
    首先添加一个变量“token”用来存储我获取到的access_token值,然后将success回调函数修改成下图中的代码。

    在这里插入图片描述

    图4.13 调用方式

    也就是将token从服务器返回的json数据中提取出来。现在,token已经存储到了变量中。

    4.3 图片上传

    现在有一个问题,微信小程序怎样获取图片数据呢?微信常用的方式是将用户的图片文件上传到微信开发者的服务器上,服务器接收到图片数据后再进行相关的处理。不管怎样,都首先需要使用微信提供的接口上传图片文件。那么首先研究一下怎样使用微信的图片上传接口。
    微信提供了“从本地选择图片或使用相机拍照”的接口“wx.chooseImage”。

    在这里插入图片描述

    图4.14 参数说明

    现在尝试使用该接口上传一下图片文件。在逻辑文件中编写图片上传按钮的事件处理函数。

    在这里插入图片描述

    图4.15 获取图片

    下面运行小程序,点击上传图片按钮,会弹出系统资源管理器,在里面选择图片文件点击确定,即可成功上传图片文件。在success回调函数中,把上传图片的文件路径放到变量中,再通过控制台显示出来即可。在控制台中显示了图片路径。

    在这里插入图片描述

    图4.16 控制台信息

    为了确定图片真的已经上传到了微信小程序中,我现在把上传的图片显示在小程序界面中。小程序文档中指出,tempFilePaths可以作为组件的src地址,所以显示图片就很方便了。
    经过一番调试,该功能终于实现了。首先,在页面布局中添加组件,该组件的src设置为动态变量imageUrl,以便在图片上传后动态改变。之后编写相应的事件处理函数,首先添加一个默认的图片索引地址,将该图片放到向程序工程目录下,使用data属性保存其路径信息。

    在这里插入图片描述

    图4.17 图片地址

    然后在原有的图片上传事件处理函数的基础上,编写增加代码如下:

    在这里插入图片描述

    图4.18 获取图片地址

    画横线的代码是图片动态显示的关键代码。这样,就是实现了图片的上传和动态更新。PS:这部分内容参考课本P132“上传头像”部分。

    4.4 图片格式转化

    好的,现在就可以看一下怎样把图片转换成base64格式的数据了。
    经过查找资料,发现将图片转换成base64格式的方式也有不少。我是用一种微信提供的文件管理接口实现的。在上传图片的成功回调函数中(此时已经得到了本地图片地址),使用文件系统管理方法,读取本地文件的内容。这里指定读取文件的编码格式为base64,然后通过控制台显示出来就可以了。

    在这里插入图片描述

    图4.19 图片转码

    上面截了一下关键位置的代码,这部分代码是放在success回调函数中,因为回调函数中已经获取到了上传图片的本地地址。
    看一下控制台的信息:

    在这里插入图片描述

    图4.20 控制台信息

    可以看到,控制台输出了图片的base64编码值。稍微了解一下base64编码,该编码可以用于HTML环境下的较长信息的标识,只要用于canvas画布的图片显示。它的好处在于,可以在没有上传图片文件的情况下,使用该编码在HTML中插入该图片。这种编码有固定的表示形式:“data:image/jpeg;base64, …”,也有固定的格式转换格式。具体的内容就不再详细研究了。在我的测试中,上传的原图片大小是20.5KB,转换成base64编码之后的数据大小为54.7KB。

    4.5 API请求

    图片已经准备好了,现在已经可以去调用百度图片识别的API了。下面需要对包括“access_token”、“base64编码”等数据进行整合,并以动物识别为例尝试该API的调用。
    首先添加识别按钮,然后编写相应的事件处理函数。

    在这里插入图片描述

    图4.21 识别按钮

    事件处理函数就是要进行API接口调用了。

    在这里插入图片描述

    图4.22 识别图片

    上面就是按照百度动物识别API文档的要求,结合小程序wx.request方法的属性写出来的事件处理函数。
    我在网上搜了一个狗的图片,添加到了小程序文件夹中作为测试图片。运行模拟器进行测试。依次点击“获取access_token”、“上传图片”以及“识别该图片”按钮,在控制台看到API返回的数据。

    在这里插入图片描述

    图4.23 接口返回值

    可以看到,在API返回的JSON数据中,标注了识别结果,其中置信度最高的结果是“威尔士柯基”。我特意搜了一下这个“威尔士柯基”,识别结果还是挺准的。
    还要测试一下非动物图片的识别情况。现在我继续上传一个头像图片进行测试,看看测试结果。可以看到,非动物也是可以被识别出来的,识别结果只有一个高置信度的“非动物”结果。

    在这里插入图片描述

    图4.24 非动物识别

    程序做到这里,可以说最大的障碍已经被克服了。目前已经实现了“动物识别”,下面就是逐步实现“植物识别”、“车型识别”等功能就可以了,他们的基本流程是一样的。

    4.6 实现植物识别

    现在来整理一下代码,尝试实现“植物识别”功能。
    通过阅读API文档可以看出,其实这几种不同的图像识别的接口,只是URL地址不同,其他参数都是一样的。所以我设置了一个变量apiUrl用来存放不同接口的URL地址,为“植物识别”编写一个新的事件处理函数。这个事件处理函数与“动物识别”唯一的不同就是apiUrl不一样罢了。

    在这里插入图片描述

    图4.25 植物识别

    可以看到,我把请求接口的URL放到了apiUrl变量中。同时精简了控制台显示的数据,只保留关键的数据。
    至于图像识别的事件处理函数,只需要把之前的POST请求地址改成用apiUrl表示就可以了。

    在这里插入图片描述

    图4.26 识别图片

    可以看到画横线的那句话,就是把POST地址改了一下,使程序的使用范围更广了。同时还要注意到,我精简了控制台的输出信息,只保留置信度最高的结果。
    现在就可以识别植物了。

    在这里插入图片描述

    图4.27 识别植物

    现在控制台简洁多了,而且也能正确显示置信度最高的识别结果了。

    4.7 实现车辆识别

    现在继续做车型识别。现在添加功能就比较简单了,只需修改apiUrl。
    这时遇到了一个问题,上传图片的大小错误。

    在这里插入图片描述

    图4.28 控制台信息

    为了方便调试,我将控制台信息输出添加了条件判断语句,如果发生错误就输出错误信息,没有错误就输出识别结果。首先测试了图片大小错误的情况,然后测试了正常的图片,控制台输出的信息如下:

    在这里插入图片描述

    图4.29 控制台信息

    这样调试就方便多了。现在来解决图片size的问题。以“车型识别”为例,其图片要求如下:

    在这里插入图片描述

    图4.30 图片要求

    我刚才上传的“image size error”的图片,其像素为1920px*1080px,符合文档中图片长宽的要求。原图大小为460KB,其编码为base64之后的大小为1.2MB,同样符合要求。这就奇怪了,因为这些参数都是符合文档要求的。
    之后我又进行了其他测试,换了一张1920px × 1080px的图片,不会报错。所以看起来图片不合适的原因应该是图片大小的问题。然而,当我继续测试使用2048px × 1335px,原图大小为1.5MB的图片时,竟然可以正常识别。所以这张图片报错的原因暂时没有搞清楚。
    先不管这里了,因为我测试了其他图片,都没有出现问题,只有这一张出现图片大小的问题。就先放一下吧。下面整理一下小程序,优化一下界面。

    在这里插入图片描述

    图4.31 界面展示

    上图是初始化界面,调整了“识别图片”按钮和图片之间的相对位置,同时添加了文本框显示提示信息。下面以“动物识别”为例,展示识别效果。可以看到,通过添加文本框,可以直观地显示识别结果,非常方便。

    在这里插入图片描述

    图4.32 识别结果

    下面就来编写一下样式文件吧。

    4.8 Taro样式测试

    • (1)Taro样式介绍

    样式文件我想尝试使用UI框架编写,经过对比多种UI框架,最终决定使用Taro UI作为我的UI框架使用。以下是Taro官网介绍:
    Taro 是由京东凹凸实验室打造的多端开发解决方案。现如今市面上端的形态多种多样,Web、ReactNative、微信小程序等各种端大行其道,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。使用 Taro,我们可以只书写一套代码,再通过 Taro 的编译工具,将源代码分别编译出可以在不同端(微信小程序、H5、RN等)运行的代码。
    下面就按照官网的教程,尝试在本地小程序中使用该框架进行练习。为了防止原有的小程序结构被破坏,首先新建一个小程序作为练习使用。
    Taro需要使用Node.js,要求版本在v8.x 或以上。但我之前安装的版本是v4.4.3,所以现在先重新安装新版本的Node.js。

    在这里插入图片描述

    图4.33 版本查看

    在这里插入图片描述

    图4.34 安装新版本NodeJs

    经过重新安装,现在已经升级到了最新的长期支持版本V12.13.1。

    在这里插入图片描述

    图4.35 检查新版本

    下面开始项目初始化安装。

    • (2)使用前的准备

    首先安装Taro脚手架工具,这里需要使用npm包管理工具进行安装。

    在这里插入图片描述

    图4.36 安装脚手架

    之后需要使用Yarn依赖管理工具安装相应的依赖,先来安装Yarn。对于Windows系统,可以下载官方提供的安装器进行安装。安装Taro完成后,可以使用命令安装相应的依赖。

    在这里插入图片描述

    图4.37 安装依赖
    • (3) 安装项目模板
      现在到小程序工程目录下,进行Taro模板的创建。这里注意,需要提前安装python2版本。

    在这里插入图片描述

    图4.38 安装模板

    现在模板安装完成了,可以进行模块引入了。

    • (4) 引入Taro模块
      下面进行taro模块的导入,需要使用npm本地编译taro模块。

    在这里插入图片描述

    图4.39 编译模块

    编译完成后,我发现taro工程的目录结构与微信小程序的工程结构不一样。而且taro的样式文件编写的格式也不是wxss格式,这就导致我还要学习一些其他的样式格式规则才能上手编写taro。为了尽快完成小程序,我转向了使用WeUI框架。

    4.9 WeUI样式测试

    • (1) WeUI介绍

    WeUI 是一套与微信原生 UI 一致的 UI 库,核心文件是 weui.css,只需要获取到该文件,然后在页面中引入,即可使用 WeUI 的组件。首先到其GitHub网站下载源代码,新建一个工程文件用来进行测试和修改。在微信开发者工具中打开该工程。

    在这里插入图片描述

    图4.40 工程目录

    此时模拟器中就可以查看到WeUI框架的各种组件样式。

    在这里插入图片描述

    图4.41 样式展示
    • (2) 样例编写

    下面来研究一下WeUI是怎样组织样式编写的。
    以Grid样式为例,先看一下他的效果。

    在这里插入图片描述

    图4.42 gird样式效果

    再看一下它的布局文件。

    在这里插入图片描述

    图4.43 布局文件

    可以看到,他是直接使用了WeUI提供的class,利用wx:for循环实现Grid组件的控制。而逻辑文件中给出了grids变量数组的数据,从0到8表示循环9次,显示9个Grid宫格。

    在这里插入图片描述

    图4.44 Grid逻辑文件

    现在尝试将该样式移植到我的小程序中。移植样式最关键的就是它的weui.wxss,按照教程,可以使用外联样式引入的方式将改样式文件引入到项目中。
    首先将style文件夹整体复制到我的工程目录中,然后在全局样式中导入weui的样式文件。

    在这里插入图片描述

    图4.45 导入样式

    之后创建一个新的页面用来测试样式内容,并将其页面作为默认显示的页面。

    在这里插入图片描述

    图4.46 创建新页面

    之后就可以分别在新创建的页面中编写grid布局和逻辑文件,内容与示例代码一样。这样效果就与示例代码相似了。
    官方例程中Grid的九个组件,是由组件组成的。组件用于实现页面之间的跳转,而我想要通过button组件实现用户选择不同类型图片的功能,所以需要使用button组件。下面再测试一下button组件的使用。
    首先是从官方历程中抽取出我们需要的组件。

    在这里插入图片描述

    图4.47 组件布局

    现在就需要移植一下样式文件了。在例程样式文件中找到”weui-btn”、”class”、”page__bd”、”page__bd__spacing”的文件内容,复制到本页面的样式文件中即可。最后实现的效果如下图所示。

    在这里插入图片描述

    图4.48 button效果

    下面尝试将原先的逻辑功能与样式结合起来。首先将样式文件复制到index.wxss文件中,然后将原先的button组件的样式改成测试时的样式。
    于是模拟器中的样式就改为如下图所示:

    在这里插入图片描述

    图4.49 按钮样式

    下面修改标题文本样式,将WeUI的标题文本样式移植到我的程序中。

    在这里插入图片描述

    图4.50 标题样式

    下面我想将这三个上传图片的按钮进行水平均匀排布,找到按钮样式相关的样式文件,修改后的样式如下图所示。

    在这里插入图片描述

    图4.51 按钮样式修改

    之后,我又修改了上传按钮和文字输出按钮的样式,添加了提示图片和提示信息。最终的样式如下图所示。

    在这里插入图片描述

    图4.52 最终样式

    5 关键问题

    针对完成大作业过程中遇到的问题,分析描述在此过程中的关键问题,如重点难点等。
    本次大作业“微信小程序的图片识别”程序实现过程中,重点问题是“图片上传”、“图片转码”、“API调用”以及“界面设计”。其中图片上传主要使用了微信小程序中的wx.chooseImage方法;图片转码使用wx.getFileSystemMangaer方法解决;API调用使用wx.request方法实现;界面设计使用了微信小程序的官方UI框架实现。

    6 使用说明

    提供微信小程序体验版的访问方式(小程序码)。

    在这里插入图片描述

    图6.1 小程序码

    下面给出完成的微信小程序的使用说明。使用体验版微信小程序,在自己的手机上进行测试。下面将测试过程及截图展示如下。

    (1)上传图片
    用户进入小程序后,首先需要通过相册或拍照,上传需要识别的图片。

    在这里插入图片描述

    图6.2 上传图片

    以“动物识别”为例,点击“上传动物图片”按钮,进行图片上传。

    (2)选择图片
    以从相册上传图片为例,点击从相册上传图片按钮,在相册中选择想要识别的图片。

    在这里插入图片描述

    图6.3 选择图片

    在这里插入图片描述

    图6.4 相册选择

    (3)识别图片
    上传图片完成后,点击小程序界面的“识别该图片”按钮,进行图片识别。经过短时间的等待,即可显示识别结果。

    (4)识别结果
    界面下方可以展示图片识别的结果。

    在这里插入图片描述

    图6.5 上传成功

    在这里插入图片描述

    图6.6 识别结果

    2021年6月11日更新

    今天发现有评论说QPS超过免费限额了,识别图片的时候会显示 open api qps request limit reached

    解决方法是开通计费功能。需要花钱啊,暂时不搞了。

    错误码参考文档:https://cloud.baidu.com/doc/IMAGERECOGNITION/s/Lk3bcxeoc

    展开全文
  • c#实现OCR图片文字识别,包含图片预处理提高识别率。支持简体繁体识别
  • 我把Vuforia AR的VideoPlayback-5-0-6.unitypackage的内容稍微改了下,去掉了界面说明,这样自己用着方便。另外,我没加App License Key。另外,我没加App License Key。
  • 图片识别之验证码识别

    千次阅读 2019-06-03 12:07:57
    以此探究图片识别的过程以及如何避免生成容易被识别的验证码。 理论 图片识别的过程 取样本 清洗区分样本 提取样本特征 提取目标的特征与样本进行对比 操作过程 Java有丰富的图片处理类...

    许多网站在进行某些操作前会要求输入验证码以此来抵御爬虫和攻击。此篇主要讲述如何通过代码来识别一些常见的验证码。以此探究图片识别的过程以及如何避免生成容易被识别的验证码。

    理论

    图片识别的过程

    1. 取样本

    2. 清洗区分样本

    3. 提取样本特征

    4. 提取目标的特征与样本进行对比

    操作过程

    Java有丰富的图片处理类,本次操作使用java语言。
    一、取目标网站的验证码样本。在web页面中查看验证码请求的地址。通过http请求批量获取验证码并保存在本地。
    在这里插入图片描述
    二、区分样本。对每张验证码图片进行人工识别区分,重命名为该图片的验证码。
    在这里插入图片描述
    三、清洗切割样本,提取样本特征。图片识别需要尽可能细地区分出特征点。我们观察上图的验证码图片可以发现多个信息:
    ● 验证码的背景存在着许多干扰线。

    ● 每个数字分明,所占的位置几乎是均等的。

    ● 验证码的数字颜色比较深,干扰因素颜色较浅。

    我们可以尝试通过颜色的深浅去除干扰因素。先通过灰度处理,将验证码中颜色较浅的点置换成白色,颜色较深的点置换成黑色。
    在这里插入图片描述
    通过改变灰度阈值grayValue不断尝试去除干扰点。最后得到干净的验证码。
    在这里插入图片描述
    接下来通过识别图片中的黑色点,使用下面的trainData()方法。

    沿着黑色点进行矩形切割,得到单个数字的特征样本。
    在这里插入图片描述
    在这里插入图片描述

    得到的验证码特征样本训练集合如下:
    在这里插入图片描述
    四、提取目标验证码的特征,与训练集合做对比,识别目标验证码图片

    通过上面的三步,我们已经得到了一组样本特征,接下来只需要把将目标验证码同样执行上面的3步。把提取出来的目标验证码特征与样本特征作对比。如果双方绝大部分像素点的颜色相同,则可认为目标验证码与样本内容一致。取样本的文件名,即可等到目标验证的内容了。以下为对比识别的代码。
    在这里插入图片描述

    总结

    通过上面的四部操作,我们已经能够识别出一些网站的验证码了。上面使用的方法是通过颜色的深浅,去除干扰素,再提取样本特征进行对比。面对其他的一些验证码需要我们通过观察掌握图片的规律,灵活地使用其他的算法来识别去除干扰素,提取出样本特征。

    同样地,在生成验证码的过程中,我们需要避免生成易于去除的干扰素。各个验证码之间在不影响人工识别的情况下尽可能粘连起来,避免被切割分类。

    在这里插入图片描述
    文章来自公众号:睿江云计算

    睿江云官网链接:https://www.eflycloud.com/home?from=RJ0024

    展开全文
  • 购买预付费包更加优惠 识别 小时语音不到 元 每月赠送免费额度最大程度降低客户成本 效果好 字准率 处于业界领先水平 与微信王者荣耀的语音转文字使用一套服务 效果一样好 语种多 已经支持中文普通话 英语粤语 韩语 ...

    o55g08d9dv.jpg广告关闭

    腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元!

    购买预付费包更加优惠 识别 小时语音不到 元 每月赠送免费额度最大程度降低客户成本 效果好 字准率 处于业界领先水平 与微信王者荣耀的语音转文字使用一套服务 效果一样好 语种多 已经支持中文普通话 英语粤语 韩语 日语和上海话方言的语音识别 后续将陆续开放其他语种和方言的识别能力算法强大 基于创新网络结构 ...

    支持将图片上的文字内容 智能识别为可编辑的文本 可应用于随手拍扫描纸质文档电子化 电商广告审核等多种场景 大幅提升信息处理效率 产品简介通用文字识别产品文档 腾讯云通用文字识别的特性 能力全面 支持中英文 日语 韩语西班牙语 法语 德语等多语言 以及阿拉伯数字及常用符号等的识别 并不断更新迭代模型...

    projectid是integer项目id,可以根据控制台-账号中心-项目管理中的配置填写,如无配置请填写默认项目id:0 3. 输出参数 参数名称类型描述 langstring识别出的语言种类,参考语言列表 zh :中文 en : 英文 jp : 日语 kr : 韩语 de : 德语 fr : 法语 es : 西班牙文 it :意大利文 tr : 土耳其文 ru : 俄文 pt : 葡萄牙文 ...

    本接口支持图像整体文字的检测和识别。 可以识别中文、英文、中英文、日语、韩语、西班牙语、法语、德语、葡萄牙语、越南语、马来语、俄语、意大利语、荷兰语、瑞典语、芬兰语、丹麦语、挪威语、匈牙利语、泰语,阿拉伯语20种语言,且各种语言均支持与英文混合的文字识别。 适用于印刷文档识别、网络图片识别、广告图...

    产品功能通用印刷体识别支持多场景、任意版面下整图文字的识别。 支持自动识别语言类型,同时支持自选语言种类(推荐),除中英文外,支持日语、韩语、西班牙语、法语、德语、葡萄牙语、越南语、马来语、俄语、意大利语、荷兰语、瑞典语、芬兰语、丹麦语、挪威语、匈牙利语、泰语等多种语言。 应用场景包括:印刷文档...

    接口是 http restful 形式,在使用该接口前,需要在语音识别控制台开通服务,并进入 api 密钥管理页面 新建密钥,生成 appid、secretid 和 secretkey,用于 api 调用时生成签名,签名将用来进行接口鉴权。 接口要求集成实时语音识别 api 时,需按照以下要求。 内容说明 支持语言中文普通话、英文、粤语、韩语、日语...

    在使用该接口前,需要在语音识别控制台开通服务,并进入 api 密钥管理页面 新建密钥,生成 appid、secretid 和 secretkey,用于 api 调用时生成签名,签名将用来进行接口鉴权。 2. 接口要求集成实时语音识别 api 时,需按照以下要求。 内容说明 语言种类中文普通话、英文、粤语、韩语、日语、上海话方言,可通过接口...

    本接口支持图像整体文字的检测和识别。 支持中文、英文、中英文、数字和特殊字符号的识别,并返回文字框位置和文字内容。 适用于快速文本识别场景...中文、英文、中英文、日语、韩语、西班牙语、法语、德语、葡萄牙语、越南语、马来语、俄语、意大利语、荷兰语、瑞典语、芬兰语、丹麦语、挪威语、匈牙利语...

    适用于文字较多、版式复杂、对识别准召率要求较高的场景,如试卷试题、网络图片、街景店招牌、法律卷宗等场景。 产品优势:与通用印刷体识别相比,提供更...中文、英文、中英文、日语、韩语、西班牙语、法语、德语、葡萄牙语、越南语、马来语、俄语、意大利语、荷兰语、瑞典语、芬兰语、丹麦语、挪威语、匈牙利语...

    g10fzdy4qa.png

    允中 发自 凹非寺 量子位 编辑 | 公众号 qbitai4月29日,腾讯云正式发布金融、音视频等多个领域专属语音识别模型。 最新发布的模型不仅识别准确率得到大幅提升,同时也增加了对粤语、韩语的支持,后面会陆续开放对上海话等方言以及日语、泰语、印尼语等国外语言的支持。 正式发布金融行业专属模型,字准率业界领先据...

    采用 multitask 训练方法,结合ts方式,在通用以及垂直领域有业内领先的识别精度。 支持多平台设备提供 rest api 和 sdk,支持智能硬件、移动应用、网站、桌面客户端和物联网等多种设备终端。 支持语种丰富现阶段已经支持中文普通话、英语、粤语和韩语语音识别,后续将陆续开放其他语种或方言的识别能力。 噪声环境...

    支持语种丰富现阶段支持中文普通话、英语、粤语和韩语语音识别,后续将陆续开放其他语种或方言的识别能力。 噪声环境识别佳语音识别模型鲁棒性佳,识别精度高,抗噪声的干扰能力强,能够识别来自嘈杂环境的音频信息,不需要客户进行降噪处理。 海量内外部业务验证经过微信、腾讯视频、王者荣耀等内部业务充分验证...

    q2:静音状态会不会收费呢? 接口要求集成实时语音识别 api 时,需按照以下要求。 内容说明支持语言中文普通话、英文、粤语、韩语支持行业通用、金融音频属性采样率:16000hz或8000hz、采样精度:16bits、声道:单声道音频格式wav、pcm、opus、speex、silk、mp3数据长度音频流中每个数据包的音频分片建议为200ms,8k...

    uw1hb7pjna.png

    【荐】通用印刷体识别【荐】通用印刷体识别(高精度版)通用印刷体识别(精简版)适用场景适用于所有通用场景的印刷体识别适用于文字较多、长串数字、小字、模糊字、倾斜文本等困难场景适用于快速文本识别场景,准召率有一定损失,价格更优惠识别准确率96%99%91%价格中高低支持的语言中文、英文、中英文、日语、韩语...

    接口描述本接口服务对实时音频流进行识别,同步返回识别结果,达到“边说边输出文字”的效果。 支持中文普通话、英语、粤语、韩语、日语和上海话方言的识别支持金融领域模型支持vad(语音活动检测)功能支持识别结果同步返回或尾包返回 接口说明请观看视频:接口要求使用实时语音识别 sdk 时,需按照以下要求...

    支持远场和离线的语音识别吗? 录音文件识别、一句话识别和实时语音识别暂时不支持远场和离线的语音识别。 语音识别支持中英文混合场景和地方方言吗? 普通话引擎仅支持单词级别的中英文混合识别; 实时语音识别支持中文普通话、英文、粤语、韩语、日语和上海话方言的识别; 一句话识别和录音文件识别支持中文普通话...

    通用印刷体识别支持识别哪些语言? 通用印刷体识别目前支持中文简体、繁体和英语、日语、韩语、西班牙语、法语、德语、葡萄牙语、越南语、马来语、俄语、意大利语、荷兰语、瑞典语、芬兰语、丹麦语、挪威语、匈牙利语、泰语等多种语言。 文字识别返回的文字类型和存储方式是什么? 识别出来后返回的是 json 字符串...

    kq5lmghdz3.jpeg

    在线cms识别|旁站|c段|信息泄露|工控|系统|物联网安全|cms漏洞扫描|端口扫描|待完善.. onlinetools 微语:这是一个朋友弄的东西,征求对方同意的情况下排版了下,发了出来,有些许bug,大牛可以的话,来完善完善。 这是一款线上工具箱,收集整理了一些渗透测试过程中常见的需求。 现在已经包含的功能有:在线cms识别...

    朝鲜的另一知名机构智能技术学院,也被报道过韩语语音文字识别应用。? 朝鲜自研的智能音响可将英语,中文和德语材料,从 30 种自然和社会科学(包括数学,物理学,化学,经济学和历史)翻译成韩语,完全可以媲美专业领域的翻译。 而且报道中称,这些程序已被投入使用,被用于调查和分析来自其他国家的文献数据...

    k7oyh6j19o.jpeg

    朝鲜的另一知名机构智能技术学院,也被报道过韩语语音文字识别应用。? 朝鲜自研的智能音响可将英语,中文和德语材料,从 30 种自然和社会科学(包括数学,物理学,化学,经济学和历史)翻译成韩语,完全可以媲美专业领域的翻译。 而且报道中称,这些程序已被投入使用,被用于调查和分析来自其他国家的文献数据...

    展开全文
  • Android图片识别

    万次阅读 多人点赞 2017-03-02 17:38:27
    本来想利用OpenCV的工具实现手机上的图片识别,但随着对OpenCV内容的探索,严格地说,我认为所谓的“识别”,只不过是图片的“匹配”而已。 因为计算机在图片的相似度比较上太笨了,不像人眼一看就能判断,它需要...

    本来想利用OpenCV的工具实现手机上的图片识别,但随着对OpenCV内容的探索,严格地说,我认为所谓的“识别”,只不过是图片的“匹配”而已。

    因为计算机在图片的相似度比较上太笨了,不像人眼一看就能判断,它需要依赖大量计算的算法方可“匹配”出相似点。而且!根据相似点匹配,从而判断两张图片的内容是否一样,还需要很大的人为主观干涉。

    目前研究了一下OpenCV关于图片特征匹配的基本内容,基本上实现的原理大致相同,不同的是算法在计算机上的性能表现。

    要理解原理的话,可以去搜索“sift算法”,可以找到一篇小姐姐写的博客,该博客内容介绍了sift算法的原理和图像的匹配过程,详细得感人,需要掌握一定的高数和线性代数才能看得懂。数学不好的话,实际上也能大概看明白整个过程是怎么样的。

    类似与sift算法的图像匹配,在计算机上实现的过程基本是: 加载图片-->找关键点-->计算关键点特征-->匹配关键点特征-->判断或者画线展示(非必须)

    其中匹配关键点是需要插入一些人为主观判断的,最后一步只是展示用,所以不一定需要。


    好吧,扯了那么多,说是图片识别,连张图片都没有,没图说个j八~~好,先放一张原始的测试图:



    有人会怀疑,Android用java开发,用java来做图片处理会不会很慢?其实,这里的java部分只是负责接口而已,实际上还是调用了native层的C/C++代码进行处理的,这个在上一篇关于OpenCV在Android Studio上的搭建博客里已经知道了,ctrl+右键去看源码,会发现最终到native修饰的函数就探索不下去了。


    Go now~

    1. 加载图片。

    低版本加载图片是用Highgui这个类加载的,但高版本的opencv sdk里把读取图片的加载接口移到了Imgcodecs类去了。

    Mat src=Imgcodecs.imread(imgPath);
    其中参数imgPath为String类型,即图片的路径。

    又或者使用Utils类加载图片

    Mat src=Utils.loadResource(context, resId);
    其中参数为Context,和图片id,如R.drawable.xxx。


    Mat类是英文Matrix的缩写,即数学上的矩阵,用于保存图片。图片的在计算机上的处理,基本上也是矩阵的数值作各种变换处理。大学里的线性代数真的要学好呐~


    2. 找关键点。

    找关键点的算法有很多,如 fast,  orb,  mser,  gftt,  harris,  simpleblob,  brisk,  akaze, sift 和 surf等

    MatOfKeyPoint keyPoint=new MatOfKeyPoint();
    FeatureDetector fd=FeatureDetector.create(FeatureDetector.BRISK);
    fd.detect(src, keyPoint);
    因为sift和surf算法有专利,所以opencv官方并没有集成,所以使用sift算法会报错。github上已有三方集成了。

    每个算法找关键点不一样,导致在计算机上的性能也会不一样,最直接的表现就是时间。

    fast算法,risk算法,orb算法  效果比较:

    左,fast算法找了许多关键点,用时仅仅4ms;

    中,brisk算法的关键点不多,但却用时1944ms;(这个算法真的很久,我也不知道为啥)

    右,orb算法关键点比brisk稍微多一点,用时12ms。(测试机cpu很渣~)

    至于其他的算法我就不一一去比较了,基本上就是时间和精度的矛盾和取舍了,用时间换精度,or用精度换时间。


    虽然感觉性能fast貌似比brisk要好,但我觉得brisk找的关键点质量比较好,而fast只是简单地找了一些边缘点而已。

    而且!并不是说关键点越多越好,因为会影响后面的计算速度,越多,自然而然下一步的特征计算量就越大。


    3. 关键点的特征计算。

    单单靠关键点是没法匹配两张图片的,所以我们还需要计算出关键点的特征,才能进行比较。

    Mat description=new Mat();
    DescriptorExtractor de=DescriptorExtractor.create(DescriptorExtractor.ORB);
    de.compute(src, keyPoint, description);
    关键函数compute(),计算其关键点的特征,参数src为原图Mat,keyPoint为上一步计算src关键点的MatOfKeypoit, 当然计算出来的description也是一个Mat,可见基本图形处理都是基于矩阵Matrix的运算。

    这里的话,opencv提供的算法也有几种:orb, brisk, brief, akaze, freak, surf, sift等

    其中的surf和sift也是不能使用的。

    耗时:

    brisk:1877ms(仍表示怀疑,难到跟手机有关?),  orb:16ms。

    注意:找关键点和计算特征的算法不能随便乱配,会有报错的情况,测试下面几种情况没问题:都是brisk,都是orb,或者fast配brisk,fast配orb,这个这里就不一一测试了。


    4. 匹配特征。

    匹配主要有两个类一个BFMatcher,一个FlannBasedMatcher,均继承DescriptorMatcher。

    BFMatcher,即Brute Force,暴力,尽可能多地匹配符合的特征点;

    FlannBasedMatcher,基于flann算法,这个就不扯了,我也不太懂。

    但实际使用过程,试过用flannbasedmatcher会报错,大概是跟Mat容器的数据类型有关。搜索一下区别,发现两者对Mat容器的数据类型是有要求的,这里就不多扯了,有时间的话可以慢慢探索,这里就先用着BFMatcher。

    List<MatOfDMatch> matches=new ArrayList<>();
    DescriptorMatcher matcher=DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
    matcher.radiusMatch(descriptionA, descriptionB, matches, 30f);

    或者直接用子类

    List<MatOfDMatch> matches=new ArrayList<>();
    BFMatcher matcher=BFMatcher.create();
    matcher.radiusMatch(descriptionA, descriptionB, matches, 30f);
    对于radiusMatch()这个函数,前两个参数分别是图片A和图片B经过上面几步算出来的关键点特征,均是Mat类型,而第三个参数matches是一个List<MatOfDMatch>类型,即存储了n个MatOFDMatch (n个元素里包含1*1矩阵,即匹配成功;和0*0空矩阵,即匹配不成功) 的列表,也就是输出,第四个参数float,指的是MatOfDMatch中的DMatch元素的属性distance不能超过这个最大“距离”,说简单点,就是超过这个“距离”就不要,也即是过滤器。

    断点Debug下matches列表的元素:


    MatOfDMatch实际上是一个1*1的矩阵,调用toArray()[0],可以直接获得对象DMatch,该对象存储了两个关键点特征的匹配信息,里面有一个很重要的属性distance.

    距离属性:DMatch类的属性distance,该distance比不是指物理上的距离,而是指欧氏距离,但处于2维或者3维的时候,你还可以用物理空间或者勾股定理来理解,但超过了3维,那维数就不是能用物理空间来表示的了,更多的是指两个物体之间的相似度,值越小,表示越相似。

    举个栗子:好比如小姐姐写的图文并茂的博客里,对于sift算法,计算特征值的时候,会取一个半径范围内的所有采样点的关于颜色变化梯度的向量相加,得到8个方向的特征向量,那么这8个特征向量就可以当做8维,也就是说这个关键点有8维。(我随便说说的,便于理解~)

    回到正题,除了matcher.radiusMach()接口外,还有一个matcher.knnMatch()该接口基于knn算法,没有radiusMatch那样的过滤器,所以有很多不准确的点都被当做是匹配对了。

    匹配同一张图,然后对radiusMatch()和knnMatch()做个比较:

    radius: 连线都平行


    knn:  连线不完全平行


    可以看到,radius有过滤器,可以把一些distance较大的配对点滤掉,即那些不平行的连线的匹配点。

    上面是两张相同的照片匹配结果,在所有的匹配点List<MatOfDmatch>里,其distance基本都是0。

    网上有C++的实现方法,基本都是knnMatch后,再根据匹配点的distance进行一次过滤,去掉不太符合的匹配点,基本和radiusMatch类似。


    5. 判断或连线(非必须)

    画图可以方便展示,调用Feature2d接口即可,除了连线,也可以标注关键点。

    Mat dst=new Mat();
    Features2d.drawMatches2(srcA, keyPointA, srcB, keyPointB, matches, dst);
    Bitmap bitmap=Bitmap.createBitmap(dst.cols(), dst.rows(), Bitmap.Config.ARGB_4444);
    Utils.matToBitmap(dst, bitmap);
    ivTest.setImageBitmap(bitmap);
    基本就是创建一个输出用的容器Mat,然后drawMatches,接着创建Bitmap,尺寸要和输出Mat的尺寸对应,即width==cols,height==rows,最后将Mat转Bitmap,输出到ImageView上。


    再贴出几个对比图:


    拉伸,distance范围2.236068--870.503906, 限制max distance=500:


    拉伸,distance范围2.236068--870.503906, 限制max distance=200:


    旋转,distance范围9.797959--885.404418, 限制max distance=200:


    拉伸并旋转,distance范围29.966648--819.875610, 限制max distance=200:


    截取部分,distance范围0.0--1052.601562,限制max distance=200:



    从上面几个例子可以看到,匹配特征点有一个范围,表示所有匹配点从准确到粗糙的一个范围,匹配率=1*1矩阵数 / (1*1矩阵数+0*0矩阵数)*100%。

    然而,影响匹配率最大的因素,就是radiusMatch()接口中的第四个参数,maxDistance,即匹配特征相似度的一个阀值。

    如果该阀值太高,那么会匹配到许多不符合的关键点;如果太低,虽然精度变高,但匹配率也会很低,对于一些变化比较大的图片,但内容一样,却有可能识别不出来。

    因此,该阀值的选取,最终还是取决于你个人对识别的精度要求。

    那么,你觉得匹配率多大才算是同一张图片呢?3个关键点,有2个匹配上了,难道你就敢说是同一张图片了?匹配率只有百分之几,难道你敢说不是同一张?


    于是,就回到了刚开始说的,对于图片识别,实际上还是插入了很大的人为主观干涉进去。

    计算机处理图片速度很快,但却很笨~


    下面贴出完整代码:

    public class MainActivity extends AppCompatActivity {
    
        private Button btnTest;
        private ImageView ivTest;
    
        static{
            if(!OpenCVLoader.initDebug()){
                Log.d("zz", "init failed");
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ivTest=(ImageView)findViewById(R.id.iv_test);
    
            btnTest=(Button)findViewById(R.id.btn_test);
            btnTest.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String imgA="/sdcard/a.jpg";
                    String imgB="/sdcard/d.jpg";
                    if(match(imgA, imgB)){
                        Toast.makeText(MainActivity.this, "Match succeed", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
        }
    
        private boolean match(String imgPath1, String imgPath2){
    
            //加载图片
            File a=new File(imgPath1);
            File b=new File(imgPath2);
            if(!a.exists() || !b.exists()) return false;
            Mat srcA=Imgcodecs.imread(imgPath1);
            Mat srcB=Imgcodecs.imread(imgPath2);
    
            //寻找关键点
            FeatureDetector fd=FeatureDetector.create(FeatureDetector.ORB);
            MatOfKeyPoint keyPointA=new MatOfKeyPoint();
            MatOfKeyPoint keyPointB=new MatOfKeyPoint();
            fd.detect(srcA, keyPointA);
            fd.detect(srcB, keyPointB);
    
            //计算关键点的特征
            DescriptorExtractor de=DescriptorExtractor.create(DescriptorExtractor.ORB);
            Mat descriptionA=new Mat();
            Mat descriptionB=new Mat();
            de.compute(srcA, keyPointA, descriptionA);
            de.compute(srcB, keyPointB, descriptionB);
    
            //匹配两张图片关键点的特征
            List<MatOfDMatch> matches=new ArrayList<>();
            DescriptorMatcher matcher=DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
            matcher.radiusMatch(descriptionA, descriptionB, matches, 200f);
    
            //画图显示匹配结果(演示用,非必须,可注释)
            Mat dst=new Mat();
            Features2d.drawMatches2(srcA, keyPointA, srcB, keyPointB, matches, dst);
            Bitmap bitmap=Bitmap.createBitmap(dst.cols(), dst.rows(), Bitmap.Config.ARGB_4444);
            Utils.matToBitmap(dst, bitmap);
            ivTest.setImageBitmap(bitmap);
    
            //根据匹配率判断是否匹配(以下处理不科学,无视掉)
            int total=Math.min(keyPointA.rows(), keyPointB.rows());
            int matchedNum=0;
            for(MatOfDMatch match : matches){
                if(match.rows()!=0) matchedNum++;
            }
            float ratio=matchedNum*1.0f/total;
            if(ratio>0.75f) return true;
    
            return false;
        }
    }


    布局文件很简单,就一个button和一个imageview,不贴了。

    因为读图片是从sdcard读的,需要加权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    不由惊叹人类视觉神经处理的伟大和奇妙~















    展开全文
  • 网络的最终目标是,输入一张手写数字图片后,网络输出该图片对应的数字。由于网络需要从0到9一共十个数字中挑选出一个,于是我们的网络最终输出层应该有十个节点,每个节点对应一个数字。假设图片对应的是数字0,...
  • Android 图片识别、图像识别

    千次阅读 2019-11-25 18:04:34
    基于百度智能云实现的图片识别 实现步骤 1、到百度智能云注册图像识别应用 https://console.bce.baidu.com/ai/?_=1574674029784&fromai=1#/ai/imagerecognition/overview/index 2、配置ID与key 3、...
  • 人工智能 图片识别 图像识别

    万次阅读 2018-02-26 18:38:02
    一般工业使用中,采用工业相机拍摄图片,然后再利用软件根据图片灰阶差做进一步识别处理。另外在地理学中指将遥感图像进行分类的技术。图像识别是人工智能的一个重要领域。为了编制模拟人类图像识别活动的计算机程序...
  • 按键精灵插件 可以对图片里的验证码直接识别,不用打开图片或者截屏,字库可以直接使用大漠插件的字库,字库制作工具已经打包.请下载!
  • 编程:Python实现图片识别

    万次阅读 多人点赞 2019-04-22 15:01:28
    OCR技术是光学字符识别的缩写(Optical Character Recognition),是通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算机输入...
  • 上一篇我们将javaAipImageClassify 继承了文档提供的一个操作类,并且设置基本的 什么超时时间,socek超时时间什么的.接下来我们看看文档上说到的几种图片识别功能...
  • 近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片试别程序,完成了两个技术方案的选择,一是tesseract+python flask的方案实现,二是tesseract+spring web的技术解决方案,并简作论述,...
  • Node图片识别文字

    万次阅读 2019-05-21 16:36:25
    百度云地址 ... 2,创建应用 3,下载Node的sdk,然后解压,把src文件夹复制到你的node工程目录 完整代码 ...//===================================== 百度AI-Start =====================================// ...
  • 这个过程有点多,一步一步来。 一、文字识别 本人采用的是腾讯的云识别技术,所以先在腾讯完成一系列的注册、申请...一张图片: 实现后的效果: 三、预安装相应的包 首先,要安装腾讯的组件包:tencentcloud-.
  • 在实验登录的步骤时碰到了识别验证码的问题,于是在网上查找了关于Java如何进行图片识别验证码,由于根据网上查找的相关文章都不适合我的配置,所以特开此博客进行记录一下采坑的过程以及解决方法。 做图像识别,...
  • ARFoundation丨(八)图片识别

    千次阅读 2020-05-30 19:54:57
    大家好,我是SKODE。 小提示:选中左侧目录,可快速找到所需内容 本系列博客地址:传送门 一、效果展示 B站地址:传送门 ARFoundation丨图片识别 一起成长, 我是SKODE
  • C#从图片识别文字

    2017-09-01 16:21:54
    可以用图片识别出来文字 写的一个Demo程序,主要是提供参考抛砖迎玉 不喜勿喷,顺便拿点辛苦资源分 源代码需要安装 环境,自己看代码研究,无错误
  • Android Zxing相册二维码/条码图片识别在网上搜了好多例子放到项目中都会有些问题,有的是只能识别二维码图片无法识别条码图片,有的是可以识别条码但是识别率特别低。下面就介绍我整理过后在项目中使用的相册图片...
  • 自学Python3第5天,今天突发奇想,想用Python识别图片里的文字。没想到Python实现图片文字识别这么简单,只需要一行代码就能搞定#作者微信:2501902696 from PIL import Image import pytesseract #上面都是导包,只...
  • 一、实现摄像头实时识别 import cv2 import time cap = cv2.VideoCapture(0) # 调用第一个摄像头 cv2.namedWindow('v') # 人脸特征分类器 face_cascade = cv2.CascadeClassifier('C:/ProgramData/Anaconda3/Lib/...
  • 公式图片识别转换工具

    千次阅读 2020-05-23 21:44:54
    常用的在线公式生成器很多 ...而Mathpix Snipping Tool可以将公式图片生成各种的文本形式真的好用 下载地址: https://mathpix.com/ 软件运行结果如下: 识别结果可以输出多种形式 ...
  • 推荐几个昨晚找的几个不错的基于 Java 图片识别处理系统给小伙伴们。 中药图片拍照识别系统 项目地址:https://gitee.com/xiaohaoo/chinese-medicine-identification-admin 项目简介 主要用来对拍摄的中药图片进行...
  • 前段时间接到一个棘手的难题(识别图片文字,将图片文件名改成该文字) 因为不解决就得手动挨个挨个输入然后把文件命名好 今天又一个文件需求是这样的 图上有姓名文字,要识别出来改成每一张图跟这个一样,有的人...
  • 微信自动回复+图片识别

    千次阅读 2018-08-23 18:00:43
    本文将利用itchat和图灵机器人(可以不用图灵机器人,不过只能识别图片,不能聊天太枯燥了吧ˇ▽ˇ)搭建私人微信账号,完成私号的消息自动回复以及图片识别。 1、先修知识: aws+Anaconda+ tensorflow + keras +....
  • 这篇博客主要介绍的是百度AI开放平台的OCR识别,包括文字识别和车型识别,个人感受是功能强大,但也还有提升的空间。 语言环境:Python3.7 编译工具:Spyder 相关接口和秘钥申请 首先上两个接口的地址: 文字识别...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 390,338
精华内容 156,135
关键字:

图片识别