目标
读取图像
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 不同,因为原生imread 和imshow返回和显示的图像的通道顺序为 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 元素读取图像。
- 参数
-
imageSource | canvas 元素或 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]。
- 参数
-
canvasSource | canvas 元素或 ID。 |
mat | 要显示的 mat。 |
上述图像读取和显示的代码可以简化为如下所示。
let img = cv.imread(imageSource);
cv.imshow(canvasOutput, img);
img.delete();
试一试