问题标签 [opticalflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
230 浏览

algorithm - 取景器对齐

有没有人使用取景器对齐方法?第一步(边缘检测)或多或少是可以理解的。它写道:“为了提取边缘,我们在四个等距方向上获取图像的平方梯度:水平、垂直和两个对角线方向。” ( 1 )。并且“我们然后在垂直于梯度方向的方向上对每个梯度图像进行积分投影”2)。对于水平方向,我以这种方式实现了该算法:

对我来说真正的问题是第二步:边缘对齐px[i]1py[i]1pu[i]1pv[i]1是什么意思?为什么它们等于 1?i-counter如何变化?

0 投票
1 回答
2316 浏览

opencv - 使用 OpenCV 的动态(移动)手势

我可以使用 openCV 检测手或彩色标记,但我坚持识别动态手势(例如,将手向右移动为向右移动手势)。我想识别左、右、上、下、圆圈(顺时针和逆时针)
你能建议我一种实现上述手势的方法吗?

0 投票
1 回答
2219 浏览

image-processing - 用于 cvCalculateOpticalFlowFarneback 的 OPTFLOW_USE_INITIAL_FLOW 选项

我正在使用 OpenCV 开展一个项目,我正在使用光流算法 cvCalculateOpticalFlowFarneback 来获取视频中的光流。

我一直在阅读文档,甚至一直在研究源代码,并且有一个选项可以提供给算法:OPTFLOW_USE_INITIAL_FLOW

我一直在玩它,但我看不出速度或准确性有任何差异。所以我的问题是:

选项有什么作用?与没有相比,您在使用它时有什么不同吗?(是好是坏)

此外,在查看某些实现时,我遇到了一条代码注释,说应该避免使用此选项,因为其中存在错误。我在其他任何地方都无法做到这一点,但这让我有点紧张(尤其是在包含到生产软件中时)。

任何评论都可以理解!

0 投票
1 回答
4986 浏览

opencv - 根据相应的 3d 点集计算相机运动

我有一个小问题。我编写了一个程序,它使用相机和深度信息在每一帧中提取一组三维点。这些点在相机坐标系中,这意味着原点在相机中心,x 是水平距离,y 是垂直距离,z 是到相机的距离(沿光轴)。一切都以米为单位。即点 (2,-1,5) 将位于右侧 2 米、下方 1 米和沿相机光轴的 5 米处。

我在每个时间范围内计算这些点并且也知道对应关系,就像我知道哪个点t-1属于哪个 3d 点t

我现在的目标是在我的世界坐标系中计算相机在每个时间帧中的运动(z 向上代表高度)。我想计算相对运动,但也想计算从某个起始位置开始的绝对运动,以可视化相机的轨迹。


这是一帧的示例数据集,其中包含相机坐标中点的当前(左)和前一个 3D 位置(右):


由于我想尽可能使用 OpenCV,因此我estimateAffine3D()在 OpenCV 2.3 中找到了该函数,该函数采用两个 3D 点输入向量并使用 RANSAC 计算它们之间的仿射变换。

作为输出,我得到一个 3x4 变换矩阵。

我已经尝试通过设置 RANSAC 参数来使计算更准确,但很多时候转换矩阵显示出相当大的平移运动。正如您在示例数据中看到的那样,移动通常非常小。

所以我想问是否有人对我可以尝试什么有其他想法?OpenCV 是否为此提供其他解决方案?

另外,如果我在每个时间范围内都有相机的相对运动,我将如何将其转换为世界坐标?另外,我将如何获得从点 (0,0,0) 开始的绝对位置,以便我拥有每个时间帧的相机位置(和方向)?

如果有人能给我一些建议,那就太好了!

谢谢!

更新 1:

在@Michael Kupchick 很好的回答之后,我尝试检查OpenCV 中的estimateAffine3D() 函数的工作情况。因此,我创建了两个包含 6 个点对的小测试集,它们只有平移,而不是旋转,并查看了生成的变换矩阵:

测试集 1:

转换矩阵:

测试集 2:

转换矩阵:

--> 这给了我两个乍看之下正确的转换矩阵......

假设这是正确的,当我在每个时间步中都有这个变换矩阵时,我将如何重新计算它的轨迹?

任何人有任何提示或想法,为什么它那么糟糕?

0 投票
1 回答
589 浏览

c# - 我应该如何使用 velX,velY 信息来获取当前帧和前一帧之间的 X 和 Y 位移?

我在 C# 中使用 openCV 库中的 Lucas Kanade 光流算法;有一系列帧,我想在每两个帧中找出什么是光流并将其显示在图片框中。

我可以从以下函数中获取 velX 和 velY:

现在,我应该如何使用这两个来显示两个帧之间的流?或者换句话说,我应该如何获得像素的位移?

肿瘤坏死因子

0 投票
1 回答
1074 浏览

c++ - cvCalcOpticalFlowPyrLK 输入图像大小

使用 时cvCalcOpticalFlowPyrLK,对于某些输入图像大小,生成的金字塔似乎是错误的。我在文档中找不到任何关于良好输入图像大小的参考。尽管如此,它还是找到了要点。有谁知道这是怎么发生的以及如何解决这个问题?

(如果使用 gcc,您可以使用 编译和运行它g++ pyr.cpp -o pyr -lcv -lcvaux && ./pyr

带有 640x480 图像的屏幕截图 带有 640x480 图像的屏幕截图

带有 631x480 图像的屏幕截图 631x480 截图

0 投票
1 回答
3415 浏览

python - 类型错误:不是 cv2.calcOpticalFlowPyrLK() 中的 numpy 数组

我正在尝试使用 python 绑定在 OpenCV 2.3.1 中制作 LK 跟踪器。当我做

我越来越

TypeError:不是一个numpy数组

在哪里

此处提供有关 cv2.calcOpticalFlowPyrLK() 的更多信息

http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html?highlight=opticalflow#cv.CalcOpticalFlowPyrLK

当我设置

它给了我以下错误

TypeError:只有长度为 1 的数组可以转换为 Python 标量

这里可能是什么问题?

0 投票
4 回答
13245 浏览

c++ - cv::goodFeaturesToTrack 不返回任何功能

我正在尝试使用cv::calcOpticalFlowPyrLK,但有时该函数中的内部断言会失败。断言是npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0。我正在使用 OpenCV 2.3.1。此函数的源代码可在此处获得。

我很难理解他们的代码,尤其是因为我在计算机图形方面的经验有限并且他们缺乏评论。为什么会触发此断言,它对我的​​问题有什么看法?

编辑:我调用函数如下:

我发现通过使用看起来足够大和有效图像的非空掩码features调用获得的向量cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask);不包含任何特征。这怎么可能发生?

curBwFrame

curBwFrame

皮肤面膜

皮肤面膜

我可以使用以下代码片段重现该问题:

0 投票
3 回答
2424 浏览

c - 分组运动向量

我正在使用 -Lucas-kanade 算法来计算带有 openCV 的视频序列的光流。我得到了运动矢量。现在我想将这些运动矢量分组到一些集群中。彼此靠近的向量我想将它们组合在一起。诸如最近邻方法之类的事情。但我不知道如何实现它。任何帮助将不胜感激。

谢谢你。

运行光流算法后,我使用 cvKMeans2() 对角点进行分组...

我在向量集群容器的向量中有集群。现在我想在每个集群周围画一条边界线..我不确定我该怎么做...如果有人知道请帮忙。

使用 openCV 手册中的以下代码,我在每个集群周围画了一个圆圈..但我想画一个矩形而不是一个圆圈..任何人请帮助我。

在此处输入图像描述

0 投票
1 回答
4725 浏览

c - OpenCV Lucas Kanade 光流

我正在编写一个代码,我必须找到我感兴趣的所有角点的轨迹。所以,同样,我使用了 LKPyr 光流,它使用前一个图像的角点并在当前图像中找到它们图片。我正在逐帧使用光流,即第 1 帧和第 2 帧,然后是第 2 帧和第 3 帧。所以,我认为我在上一次迭代中找到的第 2 帧角特征将是光流的当前特征,但是并非如此,每次我做Good Features to Track时点都会改变,问题是,对于轨迹点,我需要跟踪当前点并在它们到来时添加新点,而当旧点即将丢失时,我应该得到状态= 0,这样我就可以一个一个地跟踪点。有没有办法这样做?有没有办法知道视频中每个点何时结束,这样我就可以跟踪轨迹?更改对 cvLKpyrOpticalFlow 的调用中的标志是否有助于获得连续流?

这是我正在运行以获取光流的代码块。