• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【 DigiKey DIY原创大赛】基于树莓派5B和CSI摄像头的手势控制---环境准备

第一部分:

Python 虚拟环境的使用

Python开发中如何使用virtualenv和venv创建与管理虚拟环境,确保不同项目间库的隔离。通过安装virtualenv,创建不含系统包的纯净环境,然后激活和关闭虚拟环境。venv是Python3.3后的内置模块,创建和操作方式类似。使用虚拟环境可以避免项目间依赖冲突,确保开发环境的一致性。

有两个常用工具用于创建python“独立”环境:

venv is available by default in Python 3.3 and later, and installs pip and setuptools into created virtual environments in Python 3.4 and later.

virtualenv needs to be installed separately, but supports Python 2.7+ and Python 3.3+, and pip, setuptools and wheel are always installed into created virtual environments by default (regardless of Python version).

1.virtualenv

virtualenv

创建一个拥有自己安装目录的环境, 这个环境不与其他虚拟环境共享库, 能够方便的管理python版本和管理python库

安装

pip3 install virtualenv

创建

virtualenv  env1
virtualenv  --system-site-packages  env1//继承全局的库
virtualenv --no-site-packages env1//不带任何第三方包的环境

可以使用-p PYTHON_EXE选项在创建虚拟环境的时候指定python版本

#创建python2.7虚拟环境 
virtualenv -p /usr/bin/python2.7 ENV2.7 
#创建python3.4虚拟环境 
virtualenv -p /usr/local/bin/python3.4 ENV3.4

激活

source bin/activate

退出

deactivate

2.venv

venv不用安装,不过需要python3.3以上。

进入和退出该环境的方式和virtualenv一致。

3.参考文档

Installing Packages - Python Packaging User Guide

第二部分:解决树莓派原装libcamera(CSI)摄像头无法通过OPENMV读取数据问题

背景

主要是针对树莓派5B

树莓派镜像在Bullseye版本之后,底层的树莓派驱动由Raspicam切换成libcamera。libcamera是一个开源的软件栈,方便于第三方移植和开发自己的摄像头驱动。官方已经针对libcamera提供了pycamera2库,方便用户使用Python程序调用。

Picamera2仅支持Raspberry Pi OS Bullseye 以及更新的系统。

对于Raspberry Pi OS Bullseye以及更(四声)新的系统,picamera2已经预装在系统中,无法单独安装。

解决方法

使用Python的picamera2库调用摄像头,其直接输出的numpy.ndarray数据类型与opencv无缝衔接,完美替换上述opencv直接调用的方案。

测试程序

sudo apt install -y python3-picamera2
from picamera2 import Picamera2
import cv2
import time

#初始化
picam2 = Picamera2()    #创建摄像头对象开启摄像头,只能创建一次
picam2.start()    #开启摄像头,无需重复开启
time.sleep(1)

#抓拍
array = picam2.capture_array("main")    #捕获一帧相机数据,输出为numpy.ndarray类型,与opencv无缝连接

#使用opencv显示图像
cv2.imshow('test', array)
cv2.waitKey(0)    #按任意键关闭预览窗口
cv2.destroyWindow('test')

具体实施

简单测试摄像头

libcamera-hello -t 0 //打开一个视频流的预览窗口,持续时间为无穷大​

创建虚拟环境用于管理开发环境

python3 -m venv --system-site-packages myenv //继承系统环境的所有包,主要是picamera2​

给PIP换源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/​

测试程序

from picamera2 import Picamera2, Preview
import time

picam2 = Picamera2()
camera_config = picam2.create_preview_configuration()
picam2.configure(camera_config)
picam2.start_preview(Preview.QTGL)
picam2.start()
time.sleep(2)

picam2.capture_file("test.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20")​

第三部分:

Picamera的使用

树莓派5,无法用原有方法连接CSI接口摄像头视频使OpenCV处理,调用Picamera2库才能使用。

安装Picamera2

sudo apt install python3-picamera2

基本使用

Picamera2 的基本使用方法包括初始化摄像头、配置摄像头参数、捕捉图像或视频流,以及处理捕捉的数据。

1.初始化摄像头

from picamera2 import Picamera2

# 初始化 Picamera2
picam2 = Picamera2()

2.配置摄像头

在使用摄像头之前,需要配置摄像头参数。Picamera2 提供了多种配置方法,可以针对不同的用途进行优化。例如,可以配置摄像头用于预览、拍照或视频录制

preview_config = picam2.preview_configuration(main={"size": (640, 480)})
picam2.configure(preview_config)

3.启动摄像头

picam2.start()

4.捕捉图像

捕捉图像的方法有多种,可以捕捉单帧图像,也可以捕捉连续的视频帧。

# 捕捉单帧图像
frame = picam2.capture_array()

捕捉到的图像是一个 NumPy 数组,可以直接使用 OpenCV 进行处理。

5.处理图像

可以使用 OpenCV 对捕捉到的图像进行处理。例如,显示图像、转换颜色格式等:

import cv2

# 转换颜色格式(从 BGR 到 RGB)
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

# 显示图像
cv2.imshow('Captured Image', frame_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.停止摄像头

使用完成后,停止摄像头以释放资源:

picam2.stop()

7.调整摄像头参数

可以动态调整摄像头的各种参数,例如曝光、白平衡、ISO 等:

# 设置曝光模式为自动
picam2.set_controls({"ExposureTime": 20000})

# 设置白平衡模式为自动
picam2.set_controls({"AwbEnable": True})

8.处理视频流

import cv2
from picamera2 import Picamera2
from time import sleep

# Initialize Picamera2
picam2 = Picamera2()
config = picam2.create_preview_configuration(main={"format": 'XRGB8888', "size": (640, 480)})
picam2.configure(config)
picam2.start()

try:
    while True:
        # Capture frame from camera
        frame1 = picam2.capture_array()

        # Convert color space to grayscale
        gray = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

        # Apply adaptive thresholding
        binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                          cv2.THRESH_BINARY, 11, 2)

        # Find contours
        contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        # Loop through contours to find rectangles
        for cnt in contours:
            epsilon = 0.02 * cv2.arcLength(cnt, True)
            approx = cv2.approxPolyDP(cnt, epsilon, True)

            # Check if contour is a rectangle (4 points)
            if len(approx) == 4:
                # Draw contour (rectangle)
                cv2.drawContours(frame1, [approx], 0, (0, 255, 0), 3)

        # Display the original frame and the processed frame
        cv2.imshow('Camera', frame1)
        cv2.imshow('Adaptive Threshold Image', binary)

        # Exit on pressing 'q'
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        sleep(0.01)

finally:
    # Release resources
    picam2.stop()
    cv2.destroyAllWindows()

全部回复(0)
正序查看
倒序查看
现在还没有回复呢,说说你的想法