树莓派4B使用opencv获取Camera Module 3摄像头图像(解决无法直接获取图像的问题)

avatar
作者
猴君
阅读量:0

一、遇到的问题

莓派4B在使用官方的Camera Module 3摄像头时,无法通过opencv直接获取到图像,具体问题表现在opencv可以打开摄像头但是无法获取到图像信息,导致imshow等方法因无法获取图像数据进而报错,只能使用picamera2库进行图像的获取和和处理,对不熟悉picamera2库的同学不够友好;
[INFO]注意: 本教程的环境是树莓派4B+2023-05-03-raspios-bullseye-arm64镜像,不保证其他镜像是否可行。


二、为什么是picamera2?

树莓派官方提供的picamera2库是针对libcamera驱动提供的python库。
注意:Picamera2仅支持Raspberry Pi OS Bullseye 镜像
更多信息请访问
–官方PDF文档
https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
–微雪电子文档
https://www.waveshare.net/wiki/RPi_Camera_picamera2_Guide

三、准备工作

1.目录结构

目录结构

2.树莓派摄像头状态

在安装好摄像头之后,不用通过sudo raspi-config打开摄像头,如果打开了会报错,最终状态应该如下图所示
在这里插入图片描述

四、使用步骤

1.安装picamera2

如果安装的过程较慢,应该进行树莓派换源使用国内进行进行安装和更新,具体过程请自行查找

sudo apt update sudo apt upgrade sudo apt install -y python3-picamera2 

2.初始化picamera2

Picamera2_Img_et.py

from picamera2 import Picamera2 from libcamera import controls   class Imget:     def __init__(self):         # 创建一个Picamera2对象的实例         self.cam = Picamera2()          # 设置相机预览的分辨率         self.cam.preview_configuration.main.size = (640, 360)         self.cam.preview_configuration.main.format = "RGB888"         # 设置预览帧率         self.cam.preview_configuration.controls.FrameRate = 50         # 对预览帧进行校准         self.cam.preview_configuration.align()         # 配置相机为预览模式         self.cam.configure("preview")         # 设置相机控制参数为连续对焦模式(自动对焦)         self.cam.set_controls({"AfMode": controls.AfModeEnum.Continuous})         # 启动相机         self.cam.start()      def getImg(self):         # 获取相机捕获的图像数组(numpy数组)         frame = self.cam.capture_array()         # 返回捕获的图像数组         return frame      def __del__(self):         self.cam.stop()         self.cam.close() 

3.树莓派4B安装python-opencv

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn opencv-python 

4.使用opencv获取图像

opencv.py

import cv2 as cv  # 导入OpenCV库 from Picamera2_Img_et import Imget  # 自定义模块Imget中的类Imget  getImg = Imget()  # 创建Imget对象实例 while True:  # 进入循环,持续运行     frame = getImg.getImg()  # 调用Imget对象的getImg方法获取帧图像      cv.imshow('frame', frame)  # 在窗口中显示帧图像,窗口名称为'frame'      if cv.waitKey(1) & 0xFF == ord('q'):  # 若按下的字符为'q'时退出循环         break  cv.destroyAllWindows()  # 销毁所有窗口  

5.运行结果

在这里插入图片描述

总结

通过对picamera2获取图像的封装,就可以使用opencv对摄像进行操作,使用opencv的各种处理函数会更加的方便。有问题可以留言,一起解决。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!