OpenCV3,SIFT计算,带向量<vector <keypoint>&gt;

时间:2015-12-29 09:12:25

标签: opencv c++11 opencv3.0 sift

根据该文档,SIFT对象可以使用下面的函数来计算多个图像的描述符:

  

virtual void compute(InputArrayOfArrays图片,std :: vector&lt; std :: vector&lt; KeyPoint&gt;&gt;&amp; keypoints,OutputArrayOfArrays描述符)

我尝试使用以下代码计算多个图像的SIFT描述符:

Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
vector<vector<KeyPoint>> train_keypoints;
f2d->detect(train_imgs, train_keypoints);

vector<Mat> train_descriptors;
f2d->compute(train_imgs, train_keypoints, train_descriptors);

它可以在Mac OS 10.10.5下用opencv3编译,而它可能在执行期间因错误而终止:

  

libc ++ abi.dylib:以std :: length_error类型的未捕获异常终止:vector

或者我可以将train_descriptors的类型更改为Mat (而不是vector&lt; Mat&gt;),它在执行期间仍会因其他错误而失败:

  

OpenCV错误:计算中的断言失败(_descriptors.kind()== _InputArray :: STD_VECTOR_MAT),文件/tmp/opencv320151228-32931-2p5ggk/opencv-3.1.0/modules/features2d/src/feature2d.cpp,第126行libc ++ abi.dylib:以cv类型的未捕获异常终止::异常:/tmp/opencv320151228-32931-2p5ggk/opencv-3.1.0/modules/features2d/src/feature2d.cpp:126:错误:( -215)_descriptors.kind()== _InputArray :: STD_VECTOR_MAT in function compute

我应该使用什么类型的train_descriptors 来使这段代码编译并正确运行?

有人能告诉我 vector&lt; 之间的区别Mat&gt; OutputArrayOfArrays

2 个答案:

答案 0 :(得分:2)

您的代码

Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
vector<vector<KeyPoint>> train_keypoints;
f2d->detect(train_imgs, train_keypoints);

vector<Mat> train_descriptors;
f2d->compute(train_imgs, train_keypoints, train_descriptors);
如果train_imgsvector<Mat>,则

效果很好。

您不需要创建50000个元素的向量,只需使用vector<Mat> train_descriptors;

OutputArrayOfArrays,如InputArrayOutputArray等,是OpenCV用于允许传递给cv::Mat和{{1}的函数的抽象层}。 您不应该明确使用这些类。来自OpenCV doc

  

该类仅用于传递参数。也就是说,通常您不应该声明此类型的类成员,本地和全局变量。

另请注意,std::vector只是OutputArrayOfArrays的typedef。

答案 1 :(得分:0)

我想这个代码可以工作:

Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
vector<vector<KeyPoint>> train_keypoints;
f2d->detect(train_imgs, train_keypoints);

vector<Mat> train_descriptors = vector<Mat>(5e4);
f2d->compute(train_imgs, train_keypoints, train_descriptors);