我的第一个Imx6ULL应用《百度图像识别》

2023-11-19

Imx6ULL填坑计划

此次用到的所有资料我都放到了奶牛快传里,下载的话速度极快!
https://c-t.work/s/fe0b4a22171342

我买这个板子已经很久了,跟着野火正点原子的教程踉踉跄跄学了一段儿,对很多基础知识也是一知半解,最终也算是搞了下字符驱动开发,并且做了自己的第一次尝试:

【linux学习vlog】周末两天爆肝入门linux嵌入式

然后呢最近终于费了九牛二虎之力搞成了自己第一个最完善的应用:基于百度图像与语音的一个小作品:

【野火linux】我的第一个linux+QT应用


接下来就总结一下我的制作过程,由于我没有该视频的文档,所以我都是跟着视频敲代码,一点一点撸出来的!!
参考讯为的图像识别项目教程: https://www.bilibili.com/video/BV157411c7sc/

制作总结

我的做法与讯为的不同点:
讯为使用的摄像头带驱动,我买的免驱的USB摄像头,这样更简单。
讯为调用摄像头采用的是Opencv,我感觉没必要,我直接用的QT的camera组件。
然后讯为在同步板子和电脑上交叉编译库的时候,用的是设计根文件系统,而我直接通过NFS怼进去的,这样更简单(野火构建根本文件系统的教程一言难尽,依赖文件太多,下载太慢。)

  1. linux板环境准备

QT交叉编译环境的搭建 (按照野火的文档手册39.1节来就可以,前提是你要把野火需要下载的东西都搞定,且编译通过)
PC端QT环境的搭建,最终完成的效果是生成一个最基本的QT程序,能在PC上编译运行,然后交叉编译以后能板子上正常运行,这时候最基本的准备就完成了。

这里的坑就是:

*安装 arm-linux-gnueabihf-gcc v8.3.0*
野火文档上面的编译脚本是有问题的,一是他的排版问题,导致你sh命令总会出错,你可以自己拷贝下来以后自己排查一下修改一下,我编译高版本的8.3的GCC的时候就已经出问题了,一是sh脚本根本无法运行,二是下载失败。其实这个还是比较简单的,因为sh脚本并不复杂可以看得懂,就是把编译器下载下来,然后放到/opt目录下即可。
我已经准备好了在网盘里:arm-linux-gnueabihf-gcc v8.3.0
然后按照野火的教程走,导出环境变量,并验证版本。
剩下的交叉编译触摸驱动tslib以及声卡alsa(这两个是交叉编译进QT工程里面的)  
交叉编译QT也是一样的,使用我检验过的即可。
可以按照我做好的sh脚本来执行,直接就OK了。(野火的排版有问题,复制下来是不行的)
然后就按照野火教程安装QT Creator  这里是没问题的
然后把交叉编译的第一个APP nfs扔到板子里,能正常跑,OK到这里基本的准备条件就完成了,就可以在QT的海洋里遨游了。
  1. 百度应用的创建与准备
    接下来是百度端的应用创建,这个我比较熟悉,因为之前就玩过树莓派的图像识别、人脸识别、以及语音识别。 如图:创建语音应用和图像识别应用
    在这里插入图片描述
主要是用到百度的三元组
AppID
API Key
Secret Key
  1. 依赖库的交叉编译
 接下来其他的就暂时脱离QT了,这是对 整个图像识别和百度语音识别做准备的:
编译openssl
cd openssl-1.0.2f/
setarch i386 ./config no-asm shared --prefix=/usr/local/openssl/
CC= arm-linux-gnueabihf-gcc
AR= arm-linux-gnueabihf-ar $(ARFLAGS) r
RANLIB= arm-linux-gnueabihf-ranlib
NM= arm-linux-gnueabihf-nm
 make
sudo make install

编译curl
./configure --prefix=/usr/local/curl/ --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ --with-ssl=/usr/local/openssl
make
sudo make install

编译jsoncpp (我这里虽然编译成功了,但是在QT里总是调用失败,解决方法见下文)
mkdir arm_jsoncpp
cp -r include/ arm_jsoncpp/
cp src/lib_json/* arm_jsoncpp/
arm-linux-gnueabihf-g++ -c *.cpp -I./include -fPIC
mkdir lib
 ar cr ./lib/libjsoncpp.a *.o
 编译动态库
 arm-linux-gnueabihf-g++ -shared -fPIC *.cpp -I./include -o ./lib/libjsoncpp.so 
××解决jsoncpp问题××
我百度查了查  jsoncpp即使不进行动态编译,一样可以调用,直接把cjson需要用到的文件扔QT工程里面就行了。直接在QT里引用外部文件把整个json文件夹饮用即可!
参考链接: https://www.cnblogs.com/zengjfgit/p/4959965.html

  1. 根文件系统的整理与拷贝
 然后就是以上依赖库的环境变量引导,把上面的文件在PC上放到指定位置进行交叉编译生成QT可执行文件,nfs扔到板子上运行,会提示找不到依赖库。
此时把依赖库文件,放到imx6ull板子的指定路径,并且编辑环境变量。再次运行就不报错了。
将文件放到开发板的对应位置以及lib文件夹
root@npi:/mnt# cp -r curl /usr/local/
root@npi:/mnt# cp -r openssl /usr/local/
root@npi:/mnt# cp -r curl/lib/* /lib/
root@npi:/mnt# cp -r openssl/lib/* /lib/

vi ./etc/init.d/rcS  如下图
讯为的教程使用的是 设计根文件系统,而我是直接NFS传进去,其实原理是一样的,无论怎么样,只要能让QT应用在板子的指定位置找到指定的依赖文件即可。

注:如果使用的是野火的debian系统找不到rcS文件,那么就用系统变量的配制方法:
vi .bashrc
在文末添加如下内容
export PATH=$PATH:/usr/local/openssl/bin
export PATH=$PATH:/usr/local/curl/bin
编辑完成以后 更新一下,然后查看是否OK
source ~/.bashrc
echo $PATH

在这里插入图片描述

  1. QTAPP的编写

百度APP初始化部分:

#include "json/include/json/json.h"  //由于我没编译成功jsoncpp的依赖库,所以用这种本地依赖的方法来作

#include "ocr.h"
#include "speech.h"
// 设置语音合成 APPID/AK/SK
std::string speech_app_id = "21275374";
std::string speech_api_key = "5ZGKQxLfmVamG2GnP9zsXGKX";
std::string speech_secret_key = "ZW5Aoopu2K88DOQtgcZBQGjmTnDH8ncQ";
aip::Speech client_speech(speech_app_id, speech_api_key, speech_secret_key);

// 设置文字识别APPID/AK/SK
std::string app_id = "21267850";
std::string api_key = "mXTgSiRIQ07OYFGqB3aSlY2t";
std::string secret_key = "LWoGPMUaqKzLfUPihDUnphEMNX148uR2";

aip::Ocr client(app_id, api_key, secret_key);

车牌识别部分:

std::string GetPlateNumber(std::string PicturePath)
{
    Json::Value result;

    std::string image;
    aip::get_file_content(PicturePath.c_str(), &image);

    // 调用车牌识别
    result = client.license_plate(image, aip::null);

    // 如果有可选参数
    std::map<std::string, std::string> options;
    options["multi_detect"] = "true";
    // 带参数调用车牌识别
    result = client.license_plate(image, options);
    if(result["error_code"].isNull())  //无报错
    {
      return ("车牌号"+result["words_result"][0]["number"].asString()+"欢迎光临");
    }else
    {
    return ("error");
    }
}

语音合成(文字转语音部分):

int tts(std::string text,std::string FileName)
{
    std::ofstream ofile;
    std::string file_ret;
    std::map<std::string, std::string> options;
    options["spd"] = "4";
    options["per"] = "5";

    // 合成成功的二进制数据写入文件中
    ofile.open(FileName, std::ios::out | std::ios::binary);

    // 不带可选参数调用
    //Json::Value result = client_speech.text2audio("百度语音合成测试", aip::null, file_ret);

    // 带可选参数调用, 参数参考参数列表中的可选参数
     Json::Value result = client_speech.text2audio(text, options, file_ret);

    // 如果file_ret为不为空则说明合成成功,返回mp3文件内容回结果
    if (!file_ret.empty())
    {
        ofile << file_ret;
        return 0;
    } else {
        // 服务端合成错误
        std::cout << result.toStyledString();
        return 1;
    }
    return 2;
}

拍照按钮事件的执行:

void Camera::processCapturedImage(int requestId, const QImage& img)
{
    Q_UNUSED(requestId);
    QImage scaledImage = img.scaled(ui->viewfinder->size(),
                                    Qt::KeepAspectRatio,
                                    Qt::SmoothTransformation);
    ui->lastImagePreviewLabel->setPixmap(QPixmap::fromImage(scaledImage));
    const QPixmap *pixmap=ui->lastImagePreviewLabel->pixmap();
    pixmap->save("./a.jpg");  //存储到指定位置
    std::string out;
    std::int8_t sp_out;
    out =  GetPlateNumber("./a.jpg");
    ui->statusbar->showMessage(out.c_str());
    //语音合成
    sp_out = tts(out,"./a.mp3");
    if(sp_out == 0)
    {
    //播放   开启新线程执行系统命令
    QProcess *process = new QProcess();
    process->start("gplay-1.0 a.mp3");
   // system("gplay-1.0 a.mp3");
    }else
    {
     ui->statusbar->showMessage("语音合成失败");
    }
    QMessageBox::warning(this, tr("OK"), out.c_str());
// Display captured image for 4 seconds.  这里会在linux板子上面卡住
// displayCapturedImage();
// QTimer::singleShot(4000, this, &Camera::displayViewfinder);
}

这一切搞完,就OK了,完美运行!我太难了!四处碰壁。
总之,最终完成了,还是很开心的。好好学习、天天向上!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的第一个Imx6ULL应用《百度图像识别》 的相关文章

  • 在 Kali (Debian) 中安装 mono-devel 时,软件包具有未满足的依赖关系

    我尝试安装 mono devel 并输入sudo apt get mono devel在终端中 但失败了 得到以下结果 apt get install mono devel Reading package lists Done Buildi
  • 使用端口 80 (Ubuntu / Linode) 运行 Node.js 的最佳实践 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在设置我的第一个Node js服务器上的cloud Linux node我对以下细节还很陌生Linux admin 顺便说一句 我并没有尝试
  • 在C中获取终端宽度?

    我一直在寻找一种从 C 程序中获取终端宽度的方法 我不断想出的是这样的东西 include
  • 从 Linux 内核模块的文件描述符获取文件名/路径?

    在Linux内核模块中 有没有一种方法可以从文件名 路径中获取文件名 路径 unsigned int fd 我知道这个答案 如何从内核模块内的文件描述符获取文件名 https stackoverflow com questions 8250
  • 哪个信号被传递到信号处理程序中死锁的进程

    我有一个来自调用信号处理程序后死锁的进程的核心转储 如何确定传送了哪个信号以及是谁发送的 GDB 为接收信号的线程生成的回溯如下 信号处理程序在第 15 帧中被调用 gdb bt 0 0x00007fa9c204654b in sys fu
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 编译错误:linux/module.h:没有这样的文件或目录

    我写了一个简单的模块 define KERNEL define MODULE include
  • 将管道输入转储到文件的简单方法是什么? (Linux)

    我正在寻找一个小 shell 脚本 它可以将任何内容通过管道传输到其中 并将其转储到文件中 用于电子邮件调试目的 有任何想法吗 unix 命令 tee 可以做到这一点 man tee
  • 使用 cmake 和 opencv 对符号“gzclose”的未定义引用[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我尝试构建该项目 doppia https bitbucket org rodrigob doppia 但发生链接错误 我想这是一
  • “排序文件名 | uniq”不适用于大文件

    我可以从小文本文件中删除重复条目 但不能从大文本文件中删除重复条目 我有一个 4MB 的文件 文件的开头如下所示 aa aah aahed aahed aahing aahing aahs aahs aal aalii aalii aali
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • /etc/php5/conf.d 文件夹中的 .ini 文件有什么用?

    我知道 ini 文件位于 etc php5 cli与 PHP 的 CLI 使用有关 文件位于 etc php5 fpm是关于 PHP 的 FastCGI FPM 方面 但是位于以下位置的 ini 文件又如何呢 etc php5 conf d
  • Kubernetes Pod 已终止 - 退出代码 137

    我需要一些关于 k8s 1 14 和在其上运行 gitlab 管道所面临的问题的建议 许多作业都会抛出退出代码 137 错误 我发现这意味着容器突然终止 集群信息 库伯内特版本 1 14 使用的云 AWS EKS 节点 C5 4xLarge
  • 保护一个保存 MySQL 数据库的简单 Linux 服务器?

    这是一个初学者问题 但我浏览了该网站上的许多问题 但没有找到简单直接的答案 我正在设置一个运行 Ubuntu 的 Linux 服务器来存储 MySQL 数据库 该服务器尽可能安全非常重要 据我所知 我主要担心的是传入的 DoS DDoS 攻
  • 为什么 SDL 在 Mac 上比 Linux 上慢得多?

    我正在研究使用 SDL2 渲染的单线程图形程序 https github com TurkeyMcMac intergrid 请参阅末尾的较小示例 它既可以在旧的 Linux 机器上运行 也可以在不太旧的 Mac 上运行 Linux 计算机
  • 用于列出用户和组的 Python 脚本

    我正在尝试编写一个脚本 在自己的行上输出每个用户及其组 如下所示 user1 group1 user2 group1 user3 group2 user10 group6 etc 我正在为此用 python 编写一个脚本 但想知道如何做到这
  • 使用 perf 查找线程瓶颈并优化挂机时间

    对 cpu 周期进行采样perf record如果核心利用率大致恒定 则对于寻找优化候选非常有用 但对于具有并行性不同的多个阶段的代码 计算 cpu 周期将重点强调并行阶段 而低估影响挂机时间的顺序或有限并行阶段 简而言之 天真的 perf
  • Google PubSub 在阻止和等待消息时没有标准输出

    我正在使用这个问题底部的 Python 代码监听 Google PubSub 消息 它实际上是来自 Google 的异步拉取示例 我运行我的程序并输出到文件 python my script py tee log txt 如果我在接收消息时
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • 使用 Shell 脚本提供密码

    我已将客户端和服务器设置为无密码登录 就像无密码登录一样 通过将服务器的 RSA 密钥复制到所有客户端的 root ssh id rsa pub 来实现 但这是我手动完成的 我喜欢使用 shell 脚本自动执行此过程 并通过脚本向计算机提供

随机推荐

  • 特征值和特征向量的几何和物理意义

    原文 http blog 163 com renguangqian 126 blog static 1624014002011711114526759 FUCk 相见很晚 如果大学期间遇到这样的文章 线代必须90分以上 特征值和特征向量的几
  • vsCode中live server插件的安装及使用

    live server 插件是用来干嘛的 本地开发常常需要搭建临时的服务 作用 1 模拟服务器的方式打开页面 2 代码改动后 会自动刷新页面 安装 使用 1 使用要求 要求项目文件夹 Demo 要单独出现在vscode侧边栏 以下两种都可以
  • 软件设计风格(干货)-架构师之路(九)

    一 软件架构风格概念 Architecture架构 体系结构 软件体系结构风格是 描述某一特定应用领域中 系统组织方式 的惯用模式 架构风格定义一个系统家族 即 一个架构的定义 一个词汇表和一组约束 词汇表包含 一些构建和连接类型 而一组约
  • 你工作效率低,可能是因为不会Python

    前言 你是不是感觉你的工作非常无聊 每天有大量的重复性的工作要做 比如在我的工作中 就有很多类似的动作 每天早上要看我们DevOps流水线跑出的结果 查看各个微服务中的重复代码率是多少 有没有增加 CleanCode中的各项指标怎么样 代码
  • 微信加拿大服务器,微信新功能,在加拿大也可以任意刷人民币了

    原标题 微信新功能 在加拿大也可以任意刷人民币了 2018 6 11 加币 人民币 4 877 加币 美金 0 757 近日 微信悄悄上线了一项新功能 这就是 亲属卡 什么是 亲属卡 简单来说 就 是 你消费 别人买单 这项功能对于我们身在
  • 2021-01-10

    RIP 协议 一 合理分配IP地址 二 配置IP地址 三 运行RIPV 2 例R1 四 配置缺省路由 五 RIPV2 认证 例R1 六 配置空接口路由 防环 例R1 七 全网可通
  • 成员变量与局部变量的区别有哪些

    成员变量是在类内部定义的变量 在类的任何方法中都可以直接使用 其作用域为整个类 成员变量有默认值 如果没有给定初始值 数值类型默认为0 布尔类型默认为false 对象类型默认为null 局部变量是在方法 代码块 循环等内部定义的变量 其作用
  • 【羊了个羊】Burp抓取IOS微信小程序数据包

    描述 最近 小游戏 羊了个羊 在朋友圈刷屏 网友纷纷表示 游戏开发者多少有个病要治 本文记录 如何使用Burp抓取ios微信小程序数据包 工具准备 Burp 苹果手机 wifi 设置记录 手机和电脑连接同一wifi burp设置新代理 手机
  • 人脸分割 人脸解析 源码推荐

    2021年 有预训练 resnet50 126m 测试代码 python face warping test py i 0 e rtnet50 decoder fcn n 11 d cuda 0 Command line arguments
  • html js c 代码大全,js常用汇总

    javascript 代码库JS函数修改html的元素内容 及修改属性内容 document getElementById aid innerHTML World document getElementById aid href http
  • CBAM——即插即用的注意力模块(附代码)

    论文 CBAM Convolutional Block Attention Module 代码 code 目录 前言 1 什么是CBAM 1 Channel attention module CAM 2 Spatial attention
  • hexo的美化——拓展篇

    基础知识 css样式 hexo themes next source css 是next主题的样式文件 决定主题的外观 hexo themes next source css main styl 汇总css文件夹中所有的样式 hexo th
  • 一段有意思的异步代码片段

    毫不夸张的说 下面的代码会有一半的人输出错误 上代码 async function getCount id return id let count 0 async function addCount num count await getC
  • 深度学习入坑笔记之二---手写体图像识别问题

    深度学习入坑笔记之二 手写体图像识别问题 目录 前言 通过softmax进行手写体图像建模及识别 数据导入 softmax建模 训练模型 模型评估 通过卷积网络进行手写体图像建模及识别 初始化权重 定义卷积层及池化层 添加层 训练及评估模型
  • golang1.9编译openwrt运行程序 ,window7下liteide编译

    网上看了好多资料发现都很过时了 基本都是用的https github com gomini go mips32编译的 但是go1 9早就支持mips了 设置好编译参数 开始build 这时在go pkg下会出现linux mips目录 就是
  • 本地镜像发布到私有库

    情景 涉及机密的文件 公司不可能提供镜像给公网 所以需要创建一个私有仓库用于存放敏感的镜像 Docker Registry帮助我们搭建私有的仓库供团队使用 相当于一个私有的hub仓库 本地拉取registry镜像 运行私有库 相当于自己本地
  • BugkuCTF-MISC题FileStoragedat

    知识点 FileStorage是微信存储数据的一个文件夹 该文件夹下存放的是经过加密后微信里发送 接受的图片而形成的文件后缀为dat的文件 就是微信dat文件 想要做出此题 就得先弄懂微信dat文件形成的原因 微信的dat文件 将微信图片的
  • Java Elasticsearch多条件分组聚合查询

    需求 在项目开发中 需要从elasticsearch中查询日志数据 先统计每一天的日志调用量 然后在每一天的分组聚合基础上 再分组聚合统计成功和失败的日志调用量 代码 DateHistogramAggregationBuilder aggr
  • Python爬虫——多线程爬虫如何实现?

    Python爬虫 多线程爬虫 1 多任务 2 主线程与子线程 2 1 何谓线程 主线程及子线程 2 2 查看线程数量 2 3 创建子线程 2 4 线程间的通信 3 线程间的资源竞争 4 互斥锁与死锁 4 1 互斥锁 4 2 死锁 4 3 避
  • 我的第一个Imx6ULL应用《百度图像识别》

    Imx6ULL填坑计划 此次用到的所有资料我都放到了奶牛快传里 下载的话速度极快 https c t work s fe0b4a22171342 我买这个板子已经很久了 跟着野火正点原子的教程踉踉跄跄学了一段儿 对很多基础知识也是一知半解