Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关键点描述符OpenCV_C++_Opencv_Keypoint_Feature Descriptor - Fatal编程技术网

C++ 关键点描述符OpenCV

C++ 关键点描述符OpenCV,c++,opencv,keypoint,feature-descriptor,C++,Opencv,Keypoint,Feature Descriptor,我试图理解如何在OpenCV中获取给定关键点的描述符。到目前为止,我的代码如下所示: #include <iostream> #include "opencv2/opencv.hpp" typedef cv::Mat Image; int main(int argc, const char * argv[]) { Image imgA = cv::imread("images/buddhamulticam_total100.png",

我试图理解如何在OpenCV中获取给定
关键点的描述符。到目前为止,我的代码如下所示:

#include <iostream>
#include "opencv2/opencv.hpp"

typedef cv::Mat Image;

int main(int argc, const char * argv[])
{

    Image imgA = cv::imread("images/buddhamulticam_total100.png",
                              CV_LOAD_IMAGE_GRAYSCALE);
    Image imgB = cv::imread("images/buddhamulticam_total101.png", 
                            CV_LOAD_IMAGE_GRAYSCALE);

    cv::Ptr<cv::FeatureDetector> detector = 
                    cv::FeatureDetector::create("ORB");
    cv::Ptr<cv::DescriptorExtractor> descriptor = 
                    cv::DescriptorExtractor::create("ORB");

    std::vector<cv::KeyPoint> keyPointsA, keyPointsB;

    keyPointsA.push_back(cv::KeyPoint(0,0,5));
    keyPointsB.push_back(cv::KeyPoint(10,10,5));

    cv::Mat descriptorA, descriptorB;
    descriptor->compute(imgA, keyPointsA, descriptorA);
    descriptor->compute(imgB, keyPointsB, descriptorB);

    std::cout << "DescriptorA (" << descriptorA.rows << "," <<
                descriptorA.cols << ")" << std::endl;
    std::cout << "DescriptorB (" << descriptorB.rows << "," 
              << descriptorB.cols << ")" << std::endl;
    return 0;
}
#包括
#包括“opencv2/opencv.hpp”
typedef cv::Mat图像;
int main(int argc,const char*argv[]
{
Image imgA=cv::imread(“images/buddhamulticam_total100.png”,
CV_加载_图像_灰度);
Image imgB=cv::imread(“images/buddhamulticam_total101.png”,
CV_加载_图像_灰度);
cv::Ptr检测器=
cv::FeatureDetector::创建(“ORB”);
cv::Ptr描述符=
cv::DescriptorExtractor::创建(“ORB”);
std::向量keyPointsA,keyPointsB;
关键点a.向后推(cv::关键点(0,0,5));
关键点b.向后推(cv::关键点(10,10,5));
cv::Mat描述符RA,描述符RB;
描述符->计算(imgA、keyPointsA、描述符);
描述符->计算(imgB、keyPointsB、描述符RB);

std::cout您正试图在点(0,0)和(10,10)上计算ORB,但它们太靠近图像边界,因此ORB无法计算这些位置的描述符。ORB(以及其他二进制描述符)会将它们过滤掉

编辑:由于您询问了用法,我正在编辑答案。您应该传递整个图像。我将其用作:

Ptr<FeatureDetector> detector = FeatureDetector::create(detector_name);
Ptr<DescriptorExtractor> descriptor = DescriptorExtractor::create(descriptor_name);

detector->detect(imgK, kp);
descriptor->compute(imgK, kp, desc);
Ptr-detector=FeatureDetector::create(检测器名称);
Ptr descriptor=DescriptorExtractor::create(描述符名称);
检测器->检测(imgK、kp);
描述符->计算(imgK、kp、desc);

让我明白,点是(0,0)和(10,10)?是的,这是opencv的文档所说的。好的,我明白了,但是创建
关键点并将其传递给
描述符牵引器
的方法是可以的?如果我在图像中取一个5x5的小补丁,在计算描述符时,我应该传递整个图像还是只传递该补丁?