当前位置:   article > 正文

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

c++光流法goodfeaturestotrack

光流法追踪角点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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

一、函数解读
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 )
  • 1
  • 2
  • 3
  • 4

**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 )
  • 1
  • 2
  • 3

_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);
  • 1
  • 2
  • 3

-prevImg: 深度为8位的前一帧图像或金字塔图像。
-nextImg:和prevImg有相同的大小和类型,后一帧图像或金字塔。
-prevPts:计算光流所需要的输入2D点矢量,点坐标必须是单精度浮点数。
-nextPts:输出2D点矢量(也是单精度浮点数坐标),点矢量中包含的是在后一帧图像上计算得到的输入特征新位置。
-status:输出状态矢量(元素是无符号char类型,uchar),如果相应特征的流发现则矢量元素置为1,否则,为0。
-err:输出误差矢量。
-winSize:每个金字塔层搜索窗大小。
-maxLevel:金字塔层的最大数目;如果置0,金字塔不使用(单层);如果置1,金字塔2层,等等以此类推。
-criteria:指定搜索算法收敛迭代的类型
-minEigTheshold:算法计算的光流等式的2x2常规矩阵的最小特征值。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/488842
推荐阅读
相关标签
  

闽ICP备14008679号