返回信息流望高手指点下,OpenCV中的光流计算函数CalcOpticalFlowHS是怎么用的,能找到的资料太少了,文档里只简单地说了一下各个参数,可还是不明白。
在下初入行,期待达人指点,该函数计算光流的各个参数应该怎么设,计算结果怎样表示?
不胜感激!
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #734同步于 2008/1/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
[请教]求人指点OpenCV中光流计算函数的用法
FlyinWind
2008/1/2镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
OpenCV得光流函数实现了Lucas-Kanade,Horn-?,和hierarchical的方法(可能是三种吧,记不清了)。光流方法最基本的就是LK(lucas-kanade)方法了,lk模型将设物体得特征具有不变性I(x,t)=I(x+vdt,t+dt),泰勒展开I(x,t)=I(x,t)+I_x'vdt+I_tdt,进而I_x'v=-I_t(现行系统),最小二乘法。(类比线性系统Ax=y,最优解的几何意义是寻找y在A的列空间中的垂直投影向量,I_x‘与A相似,因此I_x‘的列空间应该能够张成平面,意思是局部区域的梯度不一致lk才有解),lk是local的方法,horn引入了regularize term,hierarchical好像是基于频率域的贝叶斯分析,bebekifis对这个在行
若单是两幅图像的话建议使用CalcOpticalFlowLK
你用的那个函数是针对视频设计的
CalcOpticalFlowLK
计算两幅图像的光流
void cvCalcOpticalFlowLK( const CvArr* prev, const CvArr* curr, CvSize win_size,
CvArr* velx, CvArr* vely );
prev
第一幅图像, 8-比特, 单通道.
curr
第二幅图像, 8-比特, 单通道.
win_size
用来归类象素的平均窗口尺寸 (Size of the averaging window used for grouping pixels)
velx
光流的水平部分,与输入图像大小一样, 32-比特, 浮点数, 单通道.
vely
光流的垂直部分,与 输入图像大小一样, 32-比特, 浮点数, 单通道.
8位和32位指的是在建立图像的时候参数CV_8U和CV_32FC,单通道就是单通道了。
例如32位单通道就是
IplImage * pImage = cvCreateImage(cvSize(width, Height), CV_32FC, 1)
没注意到你问的是horn的,不好意思
horn的准则函数
f(V)=integral {([Ix Iy][Vx Vy]'+It)^2+alpha(norm(gradient(V)))}
函数是对x-y积分。函数的第一项与LK的意思是一样的,第二项是l梯度算子的2范,大概就是一个平滑因子,要求求解的速度场变化平滑。
对函数的求解,采用4邻接域结构,因此Vx(x,y)=Vx(x+1,y)-Vx(x,y)或者Vx(x,y)=Vx(x,y)-Vx(x-1,y),这里符号有点乱了,等式左边应该是导数,sorry,同样定义Vy,对积分函数离散化
F(V)=Sigma {[Ix Iy][Vx Vy]'+It}^2+alpha{0.5(Vx(x+1,y)-Vx(x,y))^2+0.5(Vx(x,y)-Vx(x-1,y))^2+0.5(Vy(x,y+1)-Vy(x,y))^2+0.5(Vy(x,y)-Vy(x,y-1))^2}
Sigma是对x-y求和
离散方程两边对Vx(x,y),Vy(x,y)求导
2([Ix Iy][Vx Vy]'+It)Ix-alpha(Vx(x+1,y)-2Vx(x,y)+Vx(x-1,y))=0
2([Ix Iy][Vx Vy]'+It)Iy-alpha(Vy(x,y+1)-2Vy(x,y)+Vy(x,y-1))=0
Vx,Vy的二阶导离散形式定义为
Vxx=0.5(Vx(x+1,y)-2Vx(x,y)+Vx(x-1,y)),Vyy=0.5(Vy(x,y+1)-2Vy(x,y)+Vy(x,y-1))
带入后,上面两个等式为
2([Ix Iy][Vx Vy]'+It)Ix-2alpha*Vxx=0
2([Ix Iy][Vx Vy]'+It)Iy-2alpha*Vyy=0
这个系统用Gauss-Seidel迭代求解(GS是求解微分方程较常用的数值方法)
Vx(x,y,k+1)=((alpha*Vxx(x,y,k))-Ix(Iy*Vy(x,y,k)+It))/Ix
Vx(x,y,k+1)=((alpha*Vyy(x,y,k))-Iy(Ix*Vx(x,y,k)+It))/Iy
注此处计算Vxx和Vyy用到Vx(x+1,y,k),Vx(x,y,k),Vx(x-1,y,k+1)和Vy(x,y+1,k),Vy(x,y,k),Vy(x,y-1,k+1)
k为迭代过程
------------------------------------------------------------------------------------------
OpenCV的函数注释
CalcOpticalFlowHS
计算两幅图像的光流
void cvCalcOpticalFlowHS( const CvArr* prev, const CvArr* curr, int use_previous,
CvArr* velx, CvArr* vely, double lambda,
CvTermCriteria criteria );
prev
第一幅图像, 8-比特, 单通道.
curr
第二幅图像, 8-比特, 单通道.
use_previous
使用以前的 (输入) 速度域
velx
光流的水平部分,与输入图像大小一样, 32-比特,浮点数, 单通道.
vely
光流的垂直部分,与输入图像大小一样, 32-比特, 浮点数, 单通道.
lambda
Lagrangian 乘子
criteria
速度计算的终止条件
函数 cvCalcOpticalFlowHS 为输入图像的每一个象素计算光流,使用 Horn & Schunck 算法
lambda,就是上面推导中的alpha
criteria,因为求解是迭代的,criteria就是自己设定的终止条件
use_previous,上面的方法要用到以前的速度,可能opencv还用了另外的解法吧
其余参数和bebekifis解释的一样
【 在 FlyinWind 的大作中提到: 】
: 望高手指点下,OpenCV中的光流计算函数CalcOpticalFlowHS是怎么用的,能找到的资料太少了,文档里只简单地说了一下各个参数,可还是不明白。
: 在下初入行,期待达人指点,该函数计算光流的各个参数应该怎么设,计算结果怎样表示?
: 不胜感激!
顶一个,技术贴,虽然搞检索的看不懂。。。。
【 在 cryppie 的大作中提到: 】
: 没注意到你问的是horn的,不好意思
: horn的准则函数
: f(V)=integral {([Ix Iy][Vx Vy]'+It)^2+alpha(norm(gradient(V)))}
: ...................