当我的 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 脚本在服务器上运行时,如何访问我的本地网络摄像头? (实时人脸识别)的主要内容,如果未能解决你的问题,请参考以下文章
当我仅使用脚本名称在 Windows 上运行 Python 脚本时无法重定向输出
如何在 web apache 服务器上自动化 python 脚本