树莓派5 CSI摄像头目标追踪
一,环境及硬件连接
CSI摄像头模块 OV5647
fpc金属这边朝向网卡方向
添加配置文件
sudo nano /boot/firmware/config.txt
如图

重启树莓派
sudo reboot
安装三个库
sudo apt install libcamera-apps libcamera-dev python3-picamera2
软件包用途普通用户是否需要?
| libcamera-apps | 命令行拍照/录像工具 | ✅ 推荐安装(测试用) |
| python3-picamera2 | Python 摄像头控制库 | ✅ 推荐安装(Python 开发) |
| libcamera-dev | C++ 开发库 | Qt中要用到 |
CSI摄像头测试
sudo libcamera-hello -t 0 --camera 0
安装opencv和opencontrib,因为目标追踪使用到的是csrt算法,他是在contrib库中
sudo apt install libopencv-dev python3-opencv sudo apt install libopencv-contrib-dev libopencv-contrib406
二,代码部分
import cv2
import time
from picamera2 import Picamera2
from libcamera import Transform
class CameraSystem:
def __init__(self, use_csi=True, camera_index=0):
self.use_csi = use_csi
self.camera_index = camera_index
self.cap = None
self.picam2 = None
def initialize(self):
"""........"""
if self.use_csi:
try:
# ...CSI...
self.picam2 = Picamera2()
config = self.picam2.create_preview_configuration(
main={"format": "RGB888", "size": (640, 480)},
raw={"format": "SRGGB12", "size": (1920, 1080)},
transform=Transform(hflip=0, vflip=1)
)
self.picam2.configure(config)
self.picam2.set_controls({"FrameRate": 60})
self.picam2.start(show_preview=False)
print("CSI........")
return True
except Exception as e:
print(f"CSI........: {e}")
self.use_csi = False
return self._initialize_usb()
else:
return self._initialize_usb()
def _initialize_usb(self):
"""...USB..."""
self.cap = cv2.VideoCapture(self.camera_index, cv2.CAP_V4L2)
if not self.cap.isOpened():
print(f"....USB... (.. {self.camera_index})")
return False
# ..USB.....
self.cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
self.cap.set(cv2.CAP_PROP_FPS, 30)
# .....
for _ in range(5):
self.cap.read()
time.sleep(0.5)
print(f"USB... (.. {self.camera_index}) .....")
return True
def read(self):
"""......"""
if self.use_csi and self.picam2:
return True, self.picam2.capture_array("main")
elif self.cap:
return self.cap.read()
return False, None
def release(self):
"""......."""
if self.picam2:
self.picam2.stop()
if self.cap:
self.cap.release()
cv2.destroyAllWindows()
def main():
# ....CSI...........USB...
camera_system = CameraSystem(use_csi=True, camera_index=0)
if not camera_system.initialize():
print(".........")
return
# ROI....
ret, frame = camera_system.read()
if not ret:
print("..........")
camera_system.release()
return
cv2.namedWindow("ROI Select", cv2.WINDOW_NORMAL)
cv2.imshow("ROI Select", frame)
print("..........Enter")
bbox = cv2.selectROI("ROI Select", frame, showCrosshair=True)
cv2.destroyAllWindows()
if sum(bbox) == 0:
print("........")
camera_system.release()
return
# ......
tracker = cv2.TrackerCSRT_create()
tracker.init(frame, bbox)
print(".... (.ESC..)...")
while True:
ret, frame = camera_system.read()
if not ret:
print("......")
break
# ....
success, bbox = tracker.update(frame)
if success:
x, y, w, h = [int(i) for i in bbox]
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
else:
cv2.putText(frame, "LOST!", (20, 40),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# ....
display = cv2.resize(frame, (640, 480))
cv2.imshow("Tracking", display)
if cv2.waitKey(30) == 27: # ESC...
break
camera_system.release()
if __name__ == "__main__":
main()成果演示
python csrt_csi_usb.py



我要赚赏金
