在 OpenCv 3.2 中使用 ORB、Fast、Brsik 等特征描述符
Using featuredescriptors like ORB, Fast, Brsik with OpenCv 3.2
我对 OpenCV
很陌生。我按照 this tutorial 在图片中搜索对象,我能够 运行 代码成功。
在搜索时,我看到有 more options 用于特征匹配(例如 Fast
、ORB
或 BRISK
)。所以我决定尝试使用不同于 SURF
.
的描述符
但我遇到了麻烦。我需要做什么才能创建不同的描述符?有人可以帮助我,也许可以提供 OpenCV3.2
的代码示例吗? :)
这是我在搜索时找到的 link,但遗憾的是它不是 OpenCV 3.2
。
OpenCV 3 引入了一致的特征检测API。
也就是说,每个特征检测器都实现了一个静态的 create() 方法,该方法 returns 一个 cv::Ptr 到相应的检测器。
这是一个简单的示例,它显示了所描述的行为:
#include <iostream>
#include <vector>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>
int main(int argc, char *argv[])
{
if(argc > 1) {
cv::Mat img = cv::imread(argv[1], cv::ImreadModes::IMREAD_GRAYSCALE);
if(!img.empty()) {
cv::Ptr<cv::xfeatures2d::SiftFeatureDetector> siftDetector = cv::xfeatures2d::SiftFeatureDetector::create();
cv::Ptr<cv::BRISK> briskDetector = cv::BRISK::create();
std::vector<cv::KeyPoint> siftKeypoints;
std::vector<cv::KeyPoint> briskKeypoints;
siftDetector->detect(img, siftKeypoints);
briskDetector->detect(img, briskKeypoints);
std::cout << "Detected " << siftKeypoints.size() << " SIFT keypoints." << std::endl;
std::cout << "Detected " << briskKeypoints.size() << " BRISK keypoints." << std::endl;
return 0;
} else {
std::cout << "Unable to load image, aborting." << std::endl;
return -1;
}
}
std::cout << "A path to an (image) file is missing." << std::endl;
return -1;
}
按照这个示例,您可以使用最新文档中的每个 OpenCV 检测器:
我对 OpenCV
很陌生。我按照 this tutorial 在图片中搜索对象,我能够 运行 代码成功。
在搜索时,我看到有 more options 用于特征匹配(例如 Fast
、ORB
或 BRISK
)。所以我决定尝试使用不同于 SURF
.
但我遇到了麻烦。我需要做什么才能创建不同的描述符?有人可以帮助我,也许可以提供 OpenCV3.2
的代码示例吗? :)
这是我在搜索时找到的 link,但遗憾的是它不是 OpenCV 3.2
。
OpenCV 3 引入了一致的特征检测API。
也就是说,每个特征检测器都实现了一个静态的 create() 方法,该方法 returns 一个 cv::Ptr 到相应的检测器。
这是一个简单的示例,它显示了所描述的行为:
#include <iostream>
#include <vector>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>
int main(int argc, char *argv[])
{
if(argc > 1) {
cv::Mat img = cv::imread(argv[1], cv::ImreadModes::IMREAD_GRAYSCALE);
if(!img.empty()) {
cv::Ptr<cv::xfeatures2d::SiftFeatureDetector> siftDetector = cv::xfeatures2d::SiftFeatureDetector::create();
cv::Ptr<cv::BRISK> briskDetector = cv::BRISK::create();
std::vector<cv::KeyPoint> siftKeypoints;
std::vector<cv::KeyPoint> briskKeypoints;
siftDetector->detect(img, siftKeypoints);
briskDetector->detect(img, briskKeypoints);
std::cout << "Detected " << siftKeypoints.size() << " SIFT keypoints." << std::endl;
std::cout << "Detected " << briskKeypoints.size() << " BRISK keypoints." << std::endl;
return 0;
} else {
std::cout << "Unable to load image, aborting." << std::endl;
return -1;
}
}
std::cout << "A path to an (image) file is missing." << std::endl;
return -1;
}
按照这个示例,您可以使用最新文档中的每个 OpenCV 检测器: