根据该文档,SIFT对象可以使用下面的函数来计算多个图像的描述符:
virtual void compute(InputArrayOfArrays图片,std :: vector< std :: vector< KeyPoint>>& 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 ?
答案 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_imgs
是vector<Mat>
,则效果很好。
您不需要创建50000个元素的向量,只需使用vector<Mat> train_descriptors;
。
OutputArrayOfArrays
,如InputArray
,OutputArray
等,是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);