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()