#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
// Mat image = imread("D:/images/butterfly.jpg");
Mat book = imread("C:/newword/image/29.jpg");
Mat book_on_desk = imread("C:/newword/image/30.jpg");
imshow("book", book);
auto orb = ORB::create(500);
vector<KeyPoint> kypts_book;
vector<KeyPoint> kypts_book_on_desk;
Mat desc_book, desc_book_on_desk;
orb->detectAndCompute(book, Mat(), kypts_book, desc_book);
orb->detectAndCompute(book_on_desk, Mat(), kypts_book_on_desk, desc_book_on_desk);//
orb->detectAndCompute(book, Mat(), kypts_book, desc_book); 这行代码的作用是使用 ORB(Oriented FAST and Rotated BRIEF)算法,对名为 book 的图像进行特征点检测并计算其描述符。下面详细解释这行代码的各个部分:
1. orb:orb 是一个 ORB 类的智能指针,通过 ORB::create(500) 创建,500 表示要检测的最大特征点数量。ORB 是一种快速的特征点检测和描述算法,常用于计算机视觉任务中的图像匹配等操作。
2. detectAndCompute:这是 ORB 类的一个成员函数,它具有双重功能,既可以检测图像中的特征点(关键点),又能计算这些特征点对应的描述符。
3. book:这是一个 Mat 类型的变量,代表要进行特征检测和描述符计算的输入图像,在这里它存储了从文件中读取的名为 book.jpg 的图像数据。
4. Mat():这是一个空的掩码矩阵。在 detectAndCompute 函数中,掩码可以用来指定只对图像的某些区域进行特征检测和计算。这里传入一个空的 Mat(),表示对整幅图像进行操作,不使用掩码的过滤功能。
5. kypts_book:这是一个 vector<KeyPoint> 类型的变量,用于存储在 book 图像中检测到的所有关键点(特征点)。每个 KeyPoint 对象包含了关键点的位置、尺度、方向等信息。
6. desc_book:这是一个 Mat 类型的变量,用于存储与 kypts_book 中关键点对应的描述符。描述符是一个向量,它描述了关键点周围图像的局部特征,这些特征可以用于后续的图像匹配操作。
通过执行这行代码,ORB 算法会在 book 图像中找到特征点,并计算出这些特征点的描述符,为后续的图像匹配、目标识别等计算机视觉任务提供基础数据。
Mat result;
auto bf_matcher = BFMatcher::create(NORM_HAMMING, false);
vector<DMatch> matches;
bf_matcher->match(desc_book, desc_book_on_desk, matches);
drawMatches(book, kypts_book, book_on_desk, kypts_book_on_desk, matches, result);
imshow("暴力匹配", result);
waitKey(0);
return 0;
}
1. Mat result;
• 声明一个Mat对象result,用于存储绘制匹配结果后的图像。Mat是OpenCV中用于表示图像和矩阵的核心数据结构。
2. auto bf_matcher = BFMatcher::create(NORM_HAMMING, false);
• 创建一个BFMatcher(暴力匹配器)对象bf_matcher。
• NORM_HAMMING表示使用汉明距离来度量特征向量之间的相似度,通常用于ORB、BRIEF等二进制描述符。
• false表示不使用交叉检查,交叉检查可以提高匹配的准确性,但会增加计算量。
3. vector<DMatch> matches;
• 声明一个vector<DMatch>对象matches,用于存储匹配结果。DMatch结构体包含了每个匹配的详细信息,如查询描述符的索引、训练描述符的索引、距离等。
4. bf_matcher->match(desc_book, desc_book_on_desk, matches);
• 使用bf_matcher对两组特征描述符desc_book和desc_book_on_desk进行匹配,并将匹配结果存储在matches中。desc_book和desc_book_on_desk应该是之前提取的特征描述符,通常由ORB、SIFT、SURF等特征提取算法生成。
5. drawMatches(book, kypts_book, book_on_desk, kypts_book_on_desk, matches, result);
• 使用drawMatches函数将匹配结果绘制到result图像中。
• book和book_on_desk分别是原始图像和待匹配图像。
• kypts_book和kypts_book_on_desk分别是在book和book_on_desk图像上提取的关键点。
• matches是前面得到的匹配结果。