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

一、遇到的问题

莓派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的各种处理函数会更加的方便。有问题可以留言,一起解决。

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
在Android Camera2 API中,自动对焦的坐标是从[-1000, 1000]的范围内进行定义的,其中(0, 0)表示图像的中心。 如果您需要将屏幕上的触摸坐标转换为适合于自动对焦的坐标,可以使用以下代码: ```java private MeteringRectangle[] getFocusAreaRect(float x, float y) { int areaSize = 200; int left = clamp((int) x - areaSize / 2, 0, mTextureView.getWidth() - areaSize); int top = clamp((int) y - areaSize / 2, 0, mTextureView.getHeight() - areaSize); RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); return new MeteringRectangle[]{new MeteringRectangle(rectF, 1000)}; } private int clamp(int value, int min, int max) { return Math.max(min, Math.min(max, value)); } ``` 这个方法将返回一个MeteringRectangle数组,其中包含一个矩形区域,该区域是在屏幕上给定的x和y坐标周围的一个固定大小。在这个例子中,我们使用了一个200x200像素的矩形区域。您可以根据需要更改这个值。 接下来,您可以将这个MeteringRectangle数组传递给CameraCaptureSession的setRepeatingRequest方法,就可以开始自动对焦了。 ```java RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); MeteringRectangle[] meteringRectangle = new MeteringRectangle[]{new MeteringRectangle(rectF, 1000)}; CameraCaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START); builder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectangle); builder.set(CaptureRequest.CONTROL_AF_REGIONS, meteringRectangle); cameraCaptureSession.setRepeatingRequest(builder.build(), null, backgroundHandler); ``` 这个代码片段将启动自动对焦。请注意,我们使用了CONTROL_AF_TRIGGER_START触发器来开始自动对焦。在对焦完成后,您可以使用相同的代码将触发器设置为CONTROL_AF_TRIGGER_CANCEL,以停止自动对焦。 希望这可以帮助您解决您的问题
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PrimeJr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值