OpenCV 4.11.0
开源计算机视觉
加载中…
搜索中…
无匹配项
图像入门

目标

  • 学习如何读取图像以及如何在网页中显示图像。

读取图像

OpenCV.js 将图像保存为cv.Mat 类型。我们使用 HTML canvas 元素将cv.Mat 传输到网页或反向传输。ImageData 接口可以表示或设置 canvas 元素区域的底层像素数据。

注意
请参考 canvas 文档了解更多详情。

首先,从 canvas 创建一个 ImageData 对象

let canvas = document.getElementById(canvasInputId);
let ctx = canvas.getContext('2d');
let imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);

然后,使用 cv.matFromImageData 构造一个cv.Mat

let src = cv.matFromImageData(imgData);
注意
因为 canvas 只支持具有连续存储的 8 位 RGBA 图像,所以cv.Mat 类型为 cv.CV_8UC4。这与原生 OpenCV 不同,因为原生imreadimshow返回和显示的图像的通道顺序为 BGR。

显示图像

首先,将 src 的类型转换为 cv.CV_8UC4

let dst = new cv.Mat();
// scale 和 shift 用于将数据映射到 [0, 255]。
src.convertTo(dst, cv.CV_8U, scale, shift);
// *** 为 GRAY、RGB 或 RGBA,取决于 src.channels() 是否为 1、3 或 4。
cv.cvtColor(dst, dst, cv.COLOR_***2RGBA);

然后,从 dst 新建一个 ImageData 对象

let imgData = new ImageData(new Uint8ClampedArray(dst.data), dst.cols, dst.rows);

最后,显示它

let canvas = document.getElementById(canvasOutputId);
let ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
canvas.width = imgData.width;
canvas.height = imgData.height;
ctx.putImageData(imgData, 0, 0);

在 OpenCV.js 中

OpenCV.js 使用上述方法实现图像读取和显示。

我们使用cv.imread (imageSource) 从 html canvas 或 img 元素读取图像。

参数
imageSourcecanvas 元素或 ID,或 img 元素或 ID。
返回值
通道顺序为 RGBA 的 mat。

我们使用cv.imshow (canvasSource, mat) 来显示它。该函数可能会根据其深度缩放 mat。

  • 如果 mat 是 8 位无符号数,则按原样显示。
  • 如果 mat 是 16 位无符号数或 32 位整数,则像素值除以 256。也就是说,值范围 [0,255*256] 映射到 [0,255]。
  • 如果 mat 是 32 位浮点数,则像素值乘以 255。也就是说,值范围 [0,1] 映射到 [0,255]。
参数
canvasSourcecanvas 元素或 ID。
mat要显示的 mat。

上述图像读取和显示的代码可以简化为如下所示。

let img = cv.imread(imageSource);
cv.imshow(canvasOutput, img);
img.delete();

试一试