步骤
本教程将指导您如何在网页中包含并开始使用opencv.js
。您可以从每个发行版中的opencv-{VERSION_NUMBER}-docs.zip
获取opencv.js
的副本,或者直接从在线文档中下载预构建的脚本,网址为“https://docs.opencv.ac.cn/{VERSION_NUMBER}/opencv.js”(例如,https://docs.opencv.ac.cn/4.5.0/opencv.js。如果您想要最新版本,请使用4.x
)。您也可以按照教程构建 OpenCV.js来构建您自己的副本。
创建网页
首先,让我们创建一个能够上传图像的简单网页。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello OpenCV.js</title>
</head>
<body>
<h2>Hello OpenCV.js</h2>
<div>
<div class="inputoutput">
<img id="imageSrc" alt="无图像" />
<div class="caption">imageSrc <input type="file" id="fileInput" name="file" /></div>
</div>
</div>
<script type="text/javascript">
let imgElement = document.getElementById("imageSrc")
let inputElement = document.getElementById("fileInput");
inputElement.addEventListener("change", (e) => {
imgElement.src = URL.createObjectURL(e.target.files[0]);
}, false);
</script>
</body>
</html>
要运行此网页,请复制上面的内容并保存到本地 index.html 文件中。要运行它,请使用您的 Web 浏览器打开它。
- 注意
- 最好使用本地 Web 服务器来托管 index.html。
包含 OpenCV.js
将opencv.js
的 URL 设置为<script>标签的src
属性。
- 注意
- 在本教程中,我们将
opencv.js
托管在与 index.html 相同的文件夹中。您也可以选择使用我们在线文档中预构建的opencv.js
的 URL。
同步加载示例
<script src="opencv.js" type="text/javascript"></script>
您可能希望通过<script>标签中的async
属性异步加载opencv.js
。要接收opencv.js
准备好时的通知,您可以向onload
属性注册回调函数。
异步加载示例
<script async src="opencv.js" onload="onOpenCvReady();" type="text/javascript"></script>
使用 OpenCV.js
opencv.js
准备好后,您可以通过cv
对象访问 OpenCV 对象和函数。
例如,您可以通过cv.imread从图像创建cv.Mat。
- 注意
- 由于图像加载是异步的,您需要将cv.Mat创建放在
onload
回调函数中。
imgElement.onload = function() {
let mat = cv.imread(imgElement);
}
许多 OpenCV 函数可用于处理cv.Mat。您可以参考其他教程,例如图像处理,了解更多详情。
在本教程中,我们只在屏幕上显示一个cv.Mat。要显示cv.Mat,您需要一个 canvas 元素。
<canvas id="outputCanvas"></canvas>
您可以使用cv.imshow在 canvas 上显示cv.Mat。
cv.imshow("outputCanvas", mat);
将所有步骤放在一起,最终的 index.html 如下所示。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello OpenCV.js</title>
</head>
<body>
<h2>Hello OpenCV.js</h2>
<p id="status">OpenCV.js 正在加载...</p>
<div>
<div class="inputoutput">
<img id="imageSrc" alt="无图像" />
<div class="caption">imageSrc <input type="file" id="fileInput" name="file" /></div>
</div>
<div class="inputoutput">
<canvas id="canvasOutput" ></canvas>
<div class="caption">canvasOutput</div>
</div>
</div>
<script type="text/javascript">
let imgElement = document.getElementById('imageSrc');
let inputElement = document.getElementById('fileInput');
inputElement.addEventListener('change', (e) => {
imgElement.src = URL.createObjectURL(e.target.files[0]);
}, false);
imgElement.onload = function() {
let mat = cv.imread(imgElement);
cv.imshow('canvasOutput', mat);
mat.delete();
};
var Module = {
// https://emscripten.webassembly.net.cn/docs/api_reference/module.html#Module.onRuntimeInitialized
onRuntimeInitialized() {
document.getElementById('status').innerHTML = 'OpenCV.js 已准备好。';
}
};
</script>
<script async src="opencv.js" type="text/javascript"></script>
</body>
</html>
- 注意
- 您必须调用cv.Mat的 delete 方法来释放 Emscripten 堆中分配的内存。请参考Emscripten 的内存管理了解更多详情。
试一试