openCV特征点识别与findHomography算法过滤⼀,⾸先我们对函数先进⾏分析
findHomography:
计算多个⼆维点对之间的最优单映射变换矩阵 H(3⾏x3列) (就是对图⽚的矫正),使⽤最⼩均⽅误差或者RANSAC⽅法函数功能:找到两个平⾯之间的转换矩阵。
墙纸手机
这⾥涉及到映射变换的知识,
下⾯介绍下什么是映射变换:
1,如下图所⽰:
如果平⾯上点场的点建⽴了⼀个⼀⼀对应,并且满⾜:
(1)任何共线三点的象仍是共线三点;
(2)共线四点的交⽐不变。
则这个⼀⼀对应叫做点场的射影变换,简称射影变换
交⽐:
⼀维射影变换:
⼆维的图像是这样的
射影变换也叫做单应(Homography)粗心反义词
图1通过H矩阵变换变成图2,就是这个函数的公式
X′=HX
X′代表图2
其操作过程
在“⼤”图像(⽬标图像)上选择4个点和“⼩”图像(被合并图像)的四⾓做对应,然后根据这4对对应的点计算两幅图像的单应矩阵。
苹果黄瓜汁
得到单应矩阵H后,利⽤函数warpPerspective将H应⽤到“⼩”图像上,得到图像M
将图像M合并到⽬标图像中选择的四个点的位置
Mat cv::findHomography ( InputArray srcPoints,
InputArray dstPoints,
int method = 0,男士的英文
double ransacReprojThreshold = 3,
OutputArray mask = noArray(),
const int maxIters = 2000,
const double confidence = 0.995
)
参数详解:
srcPoints 源平⾯中点的坐标矩阵,可以是CV_32FC2类型,也可以是vector<Point2f>类型
dstPoints ⽬标平⾯中点的坐标矩阵,可以是CV_32FC2类型,也可以是vector<Point2f>类型
method 计算单应矩阵所使⽤的⽅法。不同的⽅法对应不同的参数,具体如下:
0 - 利⽤所有点的常规⽅法
RANSAC - RANSAC-基于RANSAC的鲁棒算法
LMEDS - 最⼩中值鲁棒算法
RHO - PROSAC-基于PROSAC的鲁棒算法
ransacReprojThreshold
将点对视为内点的最⼤允许重投影错误阈值(仅⽤于RANSAC和RHO⽅法)。如果
则点被认为是个外点(即错误匹配点对)。若srcPoints和dstPoints是以像素为单位的,则该参数通常设置在1到10的范围内。
mask
可选输出掩码矩阵,通常由鲁棒算法(RANSAC或LMEDS)设置。 请注意,输⼊掩码矩阵是不需要设置的。
maxIters RANSAC 算法的最⼤迭代次数,默认值为2000。
confidence 可信度值,取值范围为0到1.
⾸先定义两个vector保存对应的4对点
//图⽚映射矩阵把不同⾓度的图⽚矫正
void findHomographyText(){
// Read source image.
Mat src = imread("F:\\视觉\\opencv\\pic\\1.png");
// Four corners of the book in source image
vector<Point2f> pts_src;
pts_src.push_back(Point2f(0, 0));
pts_src.push_back(ls, 0));
pts_src.push_back(ls, ws));
pts_src.push_back(Point2f(0, ws));
// Four corners of the book in destination image.
vector<Point2f> pts_dst;
pts_dst.push_back(Point2f(0, 0));
pts_dst.push_back(ls/4, 0));
pts_dst.push_back(ls/3, ws));
pts_dst.push_back(Point2f(0, ws/2));
// Calculate Homography
Mat h = findHomography(pts_src, pts_dst);
// Output image
Mat im_out;
泡面要泡几分钟
/
/ Warp source image to destination bad on homography
关于父爱的文章
warpPerspective(src, im_out, h, src.size());
// Display images
imshow("Source Image", src);
imshow("Warped Source Image", im_out);
waitKey(0);
}
结果如下图所⽰对图像进⾏拉伸
步骤如下
1,相求H
vector<Point2f> pts_src;
pts_src.push_back(Point2f(0, 0));
pts_src.push_back(ls, 0));
pts_src.push_back(ls, ws));
pts_src.push_back(Point2f(0, ws));
作揖读音// Four corners of the book in destination image.
vector<Point2f> pts_dst;无忧无虑什么意思
pts_dst.push_back(Point2f(0, 0));
pts_dst.push_back(ls/4, 0));
pts_dst.push_back(ls/3, ws));
pts_dst.push_back(Point2f(0, ws/2));
// Calculate Homography
Mat h = findHomography(pts_src, pts_dst);
通过H求对应的图像(映射到输出图⽚上)
warpPerspective(src, im_out, h, src.size());
warpPerspective:通过H求取
im_out输出值介绍完两个主要的函数下⾯开始对图像进⾏识别和标记
2,SURF对图像的识别和标记
1,开发思路
(1)使⽤SIFT或者SURF进⾏⾓点检测,获取两个图像的的⾓点集合
(2)根据两个集合,使⽤特征点匹配,匹配类似的点 FlannBadMatcher (3)过滤特征点对。
(4)通过特征点对,求出H值
(5)画出特征区域
代码实现:
1,使⽤SIFT或者SURF进⾏⾓点检测,获取两个图像的的⾓点集合