从零开始使用树莓派debian系统使用opencv4.10.0进行人脸识别(保姆级教程)
一、总体架构
本文主要是使用树莓派自带的csi摄像头,搭配上opencv4.10.0进行物体的识别。本文使用的环境是python3.7.3,环境不一样有可能安装的opencv的过程也会很不一样,但是python的环境我们可以自己自行安装。
二、树莓派系统的安装
本文使用了树莓派官方给的镜像烧录软件Raspberry Pi Imager来烧录镜像,该软件的下载地址是:
https://www.raspberrypi.com/software/
打开之后我们选择raspberry pi4。
然后选择Raspberry Pi OS(other),选择Legacy,64-bit,为什么要选择64位的系统呢,因为在opencv中通常会用到大量的图像处理的过程的,所以用64位的系统可以大大加快我们处理的速度。作者建议你们最好不要下载在烧录软件一开始的那个镜像,那个镜像是Bookworm的,有些是和opencv的依赖包是不适配的,所以会导致一系列的问题,你甚至连依赖包可能都不能下载完整,所以还是选择稳定一点的镜像比较好。
在下载之前,该烧录软件会让你设置你的WiFi用户名还有ssh的东西,设置完之后就等待烧录完成。
使用ssh登录树莓派。
使用MobaXterm开发工具就可以使用ssh连接树莓派了,MobaXterm是一个强大的开发工具,他提供了多种的连接方式,也提供了 X-server,X-server可以
三、opencv的安装
3.1 换源
3.1.1 查看系统的版本
你系统的版本决定了你后面换源的时候所要换成的源,如果你的系统是bookworm的,但是你却放了个buster的源,这样系统在你sudo update的时候就会报错说你的源并不适用于arm64的架构,所以首先我们要先看系统的版本。
lsb_release -a
此处可见我的操作系统的版本是bullseye,确定了版本之后就可以开始换源了。
3.1.2 给树莓派换源
sudo nano /etc/apt/sources.list
将里面的东西全部删掉或者注释掉,换成清华或者阿里云的源,本文使用的是清华源。
deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
替换之后就是这样子了。
然后再替换下面这个。
sudo nano /etc/apt/sources.list.d/raspi.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
替换完如下图。
要特别注意你自己树莓派的操作系统的版本,如果不是bullseye的话,请自行更换,其实就是将bullseye换成你自己的操作系统的版本。
3.2 更换Python的环境
3.2.1 查看Python的版本
使用python --version查看你当前python的版本,如果是3.8以上的python,作者建议你还是把他换掉,换成3.8以下的版本,因为3.9版本的很多bug,而且有很多时候可能会和opencv在某些东西上会不适配,所以为了不必要的麻烦,作者还是建议你们将python的版本换成3.8以下的,作者的python的版本是3.9.2的,所以我将安装python3.7.3,python3.7.3的版本比较稳定,作者选择这个版本来作为opencv的运行环境。
python --version
3.2.2 编译安装python3.7.3
首先要更新一下,这步很重要,不更新的话很可能会报错。
sudo apt update
下载依赖项
sudo apt install build-essential libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev
下载python3.7.3的安装包
cd /usr/src
sudo wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
下完之后,进行编译安装
sudo tar xzf Python-3.7.3.tgz
cd Python-3.7.3
sudo ./configure --enable-optimizations
sudo make altinstall
最后一步一定要注意,一定要用 altinstall,不然你系统现有版本的python的版本会被覆盖的,所以要用altinstall防止现有版本的python被覆盖了。编译安装的过程时间可能会有点长,所以请耐心等待。
完成编译之后,检查是否成功安装:
python3.7 --version
通过以下命令检查当前 Python 3.7 的实际路径,以确认是哪个版本被配置到了
which python3.7
到此,你的python3.7.3版本就成功安装到树莓派系统上了。
3.3 创建虚拟环境
在安装opencv之前,我们最好是在一个虚拟环境中来运行,虚拟环境可以隔离项目依赖,防止不同项目间的库版本冲突。例如说你另外一个项目是需要python3.9的,但是opencv只需要python3.7的,这样就产生了冲突,所以做好是使用虚拟环境来运行opencv。
安装虚拟环境管理包
sudo apt install python3-venv
创建虚拟环境,这里最好是用python3.7这样明确的python环境来创建,不然可能会把你系统的python3.9误认为是用他创建虚拟环境,导致错误。
python3.7 -m venv opencvENV #你自己想要起的名字
创建完之后也可以检查一下虚拟环境的python版本是否是python3.7
如果遇到了创建虚拟环境失败,例如下图,可以试试以下的办法。
1. 直接创建,跳过pip,后续再自己安装,python3.7 -m venv --without-pip opencvENV
2.看看你自己系统的python是哪个版本,如果是3.7.3的话,将其替换回3.9的,再创建。(作者也不知道为什么用了这个方法就创建成功了,有点奇怪)
然后就是激活虚拟环境了。
source opencvENV/bin/activate
如果想退出虚拟环境的话,就使用以下命令。
deactivate
激活虚拟环境之后,会在你主机名前面会出现你虚拟环境的名字,说明虚拟环境设置成功。
3.4 安装opencv
此处下载使用了清华源作为加速,用官方的源下载太慢了。
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
如果报此错误,就更新一下pip,因为pip版本太老了,导致有些依赖不匹配。
pip install --upgrade pip setuptools
再次尝试安装opencv。
运行以下命令,验证是否能成功导入opencv。
python -c "import cv2; print(cv2.__version__)"
现在已经成功安装了 OpenCV 4.10.0!可以正常使用 OpenCV 进行开发了。
四、opencv案例测试
4.1 打开树莓派的摄像头
使用raspi-config命令来打开树莓派的系统配置,在里面将树莓派的摄像头enable。
sudo raspi-config
打开之后就是这样的界面,然后选择Interface Options
然后将Legacy Camera 打开就行,打开之后就直接重启树莓派就可以应用了。
4.2 摄像头测试
安装摄像头的过程略,其实就是把有颜色的那面排线朝向网口那边就行了。下面介绍两个测试你的摄像头是否能用的方法,没有兴趣或者确定自己摄像头能用的读者可直接跳过。
4.2.1 通过libcamera来测试
如果想测试一下摄像头的显示是否正常的话,你可以用libcamera来测试一下是否能正常显示,但是要注意,现在的摄像头的驱动都是新的,所以要去修改一些东西,使树莓派系统使用新的摄像头驱动。
sudo nano /boot/config.txt
找到这段语句,将start_x=1屏蔽掉,再在文件的最后加入gpu_mem=128这段话,将树莓派重启sudo reboot之后,就可以开始测试摄像头是否能用了。
执行libcamera-hello,就可以成功测试到你的摄像头是否能用了,此时在mobaxterm的x-server上,会显示出你当时的摄像头所显示出来的东西。
libcamera-hello
当使用回opencv的时候,需要把 start_x=1给放出来,因为目前树莓派使用的摄像头驱动是新的驱动,而opencv现在还是使用的旧驱动,所以这两者之间就产生了冲突,简而言之就是可以每次只能使用其中一个,另外一个就用不了,所以取舍一下就把libcamera给舍弃掉了。
4.2.2 通过vcgencmd get_camera来测试
修改config.txt文件,在文件的最后面加入gpu_mem=128。
sudo nano /boot/config.txt
sudo reboot
重启完之后,运行以下命令,检查树莓派是否识别到了摄像头。
vcgencmd get_camera
如果成功识别到了,就会显示出以下的东西,要注意的是,如果把start_x=1给屏蔽了,这几个都是会显示为0的,也就是没有识别到摄像头,原因也是像上面说的一样,驱动不一样,所以导致无法识别到摄像头的存在。
4.3 案例测试
4.3.1 安装pyzbar库
在虚拟环境中使用pip命令来安装pyzbar库。
pip install pyzbar
4.3.2 程序编写
本文所写的案例是识别二维码的,当在虚拟环境中运行py代码的时候,树莓派的csi摄像头会启动来识别到二维码。
首先先创建一个用来放代码的文件夹。
sudo mkdir -p myprojects
然后在此文件夹下可以直接创建一个py文件来放程序。
sudo nano read.py
程序的完整代码如下:
二维码检测代码。
# coding:utf8import cv2
import pyzbar.pyzbar as pyzbardef decodeDisplay(image, image1):barcodes = pyzbar.decode(image)for barcode in barcodes:# 提取条形码的边界框的位置# 画出图像中条形码的边界框(x, y, w, h) = barcode.rectcv2.rectangle(image1, (x, y), (x + w, y + h), (0, 0, 255), 2)# 条形码数据为字节对象,所以如果我们想在输出图像上# 画出来,就需要先将它转换成字符串barcodeData = barcode.data.decode("utf-8")barcodeType = barcode.type# 绘出图像上条形码的数据和条形码类型text = "{} ({})".format(barcodeData, barcodeType)cv2.putText(image1, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,.5, (0, 0, 125), 2)# 向终端打印条形码数据和条形码类型print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))return image1def detect():cap = cv2.VideoCapture(0)if not cap.isOpened():print("[ERROR] Could not open video device")returnwhile True:# 读取当前帧ret, img = cap.read()if not ret or img is None:print("[ERROR] Failed to capture image")break# 转为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)im = decodeDisplay(gray, img)key = cv2.waitKey(5)cv2.namedWindow('image', 0)cv2.resizeWindow('image', 700, 500)cv2.imshow("image", im)if key == 27: # ESC 键退出breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':detect()
写完代码之后,就可以直接运行该文件了。
python read.py
执行之后,在x-server可以看到当前的画面,此时你把一个二维码放上去,就可以识别出来了。
由于二维码里面有隐私信息,所以我就不把识别出来的东西放出来了,总之就是就是会提示你识别到二维码了。
五、人脸识别
cd ~/openENV/myprojects
把文件clone下来。
git clone https://gitee.com/jeebus/Facial_Recognition.git
cd Facial_Recognition
首先可以试着检测一下摄像头,这时会出现一个灰色的,一个正常显示的。
python simpleCamTest.py
这时候你的摄像头是翻转的,需要在代码中修改或者反转你自己的摄像头。
最后运行人脸识别的代码。
python faceDetection.py
如果想要修改摄像头翻转的话,就要进入代码中修改。
sudo nano faceDetection.py
将一开始代码中的 img = cv2.flip(img,-1) 将那个 -1 改成1,就可以解决摄像头翻转的问题了。
再次运行程序,就能正常显示了。
他不仅能够直接使用人脸识别的案例,他还可以自己训练自己的模型,就是使用那个01_face_dataset.py程序来采集你自己想要识别的人脸,他会采集30张照片,随后使用02_face_training.py就可以训练你自己的模型了,最后使用03_face_recognition.py就可以识别你刚刚采集的人脸了,这里作者就不演示了,请读者自行去试试。
六、结语
现在这个只是 一个简单的人脸识别的案例,后续读者可以自己训练模型或者在opencv的官方库里面找一些案例来试着运行,opencv的官方库的地址如下:
opencv/samples/python at 4.x · opencv/opencv · GitHub
里面有用python程序写的一些案例,例如说边缘检测什么的,后续更多的功能就交给读者去开发了。
相关文章:

从零开始使用树莓派debian系统使用opencv4.10.0进行人脸识别(保姆级教程)
一、总体架构 本文主要是使用树莓派自带的csi摄像头,搭配上opencv4.10.0进行物体的识别。本文使用的环境是python3.7.3,环境不一样有可能安装的opencv的过程也会很不一样,但是python的环境我们可以自己自行安装。 二、树莓派系统的安装 本文…...

golang qq邮件发送验证码
验证码的使用场景 注册/登录:使用验证码可以有效减少垃圾账号注册和恶意登录;短信接口保护:高效减少防止短信接口被刷情况;提交/投票:有效减少恶意刷单、恶意提交、恶意投票等情况;密码找回:用…...

鸿蒙 OS 开发单词打卡 APP 项目实战 20240922 笔记和源码分享
配套有完整的录播课, 需要的私信. 零基础入门级别, 有点前端基础都能学会. 效果截图: 代码截图: 页面完整代码: import { AnswerStatus } from ../enums/AnswerStatus import { PracticeStatus } from ../enums/PracticeStatus import { getRandomQuestions, Question …...

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs
代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目,很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…...

使用Python Pandas导入数据库和文件数据
大家好,在数据分析过程中,数据的导入是第一步,也是最重要的一步。Python的Pandas提供了强大的数据读取功能,支持从多种数据源导入数据,包括CSV、Excel、JSON、SQL数据库、网页等。Pandas库不仅能够处理常见的文件格式&…...

lef 中antenna解释
这些规则主要涉及集成电路设计中的天线效应(Antenna Effect)和通孔(Via)设计规则。 ANTENNAAREADIFFREDUCEPWL 这条规则指定了一个分段线性函数,用于根据连接到切割层的扩散区面积来计算cut_area的缩减因子。扩散区面积值应从0开始单调增加。如果没有定义此规则,PAR(mi)方程中的…...

初试Bootstrap前端框架
文章目录 一、Bootstrap概述二、Bootstrap实例1、创建网页2、编写代码3、代码说明4、浏览网页,查看结果5、登录按钮事件处理6、浏览网页,查看结果 三、实战小结 一、Bootstrap概述 大家好,今天我们将一起学习一个非常流行的前端框架——Boot…...

mysql数据库:超键、候选键、主键与外键
mysql数据库:超键、候选键、主键与外键 1、超键(Superkey)2、候选键(Candidate Key)3、主键(Primary Key)4、外键(Foreign Key) 💖The Begin💖点点…...

音频转MP3格式困难?如何轻松实现wav转mp3?
格式多样化为我们带来了灵活性和创意的无限可能,但同时,不同格式间的转换也成为了不少用户面临的难题。尤其是当你手握珍贵的WAV音频文件,却希望它们能在更多设备上流畅播放或节省存储空间时,wav转mp3的需求便应运而生。WAV以其无…...

基于vue框架的大连盐业有限公司生产管理系统的设计与实现3hk5y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
系统程序文件列表 项目功能:计划员,工艺员,生产建模,生产计划,生产信息,生产监视,工艺质量,盐政信息 开题报告内容 一、引言 随着信息技术的飞速发展和市场竞争的日益激烈,传统盐业企业如大连盐业有限公司正面临着转型升级的迫切需求。传统管理模式下…...

《深入理解JAVA虚拟机(第2版)》- 第13章 - 学习笔记【终章】
第13章 线程安全与锁优化 13.1 概述 面向过程的编程思想 将数据和过程独立分开,数据是问题空间中的客体,程序代码是用来处理数据的,这种站在计算机角度来抽象和解决问题的思维方式,称为面向对象的编程思想。 面向对象的编程思想…...

网络工程师学习笔记——网络互连与互联网(三)
TCP三次握手 建立TCP连接是通过三次握手实现的,采用三报文握手主要是为了防止已失效的连接请求报文突然又传送到了,因而产生错误 主动发起TCP连接建立的称为客户端 被动等待的为TCP服务器,二者之间需要交换三个TCP报文段 首先是客户端主动…...

【Tomcat】常见面试题整理 共34题
文章目录 1. 简述什么是Tomcat?2. Tomcat的缺省端口是多少,怎么修改?3. 简述Tomcat 目录结构及作用4. 简述Tomcat有几种部署方式?5. 简述Tomcat容器是如何创建servlet类实例?6. Tomcat有哪几种Connector运行模式&#…...

到时间没回家又不接电话?如何迅速确定孩子的位置?
当孩子未按时回家且无法通过电话联系时,家长往往会感到焦虑。此时,如何迅速确定孩子的位置成为许多家长迫切需要解决的问题。 利用智能手机定位技术是最常见的方法之一。大多数智能手机都内置GPS定位功能,通过“查找设备”应用,家…...

接口自动化--commons内容详解-02
上篇文章主要讲解了接口自动化主要架构框架,这篇文庄主要讲解commons中的内容 1. requests_utils.py 首先讲解这个工具类,主要是因为在接口自动化中,基本都有的接口都是发送请求,获取响应结果,唯一不同的是࿰…...

WanFangAi论文写作研究生论文写作神器在线生成真实数据,标注参考文献位置,表格公式代码流程图查重20以内,研究生论文写作技巧
WanFangAi是一个专业的学术论文辅助平台,它提供了一系列工具来帮助用户提升论文写作的效率和质量。以下是WanFangAi的一些核心功能:1.主题探索与文献搜索:用户可以输入关键词和研究领域,WanFangAi会迅速推荐合适的论文主题并提供相关的文献搜索服务。系统…...

cv2.waitkey(30) 按键盘无效
cv2.imshow("detection", color_image) # 窗口显示,显示名为 Capture_Videok cv2.waitKey(100) & 0xFF # 每帧数据延时 1ms,延时不能为 0,否则读取的结果会是静态帧 if k ord(s): # 键盘按一下s, 保存当前照片和机械臂位姿…...

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解
【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解 题目传送门 题解 CSP-S1 补全程序,致敬全 A 的答案,和神奇的预言家。 写一下这篇的题解说不定能加 CSP 2024 的 RP 首先看到 k k k 这么大的一个常数,就想到了二分。然后写一个判…...

Ubuntu24.04 安装ssh开启22端口及允许root用户远程登录
1、安装openssh-server插件开启22端口访问 # 安装ssh会默认启动服务并开启22端口 apt update apt install openssh-server 2、开启root用户远程访问 激活root用户,设置root用户登录密码 hunterlocalhost:/$ sudo passwd root New password: Retype new password…...

STM32基础学习笔记-DHT11单总线协议面试基础题7
第七章、DHT11: 单总线协!议 常见问题 1、DHT11是什么 ?有什么特性 ? 2、单总线协议是什么 ?原理 ?DHT11的单总线协议的组成 ? ## 1、DHT11定义 单总线协议是一种用于在多个设备之间进行通信的协议,所有…...

Redisson分布式锁的概念和使用
Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁?1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出ÿ…...

uniapp小程序持续获取用户位置信息,后台位置获取
做一个小程序持续获取用户位置信息的功能,即使小程序切换到后台也能继续获取,getLocation这个api只有小程序在前台才能获取位置,所以不用这个 先申请一个腾讯地图key 在uniapp项目配置源码视图里加上这个代码 先获取权限,再开启…...
优化算法(五)—梯度下降算法(附MATLAB程序)
梯度下降算法(Gradient Descent)是一种常用的优化算法,用于寻找函数的局部最小值。它通过沿着函数梯度的反方向迭代地调整变量,以逐步找到最优解。梯度下降广泛应用于机器学习和深度学习中,特别是在训练模型时优化损失…...

TypeScript 设计模式之【单例模式】
文章目录 **单例模式**: 独一无二的特工我们为什么需要这样的特工?单例模式的秘密:如何培养这样的特工?特工的利与害代码实现单例模式的主要优点单例模式的主要缺点单例模式的适用场景总结 单例模式: 独一无二的特工 单例模式就像是一个秘密组织里的特殊特工。这…...

UDP与TCP那个传输更快
UDP(用户数据报协议)和 TCP(传输控制协议)是互联网协议栈中常用的两种传输层协议。它们在设计和应用上存在一些显著的差异,导致在传输速度和可靠性等方面表现不同。以下是它们之间的比较,特别是关于传输速度…...

如何把PDF样本册转换为网址链接
随着互联网的普及,将纸质或PDF格式的样本册转化为网址链接,以便于在线浏览和分享,变得越来越重要。本文将为您详细讲解如何将PDF样本册转换为网址链接,让您轻松实现线上展示和分享。 一、了解PDF样本册与网址链接 1. PDF样本册…...

centos7 semanage 离线安装 SELinux
centos7 semanage 离线安装 还是参考一下 换成阿里云的源 之后 ,在线更新不,不要用离线安装 centos7 更新 yum源 为 阿里云 LTS https://blog.csdn.net/wowocpp/article/details/142517908 CentOS7安装时使用"基础服务器"选项安装, 后发现没…...

磨具生产制造9人共用一台工作站
随着技术的不断进步与工业自动化的深入发展,如何优化生产流程、提高设备利用率成为了众多企业面临的重大课题。那么在磨具生产制造中实现9人共用一台工作站呢? 一、背景与挑战 在磨具制造行业,高精度、高效率的生产要求与复杂多变的工艺流程…...

Qt clicked()、clicked(bool)、toggled(bool)信号的区别和联系
clicked() 信号 所属控件:clicked()信号是QAbstractButton类(及其子类,如QPushButton、QRadioButton、QCheckBox等)的一个信号。clicked信号可以说是许多控件(特别是按钮类控件,如QPushButton)…...

nginx实现负载均衡的分发策略
文章目录 分发策略 分发策略 轮询策略 轮询策略是最简单的负载均衡策略之一。Nginx 默认采用轮询方式将请求分发到不同的后端服务器。它将请求按照顺序轮流分配给每个后端服务器,不论服务器当前的负载情况如何。这种策略适合后端服务器性能相近且无太大差异的场景。…...