[英]Access webcam using OpenCV (Python) in Docker?
我正在尝试将 Docker 用于我们的一个项目,该项目使用 OpenCV 来处理网络摄像头提要(Python)。 但我似乎无法访问 docker 内的网络摄像头,这是我用来测试网络摄像头访问的代码:
python -c "import cv2;print(cv2.VideoCapture(0).isOpened())"
到目前为止,这是我尝试过的,
docker run --device=/dev/video0 -it rec bash
docker run --privileged --device=/dev/video0 -it rec bash
sudo docker run --privileged --device=/dev/video0:/dev/video0 -it rec bash
所有这些都返回False
,我做错了什么?
您提供的链接中的 Dockerfile 没有指定 opencv 是如何安装的,您能提供您使用的 Dockerfile 吗? 或者你是怎么安装opencv的?
如果您通过 pip 安装 opencv,则 VideoCapture(0) 将无法工作。
您正在正确使用--device=/dev/video0:/dev/video0
。
尝试使用这个:
-v /dev/video0:/dev/video0
代替
--device=/dev/video0
并执行:
$ xhost +
在docker 运行之前
我发现让 dockerized OpenCV 能够连接到您的网络摄像头的最简单方法是使用以下 Dockerfile :
FROM ubuntu:20.04
ENV TERM=xterm
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
libopencv-dev \
python3-opencv \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /app
ADD . /app
ENV PYTHONUNBUFFERED=1
ENV PYTHONPATH=/app
然后构建它并以这种方式运行:
docker build -t opencv-webcam .
docker run -it -v $PWD:/app/ --device=/dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY opencv-webcam bash
并使用python3 script.py
在容器内运行以下脚本:
import cv2
WINDOW_NAME = "Opencv Webcam"
def run():
cv2.namedWindow(WINDOW_NAME)
video_capture = cv2.VideoCapture(0)
while True:
ret, frame = video_capture.read()
print(ret, frame.shape)
cv2.imshow(WINDOW_NAME, frame)
cv2.waitKey(1)
if __name__ == "__main__":
run()
我在使用非特权 Dockerfile(即使用 USER 行)时遇到问题:
容器必须以--user {UID}
开头; NOT --user {UID}:{GID}
(与user:
docker-compose.yml 中的行,如果设置了 gid。奇怪的是,这不会继承访问网络摄像头文件(/dev/video0 等)所需的视频组权限.), 另外; 必须将内部 Dockerfile 用户添加到视频组中:在 USER 行之后添加它(并且在安装 sudo 并将用户添加到 sudoers 之后):
RUN sudo usermod -a -G video <InternalUsername>
在你尝试这些步骤之前:在特权模式下运行所有的东西来测试你的问题是否真的出在这里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.