Docker容器无法访问视频设备,OpenCV调用摄像头失败求助
问题:Docker容器无法访问宿主机视频设备
环境配置
Dockerfile
FROM python:3.10.4 LABEL maintainer="Louis Jefferson Zhang <louis.ljz08@gmail.com>" # Set environment variables ENV PIP_DISABLE_PIP_VERSION_CHECK 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # Build Dependencies for Opencv, Dlib and Psycopg2 RUN apt-get update && apt-get install -y \ build-essential \ cmake \ libopencv-dev \ libdlib-dev \ libpq-dev \ && rm -rf /var/lib/apt/lists/* # Installation RUN pip install opencv-python dlib psycopg2 # MAIN WORKDIR /code COPY requirements.txt . RUN pip install -r requirements.txt COPY ./fr_as .
docker-compose.yml
version: "3.9" services: web: build: . command: python /code/fr_as/manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - 8000:8000 depends_on: - db devices: - /dev/video0:/dev/video0 privileged: true db: image: postgres:15 volumes: - postgres_data:/var/lib/postgresql/data/ environment: - "POSTGRES_HOST_AUTH_METHOD=trust" volumes: postgres_data:
requirements.txt
Django django-cleanup django-object-actions django_user_agents face-recognition imutils pillow
问题现象
执行docker-compose up -d --build构建并启动容器后,运行代码:
cap = cv2.VideoCapture(0) _, img = cap.read()
触发错误:
OpenCV(4.7.0) /io/opencv/modules/imgproc/src/resize.cpp:4062: error: (-215:Assertion failed) !ssize.empty() in function 'resize'
变量监视结果:
_ = Falseimg = None
说明容器无法读取宿主机视频设备,需解决该问题。
解决方案
1. 确认宿主机视频设备权限
- 宿主机执行
ls -l /dev/video0,查看设备所属用户组(通常为video组):ls -l /dev/video0 - 若容器内使用非root用户,需确保该用户加入
video组。
2. 验证设备映射准确性
- 宿主机执行
v4l2-ctl --list-devices,确认视频设备的实际路径:v4l2-ctl --list-devices - 若设备不是
/dev/video0,修改docker-compose.yml的devices配置为正确路径。
3. 添加用户组映射
在docker-compose.yml的web服务中,添加group_add配置,加入宿主机video组的ID:
services: web: # 保留原有配置 devices: - /dev/video0:/dev/video0 privileged: true group_add: - "1000" # 替换为宿主机video组ID,执行`getent group video | cut -d: -f3`获取
获取宿主机video组ID的命令:
getent group video | cut -d: -f3
4. 容器内测试设备可用性
进入容器内部,验证视频设备是否可访问:
docker-compose exec web bash # 安装测试工具(若容器未预装) apt-get update && apt-get install -y v4l-utils # 查看设备详细信息 v4l2-ctl -d /dev/video0 --all # 用OpenCV测试设备连接 python -c "import cv2; cap = cv2.VideoCapture(0); print(cap.isOpened()); cap.release()"
若输出True,说明设备访问正常。
5. 指定设备路径而非索引
修改代码,直接指定视频设备路径,避免索引映射问题:
cap = cv2.VideoCapture('/dev/video0')
6. 释放宿主机设备占用
关闭宿主机上所有正在使用/dev/video0的程序(如摄像头应用、直播工具等),重启容器后重试。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

