目标
读取图像
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();
试试看