官方网址:usb_webcam
- 支持
UVC
同步、批量传输模型 - 只支持
MJPEG
传输格式 - 支持板上LCD动画
esp32-s3-eye
(IDF v5.0
或更高版本)
硬件要求
官方默认的USB WebCam config
就是乐鑫带摄像头OV2604
的esp32-s3-eye
,其他的开发板可以参考官方网站进行配置。
摄像头要求
- 参考esp32-camera查看摄像头是否支持
JPEG
压缩; - 使用
idf.py menuconfig
,USB WebCam config
配置帧分辨率、帧速率和图像质量; - 通过
USB WebCam config -> UVC transfer mode
,用户可以切换到Bulk
模式来获得差不多Isochronous
两倍的吞吐量。
编译和烧录
idf.py set-target esp32s3
idf.py build flash moniotr
官方的示例输出
I (0) cpu_start: Starting scheduler on APP CPU.
I (533) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations
I (534) usb_webcam: Selected Camera Board ESP-S3-EYE
I (534) usb_webcam: Format List
I (534) usb_webcam: Format(1) = MJPEG
I (534) usb_webcam: Frame List
I (535) usb_webcam: Frame(1) = 1280 * 720 @15fps, Quality = 14
I (535) usb_webcam: Frame(2) = 640 * 480 @15fps, Quality = 14
I (535) usb_webcam: Frame(3) = 480 * 320 @30fps, Quality = 10
I (869) usb_webcam: Mount
I (2099) usb_webcam: Suspend
I (9343) usb_webcam: bFrameIndex: 1
I (9343) usb_webcam: dwFrameInterval: 666666
I (9343) s3 ll_cam: DMA Channel=4
I (9344) cam_hal: cam init ok
I (9344) sccb: pin_sda 4 pin_scl 5
I (9344) sccb: sccb_i2c_port=1
I (9354) camera: Detected camera at address=0x30
I (9357) camera: Detected OV2640 camera
I (9357) camera: Camera PID=0x26 VER=0x42 MIDL=0x7f MIDH=0xa2
I (9434) cam_hal: buffer_size: 16384, half_buffer_size: 1024, node_buffer_size: 1024, node_cnt: 16, total_cnt: 180
I (9435) cam_hal: Allocating 184320 Byte frame buffer in PSRAM
I (9435) cam_hal: Allocating 184320 Byte frame buffer in PSRAM
I (9436) cam_hal: cam config ok
I (9436) ov2640: Set PLL: clk_2x: 0, clk_div: 0, pclk_auto: 0, pclk_div: 12
实际上烧录结果如下,应该是烧录后USB口应该被占用了所以没有打印输出。
电脑端查看摄像头
现在电脑就可以直接访问摄像头了,使用python
运行下面代码,在打开摄像头的时候LCD上的动画的眼睛会一直眨巴眨巴。
import cv2
# 打开摄像头,参数0表示第一个摄像头,如果有多个摄像头可以尝试1, 2, 3等
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
while True:
# 读取摄像头的一帧
ret, frame = cap.read()
if not ret:
print("无法接收帧 (stream end?). Exiting ...")
break
# 显示这一帧
cv2.imshow('Image', frame)
# 按下'q'键退出循环
if cv2.waitKey(1) == ord('q'):
break
# 释放摄像头并关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()