使用python kivy+opencv实现手写数字识别的安卓app。
app下载:
https://pan.baidu.com/s/1l1iqMYmZeHuq-c_mg15F0Q
提取码:lvev

如有问题,欢迎下方评论!

kivy安卓app实现数字识别

代码部分:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics.texture import Texture
from kivy.uix.camera import Camera
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.clock import Clock
from kivy.graphics import Color,Rectangle
import numpy as np
import cv2
from android.permissions import request_permissions, Permissionrequest_permissions([Permission.CAMERA,Permission.WRITE_EXTERNAL_STORAGE,Permission.READ_EXTERNAL_STORAGE
])net = cv2.dnn.readNetFromTensorflow('model.pb')
def detect(src,net):try:src_copy=src.copy()gray=cv2.cvtColor(src,cv2.COLOR_RGB2GRAY)# thred=np.where(gray>140,255,0).astype('uint8')_,thred=cv2.threshold(gray,100,255,cv2.THRESH_BINARY_INV)# thred=255-thred#开闭运算k = np.ones((5, 5), np.uint8)#thred=cv.dilate(thred,k)thred = cv2.morphologyEx(thred, cv2.MORPH_CLOSE, k)thred=cv2.dilate(thred,k)# cv2.imshow('a123', thred)# cv2.waitKey(0)cnts=cv2.findContours(thred,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]# print('轮廓数=',len(cnts))if len(cnts)>100:return src_copy,thrednam=[]for i in cnts:area = cv2.contourArea(i)if area<50:continue# if aa!=1:#     b=20# else:b=15# print('面积=',area)b=50if area>=b:x, y, w, h = cv2.boundingRect(i)x2=x-10y2=y-10w2=w+20h2=h+20cv2.rectangle(src_copy,(x2,y2),(x2+w2,y2+h2),(0,255,0),2)lkuo=thred[y:y+h,x:x+w]da = max(h, w)rate = da / 40ro = cv2.resize(lkuo, (int(w / rate), int(h / rate)))h, w = ro.shapet, b = int((43 - h) / 2), 43 - h - int((43 - h) / 2)l, r = int((43 - w) / 2), 43 - w - int((43 - w) / 2)ro = cv2.copyMakeBorder(ro, t, b, l, r, cv2.BORDER_CONSTANT, value=0)ro = cv2.resize(ro, (40, 40))ro = np.where(ro > 0, 255, 0).astype('float32')# cv.imshow('a123', ro)# cv.waitKey(0)ro = ro / 255# ro=np.reshape(ro,(1,40,40,1))blob=ro.reshape((1,1,40,40))net.setInput(blob)out=net.forward()#图上标出数字number=np.argmax(out,axis=-1)nam.append((number[0],x2, y2-5,h/40))#cv.putText(src_copy, str(number[0]), (x2, y2-5), cv.FONT_HERSHEY_SIMPLEX, h/40, (0, 0, 255), 2)#print('opencv预测结果:',np.argmax(out,axis=-1),'tensorflow预测结果:',np.argmax(out2,axis=-1))if len(nam)==0:return src_copy,thredfor ii in nam:cv2.putText(src_copy, str(ii[0]), (ii[1], ii[2]), cv2.FONT_HERSHEY_SIMPLEX, ii[3], (0, 0, 255), 2)return src_copy,thredexcept:return src,srcclass MyLayout(BoxLayout):def __init__(self):super(MyLayout, self).__init__()self.orientation='vertical'self.image1 = Image()self.image1.color=1,1,1,0self.image1.allow_stretch=Trueself.btn=Button(text='OPEN CAMERA')with self.canvas:Color(1,1,1,1)self.rect=Rectangle(pos=self.pos,size=self.size,source='11.jpg')self.bind(pos=self.update,size=self.update)self.padding=[0,0,0,10]self.spacing=10self.btn.size_hint=.3,.06self.btn.pos_hint={'center_x':0.5,'center_y':.5}self.btn.background_color=1,1,1,.8# self.btn.size_hint_y=.1# self.btn.size_hint_x=.2self.btn.bind(on_press=self.press_btn)self.camera = Camera(resolution=(640, 480))self.camera.play=Falseself.add_widget(self.image1)self.add_widget(self.btn)Clock.schedule_interval(self.pr, 0)def update(self,*args):self.rect.pos=self.posself.rect.size=self.sizedef press_btn(self,arg):self.camera.play=not self.camera.playif self.camera.play:self.image1.color=1,1,1,1self.btn.text='CLOSE CAMERA'else:self.image1.color = 1, 1, 1, 0self.btn.text = 'OPEN CAMERA'def pr(self, nap):if self.camera.texture==None:returnimg_rgb=self.texture_to_numpy(self.camera.texture)[:,:,:3]img_rgb_90=np.rot90(img_rgb,-1)img_rgb_zy=img_rgb_90[:,::-1,:]out,_=detect(img_rgb_zy,net)#cv2.putText(img_rgba_copy, str(self.counter), (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)#texture1=self.numpy_to_texture(out)self.image1.texture=texture1# 将Texture格式的图片对象转换为numpydef texture_to_numpy(self, data):image = np.asarray(bytearray(data.pixels), dtype='uint8').reshape((data.height, data.width, 4))# r_chanel = np.copy(image[:, :, 0])# g_chanel = np.copy(image[:, :, 1])# b_chanel = np.copy(image[:, :, 2])# image[:, :, 0] = b_chanel# image[:, :, 1] = g_chanel# image[:, :, 2] = r_chanel#返回rgba图像return image# 将numpy格式图片对象转为Texturedef numpy_to_texture(self, frame):# frame=cv2.imread("ddd.jpg")buf1 = cv2.flip(frame, 0)buf = buf1.tostring()image_texture = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='rgb')image_texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')return image_textureclass MyApp(App):def build(self):return MyLayout()if __name__ == '__main__':MyApp().run()

kivy手写数字识别app相关推荐

  1. python手写多个字母识别_一个带界面的CNN手写数字识别,使用Python(tensorflow, kivy)实现...

    CNN_Handwritten_Digit_Recognizer (CNN手写数字识别) A CNN handwritten digit recognizer with graphical UI, i ...

  2. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

  3. 将tensorflow训练好的模型移植到Android (MNIST手写数字识别)

    将tensorflow训练好的模型移植到Android (MNIST手写数字识别) [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/det ...

  4. 持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型

    持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: Tens ...

  5. Tensorflow 神经网络作业手写数字识别 训练、回测准确率

    大白话讲解卷积神经网络工作原理,推荐一个bilibili的讲卷积神经网络的视频,up主从youtube搬运过来,用中文讲了一遍. 这篇文章是 TensorFlow 2.0 Tutorial 入门教程的 ...

  6. TensorFlow 2.0 mnist手写数字识别(CNN卷积神经网络)

    TensorFlow 2.0 (五) - mnist手写数字识别(CNN卷积神经网络) 源代码/数据集已上传到 Github - tensorflow-tutorial-samples 大白话讲解卷积 ...

  7. 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)

    一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...

  8. 手写数字识别的小优化

    在用KNN实现手写数字识别的时候突发奇想是否可以根据数字的特点对其进行一个分类,以此来提高判断的准确率.经过许多天的改进与完善终于实现了此算法,就称其为洞拐法吧.(第一次写,有许多不足之处,还望多多包 ...

  9. 单层神经网络实现手写数字识别

    Mnist手写数字识别 前言 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分: 55000行的训练数据集(mn ...

最新文章

  1. 深度解析MegEngine亚线性显存优化技术
  2. hadoop nn 运维一例
  3. 从无盘启动看 Linux 启动原理
  4. Check Point CEO:“我们正在积极寻找收购目标”
  5. sort,uniq命令
  6. 【报告分享】2021开放数字资产价值报告:数字化孕育新的发展动能.pdf(附下载链接)...
  7. Flutter代码锦囊---摇一摇
  8. LDMS 8.8 简明使用手册之客户端配置及部署
  9. NCC项目搭建及版本管理规范手册
  10. 自定义 View 实现汉字笔顺动画
  11. python3-曲线拟合(polyfit/polyval)
  12. android 浮窗示例代码,Android 浮窗开发之窗口层级(示例代码)
  13. 如何让笔记本电脑更省电
  14. 2021 第十二届蓝桥杯 Java 省赛 B 组(第一场)真题解析
  15. 硬件电路之高压爬电距离
  16. android Toast
  17. 谈谈在我在外包公司工作的经历,悲催的我,还失去了我心爱的猴子
  18. 网页图片无缝循环滚动html代码
  19. 智能驾驶领域专业术语
  20. x264中的 x264_param_default函数欣赏

热门文章

  1. web前端面试高频考点——JavaScript 篇(一)【JS的三座大山 】 原型和原型链、作用域和闭包、异步
  2. 查看已连接的无线网密码(windows)
  3. Python小白入门- 101 ( 工具篇) Python完成身份证号码校验的算法
  4. 简述:http 和 https 有什么区别?为什么有很多网站还在使用 http 呢?
  5. python迭代器和for循环区别_python迭代器和for循环区别
  6. vue 组件传值的常用5种方法
  7. 什么是负载均衡,为什么要做负载均衡?
  8. 重磅来袭!java绝对值表示
  9. 虚拟机内部错误如何解决·?
  10. 名编辑电子杂志大师教程 | 如何生成不同格式的电子杂志?