這里寫目錄標題
- 1. 步驟
- 1.1 導入OpenCV庫:
- 1.2 加載圖像
- 1.3 提取特征
- 1.4 匹配特征
- 1.5 顯示結果
- 2. 完整代碼
- 3. 測試圖片及效果
1. 步驟
1.1 導入OpenCV庫:
在您的C++代碼中,首先需要導入OpenCV庫。您可以使用以下語句導入核心模塊:
#include <opencv2/core/core.hpp>
1.2 加載圖像
使用OpenCV的 imread 函數加載要搜索的圖像和目標圖像。例如,假設您要搜索的圖像是"search_image.jpg",目標圖像是"target_image.jpg",您可以使用以下代碼加載它們:
cpp
cv::Mat searchImage = cv::imread("search_image.jpg");
cv::Mat targetImage = cv::imread("target_image.jpg");
1.3 提取特征
使用OpenCV的特征提取方法(如SIFT、SURF或ORB)從目標圖像中提取特征。例如,使用SIFT算法可以提取特征,您可以使用以下代碼:
cv::Ptr<cv::SIFT> sift = cv::SIFT::create();
cv::Mat targetDescriptors;
std::vector<cv::KeyPoint> targetKeypoints;
sift->detectAndCompute(targetImage, cv::noArray(), targetKeypoints, targetDescriptors);
1.4 匹配特征
使用提取的特征在搜索圖像中尋找匹配。您可以使用OpenCV的特征匹配方法(如FLANN或Brute-Force)進行匹配。以下是一個使用Brute-Force匹配器的示例:
cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create(cv::DescriptorMatcher::BRUTEFORCE);
std::vector<cv::DMatch> matches;
matcher->match(searchDescriptors, targetDescriptors, matches);
1.5 顯示結果
根據匹配結果,您可以選擇在搜索圖像上繪制匹配的關鍵點或邊界框。以下是一個簡單的示例,用于在搜索圖像上繪制匹配的關鍵點:
cv::Mat outputImage;
cv::drawMatches(searchImage, searchKeypoints, targetImage, targetKeypoints, matches, outputImage);
cv::imshow("Matches", outputImage);
cv::waitKey(0);
2. 完整代碼
#include <opencv2/core/core.hpp>int search_pic_by_pic()
{// 加載查詢圖像和目標圖像cv::Mat queryImage = cv::imread("E:\\code\\Yolov5_Tensorrt_Win10-master\\pictures\\search_pic_by_pic\\1.png");cv::Mat targetImage = cv::imread("E:\\code\\Yolov5_Tensorrt_Win10-master\\pictures\\search_pic_by_pic\\2.png");// 特征提取cv::Ptr<cv::Feature2D> featureExtractor = cv::SIFT::create();cv::Mat queryDescriptors, targetDescriptors;std::vector<cv::KeyPoint> queryKeypoints, targetKeypoints;featureExtractor->detectAndCompute(queryImage, cv::noArray(), queryKeypoints, queryDescriptors);featureExtractor->detectAndCompute(targetImage, cv::noArray(), targetKeypoints, targetDescriptors);// 特征匹配cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create(cv::DescriptorMatcher::FLANNBASED);std::vector<cv::DMatch> matches;matcher->match(queryDescriptors, targetDescriptors, matches);// 根據匹配結果進行排序std::sort(matches.begin(), matches.end(), [](const cv::DMatch& a, const cv::DMatch& b) {return a.distance < b.distance;});float threshold = 200.0;int numMatches = 0;int matches_size = matches.size();vector< cv::DMatch>::iterator it = matches.begin();for (it; it != matches.end();) {if (it->distance < threshold) {numMatches++;it++;}else {it = matches.erase(it);}}float matchRate = static_cast<float>(numMatches) / matches_size * 100.0;std::cout << "Match Rate: " << matchRate << "%" << std::endl;// 顯示匹配結果cv::Mat matchedImage;cv::drawMatches(queryImage, queryKeypoints, targetImage, targetKeypoints, matches, matchedImage);cv::imshow("Matched Image", matchedImage);cv::waitKey(0);return 0;
}int main()
{search_pic_by_pic();return 0;
}
3. 測試圖片及效果