You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

变量监视结果:

  • _ = False
  • img = 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:30:52