我尝试将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
,我做错了什么?
答案 0 :(得分:0)
尝试使用此功能:
-v /dev/video0:/dev/video0
代替
--device=/dev/video0
并执行:
$ xhost +
在 docker运行之前
答案 1 :(得分:0)
我发现让 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()