1 回答

TA貢獻1801條經(jīng)驗 獲得超16個贊
的和屬性設置<video>
“元素視覺內(nèi)容的維度” ref,這意味著僅顯示元素的顯示方式。 您的面部檢測器正在視頻數(shù)據(jù)上處理視頻的固有尺寸,即由媒體本身定義的尺寸,而不是由元素定義的尺寸,元素在顯示視覺內(nèi)容時會拉伸或縮小視覺內(nèi)容。width
height
另一方面,畫布的width
和height
屬性確實設置了它的內(nèi)在尺寸。
所以這兩種媒體的內(nèi)在尺寸實際上是不同的,視頻中的坐標與畫布中的坐標不匹配。
要解決此問題,您只需將畫布的和width
分別設置為和,使其與視頻內(nèi)容的固有尺寸相匹配,然后通過 CSS調(diào)整其大小,使其與元素的顯示尺寸相匹配。height
video.videoWidth
video.videoHeight
<video>
但是請注意,MediaStreams 可以在播放時更改其尺寸,因此您可能需要resize
監(jiān)聽<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>
添加回答
舉報