[英]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.