【发布时间】:2021-12-10 22:57:54
【问题描述】:
我是 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
所以看起来很有希望。 但是当试图将它应用到我的轮廓时,我遇到了以下问题。 为了生成虚拟临时垫,我需要指定矩阵的类型。 在测试中,我将其设置为 cv.CV_32FC1 但是当我尝试使用我的轮廓对象时
cnt.type() 返回 12
检查文档,它似乎转换为 CV_8UC130,因为它不是一个定义的值,在 C++ 或 python 中你必须使用函数 CV_8UC(130) 但它似乎不在 opencv.js 版本中。因此我无法创建我的垫子并继续我的过程。
我有什么遗漏吗?我觉得一个应该简单的操作需要很多步骤。缩放轮廓最简单的步骤是什么?
【问题讨论】:
-
type 12 issigned int,2个通道(包含x和y轮廓点坐标)gist.github.com/yangcha/38f2fa630e223a8546f9b48ebbb3e61a
-
谢谢@Miki,我现在设法找到了解决方案。将其作为答案发布。
标签: javascript opencv mat scalar