您的位置:首页 > 理论基础

(六)计算机视觉的知识、CamShitf算法、运动分析和物体跟踪Video

2012-11-08 14:06 465 查看
1、先简单回顾一下计算机视觉的知识。

这里研究生的摄像机模型都是针孔摄像机,摄像机的标定问题是CV领域的一个入门级的问题,初学摄像机标定时会被各种坐标系弄晕,这里再介绍一下,常提到的坐标系有四个:世界坐标系(Ow,以空间一点为原点)、摄像机坐标系(Oc以小孔即光心为原点)、图像物理坐标系(O1以像平面中心为原点)、图像像素坐标系(O以像平面左下角为原点)。这样再看相关资料的时候就不会混了吧,这里再介绍一篇张正友的摄像机定标办法的相关资料http://beidou841026.blog.163.com/blog/static/4629535201021731344572/
其参数分为内参数和外参数:内参数是摄像机坐标系和理想坐标系之间的关系(5个内参数,分别为α、β、u0、v0、θ);外参数表示摄像机在世界坐标系里的位置和方向(6个外参数,3个表示旋转R的角度,3个表示平移t)。

利用calibrateCamera函数可以得到这些内外参数,而

calibrationMatrixValues可以得到摄像机投影透视方程的投影矩阵,

composeRT可以合并两个旋转平移变换,

computeCorrespondEpilines计算其他图像的相应epilines,convertPointsToHomogeneous把点从欧式空间转换到齐次空间,convertPointsFromHomogeneous把点从齐次空间变换到欧式空间,而函数convertPointsHomogeneous把上述两个函数功能综合到一起了,decomposeProjectionMatrix可以将矩阵分解,drawChessboardCorners获得检测棋盘的角,findChessboardCorners获得棋盘的内角点位置,findCirclesGrid得到圆圈光栅的中心,solvePnP实现物体位置的3维坐标和2维坐标之间的转换,solvePnPRansac利用RANSAC实现上述功能,findFundamentalMat计算两幅图像关联点的基础矩阵,findHomography找出两个平面的透视变换,estimateAffine3D计算两个3维点集的理想仿射变换,filterSpeckles可以过滤不同块的小斑点,getOptimalNewCameraMatrix得到自由比例参数的新摄像机矩阵,initCameraMatrix2D得到3D到2D的初始化的摄像机矩阵,matMulDeriv计算矩阵的偏导数,projectPoints将3D坐标投影到图像平面上,reprojectImageTo3D根据一组差异图像重建3D空间,RQDecomp3x3计算3x3矩阵的RQ分解,Rodrigues实现旋转矩阵和旋转向量之间的转换,steroCalibrate校准立体摄像机,steroRectify是对校准过的摄像机计算修正变换,stereoRectifyUncalibrated是对未校准过的摄像机计算修正变换

还包括了BM块匹配算法类StereoBM、SGBM块匹配算法类StereoSGBM类

2、CamShitf算法

CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算,将上一帧结果作为下一帧的初始值,迭代下去。基本步骤为:

1).选取关键区域

2).计算该区域的颜色概率分布--反向投影图

3).用MeanShift算法找到下一帧的特征区域

4).标记并重复上述步骤

该算法的关键就是可以在目标大小发生改变的时候,可以自适应的调整目标区域继续跟踪

在进行CamShitf和MeanShift算法的时候,需要输入反向投影图,这就要求有个很重要的预处理过程是计算反向投影图。对应的函数为calcBackProject。所谓反向投影图就是一个概率密度图。calcBackProject的输入通常为目标区域的直方图和待跟踪图像的直方图,输出与待跟踪图像大小相同,每一个像素点表示该点为目标区域的概率。这个点越亮,该点属于物体的概率越大。这样的输入参数太适合做MeanS算法了。关于反向直方图,可以参考一下这篇文章http://blog.163.com/thomaskjh@126/blog/static/370829982010112810358501/

具体代码如下:

view plain
calcHist(&roi, 1, 0, maskroi, hist, 1, &hsize, &phranges);  
calcBackProject(&hue, 1, 0, hist, backproj, &phranges);  
backproj &= mask;  
RotatedRect trackBox = CamShift(backproj, trackWindow,  TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));

3、运动分析和物体跟踪Video

这个库中相关的函数有calcOpticalFlowPyrLK、calcOpticalFlowFarneback、estimateRigidTransform、updateMotionHistory、calcMotionGradient、calcGlobalOrientation、segmentMotion、CamShift、meanShift;还有卡尔曼滤波器类KalmanFilter,类内成员函数有构造函数、init、predict、correct。背景单元类BackgroundSubtractor,包括运算符重载,getBackgroundImage,其派生类BackgroundSubtractorMOG和BackgroundSubtractorMOG2,以及只支持Python版本的函数CalcOpticalFlowBM、CalcOpticalFlowHS,c版本的函数cvCalcOpticalFlowLK

这些函数每一个背后几乎都是一篇论文,很多都是经典的方法,我才疏识浅,只能边学边总结,先介绍一些我用过的函数,待日后陆续补充

calcOpticalPlowPyrLK是利用Lucas-Kanade方法计算图像的光流场

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: