【正点原子STM32连载】 第五十八章 手写识别实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

news2024/11/14 20:16:42

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

第五十八章 手写识别实验

本章将介绍正点原子提供的手写识别库的使用,通过使用手写识别库可以实现一些简单的数字字母手写识别的应用。通过本章的学习,读者将学习到正点原子手写识别库的使用。
本章分为如下几个小节:
58.1 硬件设计
58.2 程序设计
58.3 下载验证

58.1 硬件设计
58.1.1 例程功能

  1. 程序运行后,在LCD提示的手写区框中触摸绘制数字或大小写英文字母,绘制结束后,LCD上会显示识别结果
  2. 按下KEY0或KEY_UP按键,可分别进行切换识别模式或进行触摸校准的操作
  3. LED0闪烁,指示程序正在运行
    58.1.2 硬件资源
  4. LED
    LED0 - PF9
  5. 按键
    KEY0 - PE4
    KEY_UP - PA0
  6. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  7. TFTLCD模块上的触摸屏(电阻式、电容式)
  8. SD卡(SDIO驱动)
  9. NOR Flash(SPI驱动)
    58.1.3 原理图
    本章实验使用的手写识别库为软件库,因此没有对应的连接原理图。
    58.2 程序设计
    58.2.1 手写识别库的使用
    正点原子提供的手写识别库包含四个文件,分别为:ATKNCR_M_Vx.x.lib、ATKNCR_N_Vx.x.lib、atk_ncr.x和atk_ncr.h,本章实验配套的实验例程中已经提供了这四个文件,并且针对正点原子APM32F407最小系统板进行了移植适配,在使用时,仅需将atk_ncr.c和atk_ncr.h这两个文件添加到自己的工程中,并根据是否使用内存管理动态管理手写识别库运行时所需的内存,添加ATKNCR_M_Vx.x.lib(使用内存管理)或ATKNCR_N_Vx.x.lib(不使用内存管理)即可,如下图所示:
    在这里插入图片描述

图58.2.1.1 正点原子手写识别库文件
手写识别库中提供了手写识别初始化、识别和停止等函数,使用非常方便。
在进行手写识别前,需要使用手写识别初始化函数对其进行初始化,手写识别初始化的使用示例,如下所示:

#include "apm32f4xx.h"
#include "./ATKNCR/atk_ncr.h"

void example_fun(void)
{
    /* 初始化手写识别 */
    alientek_ncr_init();
}
手写识别初始化后,便可开始进行手写识别,手写识别函数的使用示例,如下所示:
#include "apm32f4xx.h"
#include "./ATKNCR/atk_ncr.h"

void example_fun(void)
{
    /* 定义点阵数据缓存 */
    atk_ncr_point input_buf[200];
    int input_cnt;
    char output_buf[2];
    
    /* 初始化手写识别 */
    alientek_ncr_init();
    
    /* 从触摸屏或其他方式获取输入的点阵数据 */
    input_cnt = get_data(input_buf);
    
    /* 进行手写识别 */
    alientek_ncr(input_buf, cnt, 1, 1, output_buf);
    
    /* 处理识别结果 */
    /* printf("Detect result: %s\r\n", output_buf); */
}

在进行手写识别后,若不再需要进行手写识别,可以调用结束手写识别函数,结束手写识别,该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "./ATKNCR/atk_ncr.h"

void example_fun(void)
{
    /* 定义点阵数据缓存 */
    atk_ncr_point input_buf[200];
    int input_cnt;
    char output_buf[2];
    
    /* 初始化手写识别 */
    alientek_ncr_init();
    
    /* 从触摸屏或其他方式获取输入的点阵数据 */
    input_cnt = get_data(input_buf);
    
    /* 进行手写识别 */
    alientek_ncr(input_buf, cnt, 1, 1, output_buf);
    
    /* 处理识别结果 */
    /* printf("Detect result: %s\r\n", output_buf); */
    
    /* 停止手写识别 */
    alientek_ncr_stop();
}

58.2.2 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{
    /* 仅保留关键代码,其余代码省略 */
    /* 初始化手写识别 */
    alientek_ncr_init();
    
RESTART:
    while (1)
    {
    		key = key_scan(0);
    		
    		switch (key)
    		{
    			/* 切换识别模式 */
    			case KEY0_PRES:
    			{
    				mode++;
    				if (mode > 4)
    				{
    					mode = 1;
    				}
    				break;
    			}
    			/* 进行触摸校准 */
    			case WKUP_PRES:
    			{
    				if ((tp_dev.touchtype & 0x80) == 0)
    				{
    					tp_adjust();
    					goto RESTART;
    				}
    				break;
    			}
    		}
    		
    		tp_dev.scan(0);
    		/* 有触摸按下,记录触摸点阵数据 */
    		if (tp_dev.sta & TP_PRES_DOWN)
    		{
    			ncr_input_buf[pcnt].x = tp_dev.x[0];
    			ncr_input_buf[pcnt].y = tp_dev.y[0];
    		}
    		/* 触摸松开,进行手写识别 */
    		else
    		{
    			alientek_ncr(ncr_input_buf, pcnt, 6, mode, sbuf);
    			printf("识别结果:%s\r\n", sbuf);
    		}
    }
}

由于本实验的应用代码过于冗长,因此上面代码仅保留了部分关键代码,完整代码请读者自行查看本实验的配套实验例程。从上面的代码中可以看出,本实验实现的应用中,通过触摸屏获取点阵数据,将点阵数据传入手写识别函数后,获取手写识别结果,然后将手写识别结果通过串口等方式输出,并且可通过KEY0按键修改手写识别的模式,也可通过KEY_UP按键随时进行电阻屏的触摸校准。
58.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,此时便可以在LCD上提示的“手写区”进行手写操作,完后手写操作后,可以看到LCD上提示了手写识别的结果,此时也可以按下KEY0按键修改手写识别的模式,也可以按下KEY_UP按键进行电阻屏的触摸校准。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1248944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Python程序打包: 使用PyInstaller制作单文件exe以及打包GUI程序详解]

文章目录 概要Python 程序打包—使用 Pyinstaller 打包 exePython程序打包—使用Pyinstaller打包GUI程序Python程序打包—使用 Pyinstaller 设置 exe 图标小结 概要 使用PyInstaller工具将Python程序打包成可执行(EXE)文件。将Python程序打包成EXE的好处…

socket can中是如何根据 结构体can_bittiming_const中的字段 计算bitrate的?

在 SocketCAN 中,can_bittiming_const 结构体用于表示 CAN 总线的定时参数,包括位率(bitrate)的计算。can_bittiming_const 包含了许多与位率相关的参数,其中一些参数用于计算实际的位率。 下面是一些与位率计算相关的…

java中关键字 volatile 和 synchronized 有什么区别

java中 volatile 和 synchronized 有什么区别?

城市NOA到来时刻,车企密集上车NVIDIA

作者 |张祥威 编辑 |德新 基于双NVIDIA DRIVE Orin实现城市NOA,已是今天国内汽车行业的主流做法。 这款芯片获得广泛的市场认同,用时仅一年多。去年3月, NVIDIA DRIVE Orin正式投产,此后从造车新势力一路来到更多自主品牌的车内&…

初学vue3与ts:路由跳转带参数

index-router <!-- 路由跳转 --> <template><div><div class"title-sub flex"><div>1、用router-link跳转带参数id1&#xff1a;</div><router-link to"./link?id1"><button>点我跳转</button>&…

逆矩阵相关性质与例题

1.方阵的行列式&#xff1a;就是将方阵中的每一个元素转换至行列式中。 1.性质一&#xff1a;转置方阵的行列式等于转置前的行列式。&#xff08;对标性质&#xff1a;行列式与它的转置行列式相等&#xff09; 2.性质二&#xff1a;|ka||a|*k的n次方&#xff0c;n为方阵阶数。 …

MySQL表的操作『增删改查』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.创建表1.1.创建时指定属性 2.查看表2.1.查看表结构2.2.查看建表信息…

HTTP/2:多路复用、服务器推送和首部压缩的革命

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

IO多路转接之epoll

目录 一. epoll的实现原理 二. epoll的相关接口 2.1 epoll_create -- 创建epoll模型 2.2 epoll_ctl -- 对epoll模型进行控制 2.3 epoll_wait -- 等待epoll所关注的事件就绪 2.4 epoll相关接口的使用方法 三. Epoll服务器的模拟实现 3.1 EpollServer类的声明 3.2 Epoll…

模拟退火算法应用——求解函数的最小值

仅作自己学习使用 一、问题 需求&#xff1a; 计算函数 的极小值&#xff0c;其中个体x的维数n10&#xff0c;即x(x1,x2,…,x10)&#xff0c;其中每一个分量xi均需在[-20,20]内。因此可以知道&#xff0c;这个函数只有一个极小值点x (0,0,…,0)&#xff0c;且其极小值是0&…

智能对话手机版系统源码:附带完整的搭建教程

移动设备的普及和移动互联网的发展&#xff0c;手机已经成为人们日常生活中最常用的通信工具。因此&#xff0c;针对手机平台开发智能对话系统具有非常重要的意义。首先&#xff0c;手机用户可以更加方便地进行语音对话和信息交互&#xff0c;提高沟通效率。其次&#xff0c;手…

ctfshow sql

180 过滤%23 %23被过滤&#xff0c;没办法注释了&#xff0c;还可以用’1’1来闭合后边。 或者使用--%0c-- 1%0corder%0cby%0c3--%0c--1%0cunion%0cselect%0c1,2,database()--%0c--1%0cunion%0cselect%0c1,2,table_name%0cfrom%0cinformation_schema.tables%0cwhere%0ctable_…

Redis常用操作及应用(一)

一、五种数据结构 二、String结构 1、字符串常用操作 SET key value //存入字符串键值对 MSET key value [key value ...] //批量存储字符串键值对 SETNX key value //存入一个不存在的字符串键值对 GET key //获取一个字符串键值 MGET key [ke…

超好用的制作照片书神器,强到没朋友

在这个快节奏的时代&#xff0c;我们常常忙于工作和生活&#xff0c;而忽略了那些珍贵的回忆。现在&#xff0c;有了超好用的制作照片书神器&#xff0c;你可以轻松地将这些回忆化为实实在在的书册&#xff0c;随时翻阅&#xff0c;感受那份温暖和感动。 接下来给大家推荐一款神…

开源还是闭源(=°Д°=)!!趋势表明,开源技术在诸多领域中日益受到重视

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 一、开源和闭源的…

长征故事vr互动教育体验系统让师生感同身受

红色文化是贯穿于新民主主义革命、社会主义建设的各个时期&#xff0c;具有深厚的历史价值和文化内涵的先进文化&#xff0c;是高效、优质的教育资源。思政课vr红色数字展馆充分开发和大力弘扬红色文化资源&#xff0c;发挥其独特资源优势和教育功能&#xff0c;应用到教学中&a…

【学习草稿】pid控制基础实现--往水桶注水

pid 1&#xff09;非常通俗易懂的PID控制&#xff08;1&#xff09;https://zhuanlan.zhihu.com/p/37515841 球场上运动至指定地点&#xff08;比例控制&#xff09;&#xff1a;有图【很直观的帮助理解】&有文字分析 2&#xff09;初识PID-搞懂PID概念 https://zhuanlan.…

leetcode刷题日志-11盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 思路…

LeetCode.88合并两个有序数组

LeetCode.88合并两个有序数组 1.问题描述2.解题思路3.代码 1.问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同…

完美解决:Nginx访问PHP出现File not found.

目录 解决方法一&#xff1a; 解决方法二&#xff1a; 遇到 File not found. 出现的问题解决&#xff1a; 解决方法一&#xff1a; 修改nginx的主配置文件。 vi /etc/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass …