Opencv学习笔记三:Surf特征检测,实现图像匹配

标签:
opencvsurf特征匹配 |
分类: 上下求索 |
// step1:检测surf特征点
CSorterChecker_Model *pModel = reinterpret_cast(m_pPublicModelData);
std::vector vtGoodMatches;
for (int i = 0; i < (int)vtMatches.size(); i++)
{
}
nSize = (int)vtGoodMatches.size();
if ((int)vtGoodMatches.size() < 1)
{
}
Mat matMatches = matSrc;
Mat matDrawMatch = matMod;
// step6:定位物体,找出匹配特征点之间的变换
std::vector vtSrc;
std::vector vtMod;
// 所有的匹配点得到匹配的中心点
float fCenterX = 0.0, fCenterY = 0.0;
for (int i = 0; i < (int)vtGoodMatches.size(); i++)
{
}
fCenterX = fCenterX / vtMatches.size();
fCenterY = fCenterY / vtMatches.size();
// 得到模板匹配后的中心点
cv::circle(matMatches, Point(fCenterX, fCenterY), 3, Scalar(255), 3);
// 找出匹配特征点之间的变换
Mat matHom = cv::findHomography(vtMod, vtSrc, CV_RANSAC);
if (matHom.data == NULL)
{
}
// 得到模板图像的角点(待匹配图像的大小)
std::vector vtModCorners(4);
vtModCorners[0] = cv::Point(0, 0);
vtModCorners[1] = cv::Point(matMod.cols, 0);
vtModCorners[2] = cv::Point(matMod.cols, matMod.rows);
vtModCorners[3] = cv::Point(0, matMod.rows);
std::vector vtSrcCorners(4);
// 通过仿射矩阵matHom在检测图像找到和模板图像匹配的四个角点
cv::perspectiveTransform(vtModCorners, vtSrcCorners, matHom);
// 匹配的四个点画到图像上
cv::line(matMatches, vtSrcCorners[0], vtSrcCorners[1], Scalar(0, 255, 0), 4);
cv::line(matMatches, vtSrcCorners[1], vtSrcCorners[2], Scalar(0, 255, 0), 4);
cv::line(matMatches, vtSrcCorners[2], vtSrcCorners[3], Scalar(0, 255, 0), 4);
cv::line(matMatches, vtSrcCorners[3], vtSrcCorners[0], Scalar(0, 255, 0), 4);
Mat matWarpMatrix = cv::getPerspectiveTransform(vtSrcCorners, vtModCorners);
// step7:仿射变化得到旋转后的图像
cv::warpPerspective(matMatches, matAffined, matWarpMatrix, matMod.size(), INTER_LINEAR, BORDER_CONSTANT);
3、试验图像