赞
踩
使用代码
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { Mat img1 = imread("1.jpg",0); Mat img2 = imread("2.jpg", 0); int win_size = 10; vector<Point2f> corners1; vector<Point2f> corners2; int Max_img1_corners = 500; goodFeaturesToTrack(img1,corners1,Max_img1_corners,0.01,5,noArray(),3,false,0.04); TermCriteria criteria = TermCriteria(TermCriteria::EPS+TermCriteria::COUNT,20,0.03); cornerSubPix(img1,corners1,Size(win_size,win_size),Size(-1,-1),TermCriteria()); //LK vector<uchar> features_found; calcOpticalFlowPyrLK(img1,img2,corners1,corners2,features_found,noArray(),Size(21,21),5,criteria); for (int i = 0; i < corners1.size(); i++) { if (!features_found[i]) continue; line(img1,corners1[i],corners2[i],Scalar(255),1,LINE_AA); circle(img2,corners2[i],3,Scalar(255),-1,8); } imshow("img1",img1); imshow("img2", img2); waitKey(0); return 0; }
一、函数解读
1、goodFeaturesToTrack函数
opencv中的goodFeaturesToTrack函数可以计算Harris角点和shi-tomasi角点,但默认情况下计算的是shi-tomasi角点,函数原型如下:
void cv::goodFeaturesToTrack( InputArray image, OutputArray corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray mask, int blockSize,
bool useHarrisDetector, double harrisK )
**image:**8位或32位浮点型输入图像,单通道
**corners:**保存检测出的角点(vector/Mat(n,2,CV_32FS1))
**maxCorners:**角点数目最大值,如果实际检测的角点超过此值,则只返回前maxCorners个强角点
**qualityLevel:**角点的品质因子
**minDistance:**对于初选出的角点而言,如果在其周围minDistance: 范围内存在其他更强角点,则将此角点删除
**mask:**指定感兴趣区,如不需在整幅图上寻找角点,则用此参数指定ROI
**blockSize:**计算协方差矩阵时的窗口大小
**useHarrisDetector:**指示是否使用Harris角点检测,如不指定,则计算shi-tomasi角点
**harrisK:**Harris角点检测需要的k值
2、cornerSubPix()函数
OpenCV中有cornerSubPixel()这个API函数用来针对初始的整数角点坐标进行亚像素精度的优化,该函数原型如下:
void cv::cornerSubPix( InputArray _image, InputOutputArray _corners,
Size win, Size zeroZone, TermCriteria criteria )
_image为输入的单通道图像;_corners为提取的初始整数角点(比如用goodFeatureToTrack提取的强角点);win为求取亚像素角点的窗口大小,比如设置Size(11,11),需要注意的是11为半径,则窗口大小为23x23;zeroZone是设置的“零区域”,在搜索窗口内,设置的“零区域”内的值不会被累加,权重值为0。如果设置为Size(-1,-1),则表示没有这样的区域;critteria是条件阈值,包括迭代次数阈值和误差精度阈值,一旦其中一项条件满足设置的阈值,则停止迭代,获得亚像素角点。
3、calcOpticalFlowPyrLk()函数
void calcOpticallFlowPyrLK (InuputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray
nextPts, OutputArray status, OutputArray err, Size winSize = Size(21,21), int maxLevel = 3, TermCriteria
criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), int flags = 0, double minEigThreshold = 1e-4);
-prevImg: 深度为8位的前一帧图像或金字塔图像。
-nextImg:和prevImg有相同的大小和类型,后一帧图像或金字塔。
-prevPts:计算光流所需要的输入2D点矢量,点坐标必须是单精度浮点数。
-nextPts:输出2D点矢量(也是单精度浮点数坐标),点矢量中包含的是在后一帧图像上计算得到的输入特征新位置。
-status:输出状态矢量(元素是无符号char类型,uchar),如果相应特征的流发现则矢量元素置为1,否则,为0。
-err:输出误差矢量。
-winSize:每个金字塔层搜索窗大小。
-maxLevel:金字塔层的最大数目;如果置0,金字塔不使用(单层);如果置1,金字塔2层,等等以此类推。
-criteria:指定搜索算法收敛迭代的类型
-minEigTheshold:算法计算的光流等式的2x2常规矩阵的最小特征值。
两张超声图像
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。