根据文档,SIFT对象可以使用下面的函数来计算多个图像的描述符:
虚拟空计算(InputArrayOfArrays映像,std::vector< std::vector< KeyPoint >&KeyPoint,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);它可以在MacOS10.10.5下用opencv3编译,而在执行过程中可能会因错误而终止:
libc++abi.dylib:以std::length_error:向量类型的未明确例外终止
或者我可以将train_descriptors类型更改为Mat (而不是vector< Mat >),但在执行过程中仍然会出现另一个错误:
函数计算中的断言失败( /tmp/opencv320151228-32931-2p5ggk/opencv-3.1.0/modules/features2d/src/feature2d.cpp,() == _InputArray::STD_VECTOR_MAT),文件OpenCV第126行libc++abi.dylib:在函数计算中终止cv::OpenCV: /tmp/opencv320151228-32931-2p5ggk/opencv-3.1.0/modules/features2d/src/feature2d.cpp:126:错误:(-215) _descriptors.kind() == _InputArray::STD_VECTOR_MAT
,我应该使用什么类型的train_descriptors来使这段代码正确编译和运行?
有人能告诉我OutputArrayOfArrays和vector< Mat >有什么区别吗?
发布于 2015-12-29 13:15:53
你的代码
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和std::vector函数的抽象层。您不应该显式地使用这些类。来自OpenCV文档的
该类仅为传递参数而设计。也就是说,通常不应该声明此类成员、局部变量和全局变量。
另外,请注意,OutputArrayOfArrays只是OutputArray的类型。
发布于 2015-12-29 09:29:15
我想,这段代码是可行的:
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);https://stackoverflow.com/questions/34507914
复制相似问题