很多资源都说光流算法有两种类型.卢卡斯 - 卡纳德是一种稀疏的技术,但我找不到稀疏和密集的含义?有人可以告诉我密集和稀疏光流之间的区别是什么?
我们实际上正在进行一个图像分析项目,我们需要识别在场景中消失/出现的对象.这是2张图片,一张是在外科医生采取行动之前拍摄的,另一张是之后拍摄的.
首先,我们只是计算了两个图像之间的差异,这里是结果(请注意,Mat为了获得更好的图像,我在结果中添加了128个):
目标是检测杯子(红色箭头)已从场景中消失并且注射器(黑色箭头)已进入场景,换句话说,我们应该仅检测与场景中左/进入的对象相对应的区域.此外,很明显,场景左上角的对象从初始位置稍微偏移了一点.我想过,Optical flow所以我常常OpenCV C++计算Farneback的一个,以便看看它是否足够我们的情况,这是我们得到的结果,接着是我们写的代码:
void drawOptFlowMap(const Mat& flow, Mat& cflowmap, int step, double, const Scalar& color)
{
cout << flow.channels() << " / " << flow.rows << " / " << flow.cols << endl;
for(int y = 0; y < cflowmap.rows; y += step)
for(int x = 0; x < cflowmap.cols; x += step)
{
const Point2f& fxy = flow.at<Point2f>(y, x);
line(cflowmap, Point(x,y), Point(cvRound(x+fxy.x), cvRound(y+fxy.y)), color); …Run Code Online (Sandbox Code Playgroud) 我正在开发一款适用于iPhone的增强现实应用程序,它涉及一种处理器密集型的物体识别算法(以100%的速度推动CPU可以达到每秒5帧),并努力节省电池电量和制作整个事情不那么"紧张"我正试图想出一种只在用户实际移动相机时运行该对象识别器的方法.
我的第一个想法是简单地使用iPhone的加速度计/陀螺仪,但在测试中我发现,人们常常会以一致的姿态和速度移动iPhone,以至于没有任何方法可以判断它仍处于运动状态.
这样就可以选择分析实际的视频输入并检测其中的移动.我让OpenCV工作并尝试运行他们的金字塔式Lucas-Kanade光流算法,该算法运行良好但似乎几乎与我的对象识别器一样处理器密集型 - 如果我降低深度级别/下采样,我可以使其达到可接受的帧率图像/跟踪更少的点,但随后精度受到影响,它开始错过一些大的动作并触发小手抖动的动作.
所以我的问题是,如果我只想检测相机移动的整体幅度,是否还有比Lucas-Kanade更快的光流算法?我不需要跟踪单个物体,我甚至不需要知道相机移动的方向,我真正需要的是一种方式来提供两帧视频,让它告诉我它们有多远.
将军:我希望我要描述的用例是一个光流问题的简单案例,因为我对这个问题没有太多的了解,我想知道是否有人对我如何有任何建议可以解决我的问题.
我已经完成的研究:我已经开始阅读基于翘曲纸理论的高精度光流估计,并计划查看粒子视频论文.我找到了光流的MATLAB 高精度光流实现.然而,论文(和代码)似乎描述了非常复杂的概念,可能需要大量时间来深入挖掘和理解.我希望我的问题的解决方案可能更简单.
问题:我有一系列图像.图像描绘了材料破损过程,其中材料和背景是黑色的,裂缝是白色的.我有兴趣反过来遍历图像序列,试图将破损过程中形成的所有裂缝映射到第一个黑色图像.您可以将材料视为一个大型拼图,我试图将它们按照它们破坏的相反顺序重新组合在一起.
在每个图像中,可能会出现一些刚刚出现的裂缝和/或一些已完全形成的裂缝(从而形成碎片).在整个破损过程中,一些碎片可能会分离并进一步破碎.片段也可以彼此远离移动(后续帧之间的变化很小).
期望的输出:序列中的所有裂缝/线都映射到序列中的第一个图像.
附加说明:图像以灰度格式(即原始格式)以及二进制格式提供,其中裂缝以白色轮廓,背景为完全黑色.请参阅下面的一些图像示例.


顶行显示原始图像,底行显示二进制图像.正如您所看到的,随着图像序列的进展,沿着中间向下的裂缝变得越来越宽.因此,底部裂缝与下部裂缝一起移动.当反向遍历序列时,我希望通过算法实现中间裂缝合为一体(并将其正确映射到第一幅图像),并正确映射底部裂缝,保持其正确的对应关系(大小和位置)与底部片段.
一个序列通常包含大约30~40个图像,所以我刚刚显示了初始子集.此外,尽管这些图像没有显示,但是特定图像可能仅包含裂缝的开始(即其初始外观),并且在随后的图像中,它变得越来越长并且可能与其他裂缝结合.
语言:虽然没有必要,但我想使用MATLAB实现解决方案(因为大多数与项目相关的其他代码都是在MATLAB中完成的).但是,如果OpenCV可能更容易,我的语言/库使用灵活.
任何想法都非常感谢.
是否有一个像样的图像稳定库(光流周围的东西)那里可以给我一个三维变换矩阵来稳定?
我只想稳定10帧序列.具有Objective-C包装器的库将是最好的,但更深层次的东西(C,C++)是可以的.
提前致谢.
我正在使用Lucas Kanade方法研究光流程脚本,作为大学项目.虽然它运作良好,但有些东西我无法弄清楚.它在启动时使用几MB的内存,但这个数量每秒都在迅速增加.当它为480帧电影的1帧计算OF时,它使用大约1GB.当它达到1.9GB时,即使停留了几个小时,它也会突然停止并停留在那里.
我尝试在另一台PC上运行脚本,它只"使用1GB".
这是非常奇怪的行为,因为根据我的计算,它应该使用少于100MB.
对我来说最令人惊讶的是,在脚本计算了一帧之后,我打印了垃圾收集器正在观看的对象数量,大约是200万,然后在强制收集后再次打印它,它完全相同.我等待第二帧计算(同时内存使用量增加~1GB)并且脚本打印了GC正在监视的对象数 - 完全相同的数字接近200万.那是什么意思呢?numpy是用C语言编写的,有内存泄漏吗?
我真的很想了解这种行为.
我正在尝试使用Dense Optical Flow执行复杂的图像扭曲(我试图将第二个图像切换成与第一个图像大致相同的形状).我可能会把这一切都搞错了但是我发布了我尝试过的内容:
cv::Mat flow;
cv::calcOpticalFlowFarneback( mGrayFrame1, mGrayFrame2, flow, 0.5, 3, 15, 3, 5, 1.2, 0 );
cv::Mat newFrame = cv::Mat::zeros( frame.rows, frame.cols, frame.type() );
cv:remap( frame, newFrame, flow, cv::Mat(), CV_INTER_LINEAR );
Run Code Online (Sandbox Code Playgroud)
如果我正在计算2个灰度帧的流量垫的想法.我找回了一个似乎有意义的流垫,但现在我正在尝试使用此流信息重新映射我的原始(即非灰度)图像.
我认为重映射功能是我想要的,但是我得到了一个非常严重失真的图像.我的所有颜色信息都没有存在.我最终得到的橙色和黑色图像与我的原始图像有很小的相似之处.
我猜我错误地理解了重映射功能,它要么不做我想做的事情,要么就是因为我传入的内容出了问题.
如果前者有人对我如何解决这个问题有任何建议?如果是后者,我错了什么?
任何帮助非常感谢!
我只有两张图片,一张是当前帧,一张是其他方式计算出来的光流图。
我的问题是如何使用两幅图像计算前一帧?
我看到了一个解决方案,只是使用双线性插值将当前帧扭曲到具有光流图像的最后一帧。但我不知道该怎么做。
那么,有人能给我一些建议或想法吗?非常感谢。
我已经看到端点错误(EPE)用作确定流量估算与地面实况流程的接近程度的度量标准,但我有一些关于它的问题并且希望有人可以启发我:
我试图使用Opencv的密集光流函数的输出来绘制运动矢量的箭袋图,但是却无法找到函数实际输出的内容.这是代码:
import cv2
import numpy as np
cap = cv2.VideoCapture('GOPR1745.avi')
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
count=0
while(1):
ret, frame2 = cap.read()
next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(prvs,next,None, 0.5, 3, 15, 3, 10, 1.2, 0)
mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
hsv[...,0] = ang*180/np.pi/2
hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
if count==10:
count=0
print "flow",flow
cv2.imshow('frame2',rgb)
count=count+1
k = cv2.waitKey(30) & 0xff
if k == 27:
break
elif k == ord('s'):
prvs = next …Run Code Online (Sandbox Code Playgroud) opticalflow ×10
opencv ×5
c++ ×2
image ×2
iphone ×2
python ×2
matlab ×1
numpy ×1
objective-c ×1
python-2.7 ×1