opencv.js与标量的Mat乘法



我是OpenCV的新手,试图用OpenCV .js在相机上做一些检测我正在学习一些基于python代码的教程,并将其改编为javascript/typescript(我的页面运行在angular应用程序中)。

我以全高清分辨率从相机中捕获帧,然后为了提高性能并有更平滑的选择,我将帧缩放到较小的尺寸。然后我将图像更改为灰度,添加高斯模糊并对其应用阈值。在这个阶段,我调用findContours函数来检测相机检测到的形状的轮廓。

在示例中,我遵循的下一步是迭代每个找到的轮廓,然后将Mat与原始帧和小帧的比率相乘,以便在原始图像上显示轮廓。

cnt *= ratio

不幸的是,这样做会改变我的Mat对象cnt为NaN。我假设*操作符不与opencv.js一起在Mat上工作,我试图找到另一个解决方案。

我做了几次实验,都没有效果。我找到了mul()函数,并得到了一些基本对象的结果。该函数需要另一个Mat,然后是比率。

我做了以下测试。

let mat1 = cv.matFromArray(3,3,cv.CV_32FC1,[1,2,3,4,5,6,7,8,9]);
const temp = new cv.Mat.ones(c.rows, c.cols, cv.CV_32FC1);
let dst = mat1.mul(temp,10); 
console.log("dst::" + dst.data32F);//dst::10,20,30,40,50,60,70,80,90

所以看起来很有希望。但是当我试图把它应用到我的轮廓,我有以下问题。为了生成虚拟的临时Mat,我需要指定矩阵的类型。在测试中,我把它设为cv。CV_32FC1但是当我尝试用轮廓对象

cnt.type()返回12检查文档似乎它翻译为CV_8UC130,因为它不是一个定义的值,在c++或python中,你必须使用函数CV_8UC(130),但它似乎不在opencv.js版本中。因此,我无法创建我的Mat并继续我的进程。

我错过了什么吗?我觉得一个本应简单的手术需要很多步骤。画等高线最简单的步骤是什么?

有了上面的注释,我就能用下面的代码解决我的问题了。如果别人遇到麻烦,就把它贴在这里。

...
let cnt = contours.get(i);
let ones = new cv.Mat(cnt.rows, cnt.cols, cv.CV_32SC2, new cv.Scalar(1,1,1,1));
let cnt2 = cnt.mul(ones,ratio);
ones.delete();
...

最新更新