当前位置: 首页 > news >正文

用39块钱的全志V851se视觉开发板做了个小相机,还可以物品识别、自动追焦!

用39块钱的V851se视觉开发板做了个小相机。

在这里插入图片描述

可以进行物品识别、自动追焦!

在这里插入图片描述

在这里插入图片描述

这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina Linux与OpenCV框架开启摄像头拍照捕获视频,并结合NPU实现Mobilenet v2目标分类识别以及运动追踪等功能…并最终实现功能完整的智能小相机。

ISP适配

可以适配V851se的Tina5.0升级到了21.05版本的OpenWrt,相较于商业量产版本的Tina Linux 支持更多新的软件包,不过可惜的是MPP包没有移植到Tina5.0,所以想使用摄像头就需要另辟蹊径。

虽然Tina5.0并没有移植MPP包,但也内置了一个libAWispApi包,支持在用户层对接 ISP,但是很可惜这个包也没有适配V85x系列,这里就需要自行适配。

其实适配很简单,SDK 已经提供了lib只是没提供编译支持,我们需要前往以下文件夹中新建一个v851se文件夹:

openwrt/package/allwinner/vision/libAWIspApi/machinfo

然后再新建文件build.mk写入如下配置:

ISP_DIR:=isp600

在这里插入图片描述

然后在menuconfig中勾选上这个包,并进行如下配置:

Allwinner  --->Vision  ---><*> camerademo........................................ camerademo test sensor  --->[*]   Enabel vin isp support

在这里插入图片描述

编译系统然后烧录系统,运行命令 camerademo ,可以看到是正常拍摄照片的

在这里插入图片描述

OpenCV适配

OpenCV在打包好的固件中已经默认适配好了,如果不想了解如何适配OpenCV可以直接前往点击链接获取资料并跳过这部分

OpenCV默认不支持开启RAW Sensor,不过现在需要配置为OpenCV开启RAW Sensor抓图,然后通过OpenCV送图到之前适配的libAWispApi库进行 ISP 处理。

在这里增加一个函数作为 RAW Sensor 抓图的处理。

#ifdef __USE_VIN_ISP__
bool CvCaptureCAM_V4L::RAWSensor()
{struct v4l2_control ctrl;struct v4l2_queryctrl qc_ctrl;memset(&ctrl, 0, sizeof(struct v4l2_control));memset(&qc_ctrl, 0, sizeof(struct v4l2_queryctrl));ctrl.id = V4L2_CID_SENSOR_TYPE;qc_ctrl.id = V4L2_CID_SENSOR_TYPE;if (-1 == ioctl (deviceHandle, VIDIOC_QUERYCTRL, &qc_ctrl)){fprintf(stderr, "V4L2: %s QUERY V4L2_CID_SENSOR_TYPE failed\n", deviceName.c_str());return false;}if (-1 == ioctl(deviceHandle, VIDIOC_G_CTRL, &ctrl)) {fprintf(stderr, "V4L2: %s G_CTRL V4L2_CID_SENSOR_TYPE failed\n", deviceName.c_str());return false;}return ctrl.value == V4L2_SENSOR_TYPE_RAW;
}
#endif

这段代码的功能是检查V4L2摄像头设备的传感器类型是否为RAW格式。它使用了V4L2的ioctl函数来查询和获取传感器类型信息。

然后在OpenCV的捕获流函数:

bool CvCaptureCAM_V4L::streaming(bool startStream)

添加 ISP 处理

#ifdef __USE_VIN_ISP__RawSensor = RAWSensor();if (startStream && RawSensor) {int VideoIndex = -1;sscanf(deviceName.c_str(), "/dev/video%d", &VideoIndex);IspPort = CreateAWIspApi();IspId = -1;IspId = IspPort->ispGetIspId(VideoIndex);if (IspId >= 0)IspPort->ispStart(IspId);} else if (RawSensor && IspId >= 0 && IspPort) {IspPort->ispStop(IspId);DestroyAWIspApi(IspPort);IspPort = NULL;IspId = -1;}
#endif

这段代码主要用于控制图像信号处理(ISP)的启动和停止。根据条件的不同,可以选择在开始视频流捕获时启动ISP流处理,或者在停止视频流捕获时停止ISP流处理,以便对视频数据进行处理和增强。

至于其他包括编译脚本的修改,全局变量定义等操作,可以参考原文链接中的补丁文件。

在执行完以上步骤后,可以快速测试摄像头输出demo:

OpenCV  ---><*> opencv....................................................... opencv libs[*]   Enabel sunxi vin isp support<*> opencv_camera.............................opencv_camera and display image

在这里插入图片描述

MobileNet V2

MobileNet V2是一种轻量级的卷积神经网络,它专为移动设备和嵌入式设备上的实时图像分类和目标检测任务设计。

MobileNet V2的关键特点包括使用深度可分离卷积来减少计算量和参数数量,引入带线性瓶颈的倒残差结构以增加非线性表示能力,以及提供宽度乘数参数以适应不同计算资源限制。这些特点使得MobileNet V2成为资源受限的移动设备上的理想选择。

首先对输入图像进行预处理,以适应MobileNet V2 SSD模型的输入要求。通过通道格式转换、图像大小调整和数据填充等操作,将输入图像转换为适合模型输入的格式。

void get_input_data(const cv::Mat& sample, uint8_t* input_data, int input_h, int input_w, const float* mean, const float* scale){cv::Mat img;if (sample.channels() == 1)cv::cvtColor(sample, img, cv::COLOR_GRAY2RGB);elsecv::cvtColor(sample, img, cv::COLOR_BGR2RGB);cv::resize(img, img, cv::Size(input_h, input_w));uint8_t* img_data = img.data;/* nhwc to nchw */for (int h = 0; h < input_h; h++) {for (int w = 0; w < input_w; w++) {for (int c = 0; c < 3; c++) {int in_index = h * input_w * 3 + w * 3 + c;int out_index = c * input_h * input_w + h * input_w + w;input_data[out_index] = (uint8_t)(img_data[in_index]);  //uint8

关键步骤是要实现非极大值抑制算法(NMS),用于去除高度重叠的框,只保留得分最高的那个框。算法通过计算框之间的交集面积和设置的阈值来进行筛选,并将保留的框的索引存储在picked向量中。

// 非极大值抑制算法(NMS)
static void nms_sorted_bboxes(const std::vector<Bbox_t>& bboxs, std::vector<int>& picked, float nms_threshold) {picked.clear();const int n = bboxs.size();// 创建存储每个框面积的向量std::vector<float> areas(n);// 计算每个框的面积并存储for (int i = 0; i < n; i++){areas[i] = (bboxs[i].xmax - bboxs[i].xmin) * (bboxs[i].ymax - bboxs[i].ymin);

通过一系列操作,包括转换为向量、计算缩放比例、创建存储检测结果的向量等,将输出数据转换为检测结果,并按照置信度从高到低排序。然后应用非极大值抑制算法对检测结果进行筛选,最后将筛选后的目标框位置、大小和类别置信度等信息绘制在图像上。

// 按照分数对框进行排序std::sort(BBox.begin(), BBox.end(), comp);// 应用非极大值抑制算法,获取保留的框的索引std::vector<int> keep_index;nms_sorted_bboxes(BBox, keep_index, iou_threshold);// 创建存储框位置的向量std::vector<cv::Rect> bbox_per_frame;// 遍历保留的框,绘制框和标签for(int i = 0; i < keep_index.size(); i++) {int left = BBox[keep_index[i]].xmin;int top = BBox[keep_index[i]].ymin;int right = BBox[keep_index[i]].xmax;int bottom = BBox[keep_index[i]].ymax;cv::rectangle(bgr, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 0, 255), 1);char text[256];sprintf(text, "%s %.1f%%", class_names[BBox[keep_index[i]].cls_idx], BBox[keep_index[i]].score * 100);cv::putText(bgr, text, cv::Point(left, top), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 255, 255), 1, 8, 0);bbox_per_frame.emplace_back(left, top, width, height);}

在这里插入图片描述

NPU开发流程

V851se芯片内置一颗NPU,其处理性能为最大0.5TOPS并有128KB内部高速缓存用于高速数据交换,NPU 开发完整的流程如下图所示:

在这里插入图片描述

模型训练

在模型训练阶段,用户根据需求和实际情况选择合适的框架(如Caffe、TensorFlow 等)使用数据集进行训练得到符合需求的模型,此模型可称为预训练模型。也可直接使用已经训练好的模型。V851s 的 NPU 支持包括分类、检测、跟踪、人脸、姿态估计、分割、深度、语音、像素处理等各个场景90 多个公开模型。

signal函数

在模型转化阶段,通过Acuity Toolkit把预训练模型和少量训练数据转换为NPU可用的模型NBG文件。一般步骤如下:

1、模型导入,生成网络结构文件、网络权重文件、输入描述文件和输出描述文件。
2、模型量化,生成量化描述文件和熵值文件,可改用不同的量化方式。
3、仿真推理,可逐一对比float和其他量化精度的仿真结果的相似度,评估量化后的精度是否满足要求。
4、模型导出,生成端侧代码和*.nb 文件,可编辑输出描述文件的配置,配置是否添加后处理节点等。

在这里插入图片描述

相关文章:

用39块钱的全志V851se视觉开发板做了个小相机,还可以物品识别、自动追焦!

用39块钱的V851se视觉开发板做了个小相机。 可以进行物品识别、自动追焦&#xff01; 这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina Linux与OpenCV框架开启摄像头拍照捕获视频&#xff0c;并结合NPU实现Mobilenet v2目标分类识别以及运动追踪等功能…并最终…...

主从复制实现Redis集群

主从复制实现Redis集群实验 (一主二从): 实验环境: 使用Docker 搭建 Redis 版本 5.0.5 打开一个终端窗口&#xff0c;在其中运行如下命令创建一个名为redis-master的Redis容器。注意&#xff0c;它的端口是6379 (本地的端口:映射到容器的端口) docker run -itd--name redis-m…...

高分文献解读|3D打印骨支架实现梯度密度颌骨功能性重建

近月&#xff0c;浙江大学医学院附属口腔医院谢志坚教授团队与浙江大学化学系唐睿康教授团队、机械工程学院贺永教授团队合作&#xff0c;在期刊《Advanced Functional Materials》&#xff08;IF19&#xff09;上发表题为“A Hierarchical 3D Graft Printed with Nanoink for …...

大型电商日志离线分析系统(一)

一、项目需求分析 某大型网站日志离线分析系统 1.1 概述 该部分的主要目标就是描述本次项目最终七个分析模块的页面展示。 1.2 工作流 在我们的demo展示中&#xff0c;我们使用jqueryecharts的方式调用程序后台提供的rest api接口&#xff0c;获取json数据&#xff0c;然后…...

FL Studio Fruity Edition2024中文入门版Win/Mac

FL Studio Fruity Edition2024是一款功能强大的音乐制作软件&#xff0c;适合初学者和音乐爱好者使用。它提供了丰富的音乐制作工具&#xff0c;包括音频录制、编辑、混音以及MIDI制作等功能&#xff0c;帮助用户轻松创作出动人的音乐作品。 FL Studio 21.2.3 Win-安装包下载如…...

学习vue3第二节(使用vite 创建vue3项目)

使用vite 创建vue3项目 node 安装请移步 node官网&#xff1a; https://nodejs.p2hp.com/ node 版本控制 请移步 nvm官网&#xff1a;https://nvm.uihtm.com/ vite 生成vue项目完整版 请移步 vite官网&#xff1a;https://cn.vitejs.dev/ 1、使用 npm 或者 yarn 创建vue3 项目…...

基于Siamese网络的zero-shot意图分类

原文地址&#xff1a;Zero-Shot Intent Classification with Siamese Networks 通过零样本意图分类有效定位域外意图 2021 年 9 月 24 日 意图识别是面向目标对话系统的一项重要任务。意图识别(有时也称为意图检测)是使用标签对每个用户话语进行分类的任务&#xff0c;该标签…...

Java架构师之路五、微服务:微服务架构、服务注册与发现、服务治理、服务监控、容器化等。

目录 微服务架构&#xff1a; 服务注册与发现&#xff1a; 服务治理&#xff1a; 服务监控&#xff1a; 容器化&#xff1a; 上篇&#xff1a;Java架构师之路四、分布式系统&#xff1a;分布式架构、分布式数据存储、分布式事务、分布式锁、分布式缓存、分布式消息中间件、…...

[计算机网络]--IP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、IP协议…...

MySQL问题记录

问题 Ubuntu2204 通过 apt 安装 mysql-server8.0.36 后&#xff0c;数次修改密码不生效&#xff0c;仍可无密码登录。 解决 mysql_native_password 是MySQL 5.7及之前版本使用的默认身份验证插件。在MySQL 8.0及更高版本中&#xff0c;默认的身份验证插件 caching_sha2_pass…...

LeetCode_Java_动态规划系列(1)(题目+思路+代码)

目录 斐波那契类型 746.使用最小花费爬楼梯 矩阵 120. 三角形最小路径和 斐波那契类型 746.使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。…...

Linux使用Docker部署在线协作白板WBO并结合内网穿透发布公网远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…...

petalinux烧写image.ub报错

xinlinx SDK烧写petalinux生成的BOOT.BIN和image.ub时&#xff0c;BOOT.BIN烧写正常&#xff0c;image.ub烧写报错如下 Erase Operation failed. INFO: [Xicom 50-44] Elapsed time 0 sec.ERROR: Flash Operation Failed串口助手操作擦除flash如图&#xff1a; 解决方法&am…...

[足式机器人]Part2 Dr. CAN学习笔记-Ch00-2 - 数学知识基础

本文仅供学习使用 本文参考: B站:DR_CAN 《控制之美(卷1)》 王天威 《控制之美(卷2)》 王天威 Dr. CAN学习笔记-Ch00 - 数学知识基础 Part2 4. Ch0-4 线性时不变系统中的冲激响应与卷积4.1 LIT System:Linear Time Invariant4.2 卷积 Convolution4.3 单位冲激 Unit Impulse—…...

【Linux】head命令使用

head命令 head是一个在 Unix 和 Unix-like 操作系统中常用的命令行工具&#xff0c;用于输出文件的前 n 行。默认为 10&#xff0c;即显示 10 行的内容。 语法 head [options] [file(s)] head命令 -Linux手册页 选项及作用 执行令 &#xff1a; head --help 执行命令结果…...

【书籍分享 • 第三期】虚拟化与容器技术

文章目录 一、本书内容二、读者对象三、编辑推荐四、前言4.1 云计算技术的发展4.2 KVM、Docker4.3 本书内容简介4.4 作者简介 五、粉丝福利 一、本书内容 《虚拟化与容器技术》通过深入浅出的方式介绍KVM虚拟化技术与Docker容器技术的概念、原理及实现方法&#xff0c;内容包括…...

数据结构之:堆

堆&#xff08;Heap&#xff09;是计算机科学中的一种特别的完全二叉树结构&#xff0c;它满足某种特定顺序&#xff0c;用于实现优先队列等数据结构。堆主要有两种类型&#xff1a;最大堆&#xff08;Max Heap&#xff09;和最小堆&#xff08;Min Heap&#xff09;。 定义 …...

助力探索社交出海最短变现路径,融云 1V1 音视频「限时免费」

在社交赛道&#xff0c;1V1 业务是最好的切入点。 对于初创公司来说&#xff0c;1V1 业务的技术成本和运营成本相对可控&#xff0c;并且具备与秀场直播等业务融合拓展的巨大空间。未来&#xff0c;相信 1V1 业务会吸引更多开发者投身其中。 一位社交出海经验丰富的从业者曾在…...

汇编工具理解

当百度读取键盘敲入字符等得到的代码&#xff0c;譬如如下 section .datainput_buffer db 1 ; 保存输入字符的变量section .text global _start_start:mov eax, 3 ; 设置文件描述符为0 (stdin)xor ebx, ebx ; 清空ebx寄存器mov edx, 1 ; 要读取的字…...

Leetcoder Day21| 回溯理论基础+组合

语言&#xff1a;Java/Go 回溯理论基础 回溯函数也就是递归函数&#xff1b; 所有回溯法的问题都可以抽象为树形结构&#xff1b; 回溯法解决的都是在集合中递归查找子集&#xff0c;集合的大小就构成了树的宽度&#xff0c;递归的深度&#xff0c;都构成的树的深度。 适用的题…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...