树莓派使用Raspberry Pi Camera Module 3(imx708),libcamera2 实现读取二维码

1. 使用2022年之后的树莓派官方镜像

2. 换国内源,根据官方教程,进行update

sudo apt-get update -y
sudo apt-get upgrade -y

3. 无需raspi-config开启camera选项

4. /boot/config.txt中无需更改,可以看到摄像头相关设置,不需要设置相机型号dtoverlay=imx708:

camera_auto_detect=1

5. 注意,常用的相机检测命令 vcgencmd get_camera 是检测不到相机的

6. 但是v4l2 检测指令  v4l2-ctl --list-devices 可以看到video0设备,

v4l2-ctl -d /dev/video0 --list-formats-ext 也能列出设备信息

7. 有一个坑,用xterm等远程操作软件进行libcamera-hello 会报错 instance of 'std::runtime_error'
, failed to import fd 21,事实上无需惊慌,这个指令要本地运行

libcamera-hello -t 0

在询问摄像头卖家时,告诉我他们在固件1.5上可以运行,怀疑是我1.4固件问题。后来发现1.4也没有问题。(输入pinout可以查看固件版本)

8. 使用libcamera2 实现读取二维码

安装好opencv,

#安装OpenCV的基础运行依赖
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libhdf5-dev libhdf5-serial-dev
sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev
#安装opencv,不要同时安装opencv-python和opencv-contrib-python,你只需要选择其中一个
#opencv-python只包含OpenCV库里的主要模块
#而opencv-contrib-python包含主要模块和contrib模块,几乎包含了全部功能
pip install opencv-contrib-python

#也可以直接
sudo apt-get install python3-opencv

字体fonts-wqy-zenhei

给树莓派装中文输入法
在终端输入
sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin
安装中文字体
sudo apt-get -y install ttf-wqy-zenhei
(注意,这里应为 'fonts-wqy-zenhei' 而非 'ttf-wqy-zenhei')
安装后重启,用Ctrl+空格来切换输入法

安装libcamera2库,pandas,numpy,python3-pyqt5 及其他依赖项

sudo apt install -y python3-picamera2 python3-pandas python3-numpy python3-pyqt5 

新建python文件,scanQR.py。在一定时间内扫码,扫到退出,超时退出

#!/usr/bin/python3
import cv2
from pyzbar.pyzbar import decode
import math
import time
import cv2, sys
import numpy as np
import pyzbar.pyzbar as zbar
from PIL import Image, ImageDraw, ImageFont
from picamera2 import MappedArray, Picamera2, Preview
from libcamera import controls


def get_platform():
    if sys.platform.startswith('win'):

        return 'win'
    elif sys.platform.startswith('linux'):
        return 'linux'
    else:
        return 'other'

def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    PLATFORM = get_platform()
    if PLATFORM == 'linux':
        fontStyle = ImageFont.truetype("font/wqy-zenhei.ttc", textSize, encoding="utf-8")
    elif PLATFORM=='win':
        fontStyle = ImageFont.truetype("C:/Windows/Fonts/simfang.ttf", textSize, encoding="utf-8")
    # 绘制文本
    draw.text((left, top), text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)


def get_2D():

    picam2 = Picamera2()
    # picam2.start_preview(Preview.QTGL)
    config = picam2.create_preview_configuration(main={"size": (640, 480)},lores={"size": (640, 480)},controls={"AfMode": controls.AfModeEnum.Continuous})
    picam2.configure(config)
    picam2.start()
    # cv2.startWindowThread()
    # picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})
    font = cv2.FONT_HERSHEY_SIMPLEX
    returndata=""
    if not picam2.started:
        print("无法打开该摄像头!")
        returndata = 'quit'
        return returndata
    starttime=math.floor(time.time())
    print(starttime)
    winname = "image"
    endtime = math.floor(time.time())
    timeused = 30 - (endtime - starttime)
    while (timeused>0):
        endtime = math.floor(time.time())
        timeused = 30 - (endtime - starttime)
        yuv420 = picam2.capture_array("lores")
        img = cv2.cvtColor(yuv420, cv2.COLOR_YUV420p2RGB)
        img_ROI_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        barcodes = zbar.decode(img_ROI_gray)
        returndata = ''
        img = cv2ImgAddText(img, str(timeused), 90, 90, (0, 255, 0), 20)
        for barcode in barcodes:
            barcodeData = barcode.data.decode("utf-8")
            barcodeType = barcode.type
            text = "{} ({})".format(barcodeData, barcodeType)
            img = cv2ImgAddText(img, text, 10, 10, (0, 255, 0), 20)
            # cv2.putText(img, text, (20, 100), font, 1, (0, 255, 0), 4)
            print("[INFO] Found {} QRcode/barcode: {}".format(barcodeType, barcodeData))
            img = cv2ImgAddText(img, text, 10, 10, (0, 255, 0), 20)
            returndata = barcodeData
        cv2.imshow('image', img)
        cv2.moveWindow("image", 20, 20)
        if returndata != "":
            break
        if timeused == 0:
            returndata = "timeout"
            break
        if (cv2.waitKey(1)) == ord('q'):
            returndata = 'quit'
            break
        if cv2.getWindowProperty(winname, cv2.WND_PROP_AUTOSIZE) < 1:
            returndata = 'quit'
            break
    picam2.stop()
    picam2.close()
    cv2.destroyAllWindows()
    return returndata

if __name__ == '__main__':
    barcodes = []
    get_2D()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值