从零开始使用树莓派debian系统使用opencv4.10.0进行人脸识别(保姆级教程)

news2024/9/27 5:27:33

一、总体架构

        本文主要是使用树莓派自带的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:utf8

import cv2
import pyzbar.pyzbar as pyzbar

def decodeDisplay(image, image1):
    barcodes = pyzbar.decode(image)
    for barcode in barcodes:
        # 提取条形码的边界框的位置
        # 画出图像中条形码的边界框
        (x, y, w, h) = barcode.rect
        cv2.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 image1

def detect():
    cap = cv2.VideoCapture(0)

    if not cap.isOpened():
        print("[ERROR] Could not open video device")
        return

    while 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 键退出
            break

    cap.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程序写的一些案例,例如说边缘检测什么的,后续更多的功能就交给读者去开发了。 

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

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

相关文章

江协科技STM32学习- P19 TIM编码器接口

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

亲身体验Llama 3.1:开源模型的部署与应用之旅

文章目录 1 Llama 3.1系列的诞生2 大型模型的未来发展3 使用教程4 Llama 3.1在客户服务中的运用 1 Llama 3.1系列的诞生 在人工智能的浪潮中,大型语言模型(LLM)正以其独特的魅力和潜力,成为深度学习领域的一颗耀眼明星。 这些模…

计算机毕业设计Hadoop+Spark知识图谱体育赛事推荐系统 体育赛事热度预测系统 体育赛事数据分析 体育赛事可视化 体育赛事大数据 大数据毕业设计

《HadoopSpark知识图谱体育赛事推荐系统》开题报告 一、研究背景及意义 随着互联网技术的迅猛发展和大数据时代的到来,体育赛事数据的数量呈爆炸式增长。用户面对海量的体育赛事信息,常常感到信息过载,难以快速找到感兴趣的赛事内容。如何高…

锐捷—NAT地址映射+IPsec隧道

任务目标 在出口路由器R3上将R5私网地址1对1映射的公网地址与R1建立IPsec隧道,使得R4在访问R5的映射公网地址时,可以进行IPsec隧道的转发 要求: 1、R4和R5可通过NAT转换正常访问互联网地址(R2的lo0) 2、R5的私网地…

云手机群控怎么用?有什么优势?

群控系统,顾名思义,是用于批量控制多部手机的工具,能够通过计算机或客户端同时管理多台设备。借助群控系统,用户可以在电脑上操作多部手机,模拟真实操作场景,从而大幅提升工作效率,并有效控制管…

calibre-web默认左上角字体修改

calibre-web默认左上角字体修改 如图: 有些奇异,如果想变成正常的常规字体,需要修改: cps\static\css\style.css 下的代码: 默认是GrandHotel-Regular: 换成其他字体即可。其他字体在 calibre-web\cps\s…

图像处理04

图像处理 问题:把不规则的图片按照参考图摆放 步骤: 1. 用ORB找关键点 2. 关键点匹配 3. 根据上一步匹配的关键点得出单应性矩阵 4. 根据单应性矩阵对不规则进行透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimgl cv2.imrea…

微信小程序 - 最新详细安装使用 Vant weapp UI 框架环境搭建详细教程

前言 自从 2024 年开始,小程序做了很多改变和升级, 导致网上很多搭建教程文章的教程失效了,本文来做最新的教程。 第一步 为了更贴合新手,我这里创建了一个纯净无任何业务代码的小程序项目。

【AI基础】pytorch lightning 基础学习

传统pytorch工作流是首先定义模型框架,然后写训练和验证,测试循环代码。训练,验证,测试代码写起来比较繁琐。这里介绍使用pytorch lightning 部署模型,加速模型训练和验证,记录。 准备工作 1 安装pytorch…

铨顺宏科技携RTLS+RFID技术亮相工博会!

中国国际工业博览会盛大开幕! 铨顺宏科技展亮点速递 铨顺宏科技展位号:F117 中国国际博览会今日开幕,铨顺宏科技携创新产品亮相,吸引众多参观者。 我们珍视此次国际盛会,将全力以赴确保最佳体验。 工作人员热情解答…

实时数字人DH_live使用案例

参看: https://github.com/kleinlee/DH_live ubuntu 测试 apt install ffmpeg 下载安装: git clone https://github.com/kleinlee/DH_live.git cd DH_liveconda create -n dh_live python=3.12 conda activate dh_live pip install -r requirements.txt pip install torch -…

E. Alternating String

E. Alternating String 这道题就是前缀和的变化, 现在做起来比较简单, 打这场的时候差了点时间就做出来了 代码 #include <bits/stdc.h> #define int long long using namespace std;const int N 200010;int od[N][30], ev[N][30]; int n;void init() {for(int i 0; …

【Linux篇】常用命令及操作技巧(进阶篇 - 上)

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 文章目录&#xff1a; Linux常用命令以及操作技巧&#xff08;进阶&#xff09;前言一、远程管理常用命令1、关机/重启shutdown命令 二、查看或配置网卡信息2、网卡和IP地址网卡IP地址ifconfig命令ping命令 三、SSH基础1.…

Dart中FFI学习

Flutter中FFI学习 Dart FFI编程概述NativeType&#xff08;类型映射&#xff09;Window安装GCCDart调用C的函数数组字符串结构体 Dart FFI编程 概述 dart:ffi库可以使用Dart语言调用本地C语言API ,并读取、写入、分配和删除本地内存。FFI是指外部函数接口&#xff08;Foregin…

JS设计模式之组合模式:打造灵活高效的对象层次结构

引言 当我们构建复杂的应用程序时&#xff0c;经常会遇到处理对象层次结构的情况。这些层次结构通常是树形结构&#xff0c;由组合节点和叶子节点组成。在这样的情况下&#xff0c;JavaScript 设计模式之一的组合模式就能派上用场。 组合模式是一种结构型设计模式&#xff0c…

Gitlab学习(006 gitlab操作)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第21p-第24p的内容 文章目录 git登录修改root密码 设置修改语言取消相对时间勾选 团队管理创建用户创建一个管理员登录管理员账号创建一个普通用户登录普通用户账号 群组管理…

工业交换机一键重启的好处

在当今高度自动化和智能化的工业环境中&#xff0c;工业交换机作为网络系统中至关重要的一环&#xff0c;其稳定性和可靠性直接影响到整个生产过程的顺利进行。为了更好地维护这些设备的健康运行&#xff0c;一键重启功能应运而生&#xff0c;并呈现出诸多显著的好处。 首先&am…

助力降本增效,ByteHouse打造新一代云原生数据仓库

随着数据量的爆炸式增长、企业上云速度加快以及数据实时性需求加强&#xff0c;云原生数仓市场迎来了快速发展机遇。 据 IDC、Gartner 研究机构数据显示&#xff0c;到 2025 年&#xff0c;企业 50% 数据预计为云存储&#xff0c;75% 数据库都将运行在云上&#xff0c;全球数据…

Swagger配置且添加小锁(asp.net)(笔记)

此博客是基于 asp.net core web api(.net core3.1)框架进行操作的。 一、安装Swagger包 在 NuGet程序包管理中安装下面的两个包&#xff1a; swagger包&#xff1a;Swashbuckle.AspNetCore swagger包过滤器&#xff1a;Swashbuckle.AspNetCore.Filters 二、swagger注册 在…

数据结构——初始树和二叉树

线性结构是一对一的关系&#xff0c;意思就是只有唯一的前驱和唯一的后继&#xff1b; 非线性结构&#xff0c;如树形结构&#xff0c;它可以有多个后继&#xff0c;但只有一个前驱&#xff1b;图形结构&#xff0c;它可以有多个前驱&#xff0c;也可以有多个后继。 树的定义…