数字图像处理项目:光流法追踪角点calcOpticalFlowPyrLk(),goodFeaturesToTrack(),cornerSubPix()

光流法追踪角点calcOpticalFlowPyrLk()

使用代码

#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常规矩阵的最小特征值。

两张超声图像
在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值