C++用OPenCV实现两个图像不同角度的模版匹配
时间: 2023-12-30 11:04:18 浏览: 154
可以使用OpenCV中的SURF算法和findHomography函数实现两个图像不同角度的模版匹配。以下是具体步骤:
1. 读取模版图像和待匹配图像。
```c++
cv::Mat img1 = cv::imread("template.png", cv::IMREAD_GRAYSCALE);
cv::Mat img2 = cv::imread("target.png", cv::IMREAD_GRAYSCALE);
```
2. 使用SURF算法进行特征提取。
```c++
cv::Ptr<cv::xfeatures2d::SURF> detector = cv::xfeatures2d::SURF::create();
std::vector<cv::KeyPoint> keypoints1, keypoints2;
cv::Mat descriptors1, descriptors2;
detector->detectAndCompute(img1, cv::noArray(), keypoints1, descriptors1);
detector->detectAndCompute(img2, cv::noArray(), keypoints2, descriptors2);
```
3. 在模版图像和待匹配图像的特征点中,使用FLANN或暴力匹配算法进行特征点匹配。
```c++
cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create(cv::DescriptorMatcher::FLANNBASED);
std::vector<std::vector<cv::DMatch>> knn_matches;
matcher->knnMatch(descriptors1, descriptors2, knn_matches, 2);
std::vector<cv::DMatch> good_matches;
for (int i = 0; i < knn_matches.size(); i++) {
if (knn_matches[i][0].distance < 0.7 * knn_matches[i][1].distance) {
good_matches.push_back(knn_matches[i][0]);
}
}
```
4. 通过RANSAC算法,对匹配的特征点进行筛选,得到最优的匹配点。
```c++
std::vector<cv::Point2f> pts1, pts2;
for (int i = 0; i < good_matches.size(); i++) {
pts1.push_back(keypoints1[good_matches[i].queryIdx].pt);
pts2.push_back(keypoints2[good_matches[i].trainIdx].pt);
}
cv::Mat H = cv::findHomography(pts1, pts2, cv::RANSAC);
```
5. 通过cv::warpPerspective函数,将模版图像投影到待匹配图像上,得到变换后的图像。
```c++
cv::Mat img1_warp;
cv::warpPerspective(img1, img1_warp, H, img2.size());
```
6. 使用cv::matchTemplate函数在待匹配图像上搜索变换后的模版图像,得到匹配结果。
```c++
cv::Mat result;
cv::matchTemplate(img2, img1_warp, result, cv::TM_CCOEFF_NORMED);
double min_val, max_val;
cv::Point min_loc, max_loc;
cv::minMaxLoc(result, &min_val, &max_val, &min_loc, &max_loc);
cv::rectangle(img2, max_loc, cv::Point(max_loc.x + img1.cols, max_loc.y + img1.rows), cv::Scalar::all(255), 2);
```
最后,可以用cv::imshow函数显示匹配结果。
```c++
cv::imshow("Match Result", img2);
cv::waitKey(0);
```
阅读全文