当我的 python 脚本在服务器上运行时,如何访问我的本地网络摄像头? (实时人脸识别)

Posted

技术标签:

【中文标题】当我的 python 脚本在服务器上运行时,如何访问我的本地网络摄像头? (实时人脸识别)【英文标题】:How do I access my local webcam while my python script is running on a server? (Face-Recognition in real time) 【发布时间】:2020-11-06 01:50:51 【问题描述】:

我有一个包含多个用户的网页,我希望每个用户都能够使用面部识别登录。

为此,我有两种方法可以访问本地系统上的网络摄像头。第一个是使用 javascript,第二个是使用 OpenCV - Python。

我的问题是实时运行人脸识别。人脸识别脚本托管在服务器上,如果我使用 JavaScript 访问我的网络摄像头,如何将每一帧发送到 python 脚本以使其识别并显示输出;或者如果我在我的 python 脚本中使用 OpenCV 来访问我的网络摄像头,它会失败,因为脚本正在服务器上运行并抛出错误

这完全有道理,因为服务器没有摄像头设备,但有什么办法可以解决这个问题?如何实时运行人脸识别?

这就是我使用 imutils 使用网络摄像头的方式:

vs = VideoStream(-1).start()

【问题讨论】:

【参考方案1】:

您可以通过在 JavaScript 中从视频流中获取图像来做到这一点。有一篇关于如何做到这一点的详细文章here on MDN。

以下是高级别执行此操作的方法,包括通过网络发送捕获的图像:

// Send the image data to the server
async function sendImage(image) 
  const data = new FormData();
  data.append("image", image);

  return fetch("/some-endpoint", 
    method: "POST",
    body: data,
  );


// Create a base64 image from the stream
function createImage(stream,  width = 640, height = 480  = ) 
  // Draw new frame to the canvas
  stream.ctx.clearRect(0, 0, width, height);
  stream.ctx.drawImage(stream.video, 0, 0, width, height);

  // Get base64 image string from canvas and add it the an "image" form field
  return stream.canvas.toDataURL("image/png");


// Get video stream and add it to an in-memory video
function createVideoStream() 
  return new Promise(async (resolve, reject) => 
    try 
      const stream = await navigator.mediaDevices.getUserMedia( video: true );
      const canvas = document.createElement("canvas");
      const video = document.createElement("video");
      const ctx = canvas.getContext("2d");
      video.onloadedmetadata = async () => 
        await video.play();
        resolve( video, canvas, ctx );
      ;
      video.srcObject = stream;
     catch (err) 
      // Handle errors
      reject(err);
    
  );


async function process(stream) 
  const image = await createImage(stream);
  await sendImage(image);
  setTimeout(() => process(stream), 500);


createVideoStream().then(process);

请注意,为了提高性能,您可以通过 WebSockets 而不是 HTTP 发送这些图像。

这是该代码的a working demo 正在运行(没有服务器发送部分)。

【讨论】:

但它仍然不是实时的,是吗?我正在录制视频,将其转换为图像,将其发送到服务器上的脚本并接收输出? 您可以通过将setTimeout 减少到零毫秒并通过WebSockets 将数据发送到您的python 服务器来实现这一点。 @Trollsors 我添加了一个演示链接以帮助您理解。

以上是关于当我的 python 脚本在服务器上运行时,如何访问我的本地网络摄像头? (实时人脸识别)的主要内容,如果未能解决你的问题,请参考以下文章

Python 脚本名称未定义

当我仅使用脚本名称在 Windows 上运行 Python 脚本时无法重定向输出

如何与运行 Python 脚本进行交互

如何在 web apache 服务器上自动化 python 脚本

Telnet:当我在 localhost 上运行 python 脚本时出现“连接被拒绝”

竹原木输出顺序问题