1 回答
TA贡献1801条经验 获得超15个赞
的和属性设置<video>
“元素视觉内容的维度” ref,这意味着仅显示元素的显示方式。 您的面部检测器正在视频数据上处理视频的固有尺寸,即由媒体本身定义的尺寸,而不是由元素定义的尺寸,元素在显示视觉内容时会拉伸或缩小视觉内容。width
height
另一方面,画布的width
和height
属性确实设置了它的内在尺寸。
所以这两种媒体的内在尺寸实际上是不同的,视频中的坐标与画布中的坐标不匹配。
要解决此问题,您只需将画布的和width
分别设置为和,使其与视频内容的固有尺寸相匹配,然后通过 CSS调整其大小,使其与元素的显示尺寸相匹配。height
video.videoWidth
video.videoHeight
<video>
但是请注意,MediaStreams 可以在播放时更改其尺寸,因此您可能需要resize
监听<video>
.
链接到更新的代码笔,因为 StackSnippets 不允许 gUM。
最显着的变化:
const canvas = document.getElementById("facemesh");
const video = document.getElementById("movie");
if (navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({ video: true })
.then( stream => {
video.srcObject = stream;
video.addEventListener( "resize", (evt) => {
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
} );
// don't poll, use events
video.addEventListener( "loadedmetadata", (evt) => {
get_facemesh();
} );
} );
}
video,
canvas {
-webkit-transform: scaleX(-1);
transform: scaleX(-1);
position: fixed;
margin: 0 auto;
/* here set the same display dimensions */
width: 600px;
height: 450px;
/* force same object fit too */
object-fit: contain;
}
<div class="webcam">
<video autoplay id="movie"></video>
<canvas id="facemesh"> </canvas>
</div>
添加回答
举报