C++ OpenCV-FAST+;简介:如何使用DrawMatchesFlags::draw_RICH_关键点绘制关键点?

C++ OpenCV-FAST+;简介:如何使用DrawMatchesFlags::draw_RICH_关键点绘制关键点?,c++,opencv,feature-detection,C++,Opencv,Feature Detection,我必须使用FAST+BRIEF实现一个特性检测器(如果我理解正确,这是ORB的手动实现) 这是我到目前为止的代码: printf("Calculating FAST+BRIEF features...\n"); Ptr<FastFeatureDetector> FASTdetector = FastFeatureDetector::create(); Ptr<BriefDescriptorExtractor> BRIEFdescriptor = BriefDescrip

我必须使用FAST+BRIEF实现一个特性检测器(如果我理解正确,这是ORB的手动实现)

这是我到目前为止的代码:

printf("Calculating FAST+BRIEF features...\n");

Ptr<FastFeatureDetector> FASTdetector = FastFeatureDetector::create();
Ptr<BriefDescriptorExtractor> BRIEFdescriptor = BriefDescriptorExtractor::create();
std::vector<cv::KeyPoint> FASTkeypoints_1, FASTkeypoints_2, FASTkeypoints_3;
Mat BRIEFdescriptors_1, BRIEFdescriptors_2, BRIEFdescriptors_3;

FASTdetector->detect(left08, FASTkeypoints_1);
FASTdetector->detect(right08, FASTkeypoints_2);
FASTdetector->detect(left10, FASTkeypoints_3);

BRIEFdescriptor->compute(left08, FASTkeypoints_1, BRIEFdescriptors_1);
BRIEFdescriptor->compute(right08, FASTkeypoints_2, BRIEFdescriptors_2);
BRIEFdescriptor->compute(left10, FASTkeypoints_3, BRIEFdescriptors_3);

Mat FAST_left08, FAST_right08, FAST_left10;

drawKeypoints(left08, FASTkeypoints_1, FAST_left08, FASTBRIEFfeatcol_YELLOW, DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imwrite("../Results/FASTBRIEF_left08.png", FAST_left08);
drawKeypoints(right08, FASTkeypoints_2, FAST_right08, FASTBRIEFfeatcol_YELLOW, DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imwrite("../Results/FASTBRIEF_right08.png", FAST_right08);
drawKeypoints(left10, FASTkeypoints_3, FAST_left10, FASTBRIEFfeatcol_YELLOW, DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imwrite("../Results/FASTBRIEF_left10.png", FAST_left10);
printf("FAST+BRIEF done. \n");
printf(“快速计算+简要功能…\n”);
Ptr FASTdetector=FastFeatureDetector::create();
Ptr-BRIEFdescriptor=BriefDescriptorExtractor::create();
std::向量FASTkeypoints_1、FASTkeypoints_2、FASTkeypoints_3;
Mat简介描述符_1、简介描述符_2、简介描述符_3;
FASTdetector->detect(左08,FASTkeypoints_1);
FASTdetector->detect(右08,FASTkeypoints_2);
FASTdetector->detect(左10,FASTkeypoints_3);
简短描述符->计算(left08,FASTkeypoints_1,简短描述符_1);
简明描述符->计算(right08,FASTkeypoints_2,简明描述符_2);
简短描述符->计算(left10,FASTkeypoints_3,简短描述符_3);
垫快左08,快右08,快左10;
drawKeypoints(left08、FASTkeypoints\u 1、FAST\u left08、FASTBRIEFfeatcol\u黄色、DrawMatchesFlags::DRAW\u RICH\u关键点);
imwrite(“../Results/fastsbrief_left08.png”,FAST_left08);
drawKeypoints(right08,FASTkeypoints_2,FAST_right08,FASTBRIEFfeatcol_黄色,DrawMatchesFlags::DRAW_RICH_关键点);
imwrite(“../Results/FASTBRIEF_right08.png”,FAST_right08);
drawKeypoints(left10、FASTkeypoints\u 3、FAST\u left10、FASTBRIEFfeatcol\u黄色、DrawMatchesFlags::DRAW\u RICH\u关键点);
imwrite(“../Results/fastsbrief_left10.png”,FAST_left10);
printf(“快速+简要完成。\n”);
到目前为止,代码运行得非常好,但是我没有得到丰富的关键点,而是标准的关键点。如果我理解正确,这是因为我需要以某种方式首先将描述符信息获取到关键点,对吗

在此之前,我对SIFT、SURF和ORB进行了相同的实现,但在那里我直接使用了
computeanddetect
函数,它为我提供了关键点,在这里我可以使用
DrawMatchesFlags::draw\u RICH\u keypoints
标志进行绘制

我必须使用FAST+BRIEF实现一个特性检测器(如果我理解正确,这是ORB的手动实现)

是的,没错

如果我理解正确,这是因为我需要以某种方式首先将描述符信息获取到关键点,对吗

否,关键点是通过使用不同的方法检测的。您可以先使用SIFT、FAST、HarrisDetector、SURF等来检测关键点。然后有不同的方法来描述检测到的关键点(例如,用于SIFT的128位浮点向量描述符)并在之后进行匹配。
OpenCV中的关键点可以通过不同的属性角度、大小、倍频程等来描述
对于SIFT,每个关键点属性都用一个数字填充,以后可以在
DRAW\u RICH\u关键点
标志中绘制该数字。对于FAST,仅为属性指定标准值,以便可以使用所述标志绘制关键点,但大小、倍频程和角度不会变化。因此,每个绘制的关键点看起来都相似

这里有一个小代码示例作为证明(我只使用
->detect
函数):

#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
//加载图像
cv::Mat img=cv::imread(“MT189.jpg”,cv\u LOAD\u IMAGE\u灰度);
如果(!img.data){
标准::cout
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>  

int main(int argc, char** argv)
{

    // Load image
    cv::Mat img = cv::imread("MT189.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    if (!img.data) {
        std::cout << "Error reading image" << std::endl;
        return EXIT_FAILURE;
    }
    cv::Mat output;

    // Detect FAST keypoints
    std::vector<cv::KeyPoint> keypoints_fast, keypoints_sift;
    cv::Ptr<cv::FastFeatureDetector> fast = cv::FastFeatureDetector::create();
    fast->detect(img, keypoints_fast);
    for (size_t i = 0; i < 100; ++i) {
        std::cout << "FAST Keypoint #:" << i;
        std::cout << " Size " << keypoints_fast[i].size << " Angle " << keypoints_fast[i].angle << " Response " << keypoints_fast[i].response << " Octave " << keypoints_fast[i].octave << std::endl;
    }

    // Detect SIFT keypoints
    cv::Ptr<cv::xfeatures2d::SiftFeatureDetector> sift = cv::xfeatures2d::SiftFeatureDetector::create();
    sift->detect(img, keypoints_sift);

    for (size_t i = 0; i < 100; ++i) {
        std::cout << "SIFT Keypoint #:" << i;
        std::cout << " Size " << keypoints_sift[i].size << " Angle " << keypoints_sift[i].angle << " Response " << keypoints_sift[i].response << " Octave " << keypoints_sift[i].octave << std::endl;
    }

    // Draw SIFT keypoints
    cv::drawKeypoints(img, keypoints_sift, output, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    cv::imshow("Output", output);
    cv::waitKey(0);


}