当useProvidedKeypoints = true时,cvExtractSURF不起作用

时间:2012-04-13 15:49:01

标签: opencv

所以,我试图提取一些SURF关键点,但我想强加这些关键点!所以,我把最后一个参数设置为“true”,即“useProvidedKeypoints”。

此外,当我创建我的Keypoint时,我使用了默认构造函数(因此那里有一些默认值)。我只改变点“pt”和我设置为3的八度。

我正在使用带有SURF的C ++接口。但我知道cvExtractSURF的问题是正确的,因为我复制了我的代码部分以帮助我调试。

当我调用该函数时,将最后一个参数设置为true,我收到此错误:

OpenCV Error: Bad argument (Unknown array type) in cvarrToMat, file /home/widgg/opencv/trunk/modules/core/src/matrix.cpp, line 651
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/widgg/opencv/trunk/modules/core/src/matrix.cpp:651: error: (-5) Unknown array type in function cvarrToMat

我真的不知道我做错了什么!

编辑:

这是一些代码。首先我如何创建关键点(我留下了几个信息,比如layer_id的东西,但是你得到了主要的想法):

for (json_pt_info_vector::iterator b_beg = beg->points.begin(); b_beg != b_end; ++b_beg)
{
  int layer_id = b_beg->layer_id;
  json_point_info_coord &jpic = b_beg->coord;

  jpic.feature_id = features[layer_id].keypoints.size();
  KeyPoint kp;
  kp.octave = 3;
  kp.pt.x = jpic.x;
  kp.pt.y = jpic.y;
  features[layer_id].keypoints.push_back(kp);
}

以下是对SURF的调用:

SURF surf(300, 3, 4);
for (int i = 0; i < nb_img; ++i)
{
  debug_msg("extract_features #4.1");
  cv::detail::ImageFeatures &cdif = features[i];
  Mat gray_image = imread(param.layer_images[i], 0);  // 0 = force to gray scale!

  debug_msg("extract_features #4.2");
  vector<float> descriptors;
  debug_msg("extract_features #4.3");
  surf(gray_image, Mat(), cdif.keypoints, descriptors, true); // MUST BE TRUE TO FORCE THE PROVIDED KEYPOINTS

  debug_msg("extract_features #4.4");
  cdif.descriptors = Mat(descriptors, true).reshape(1, (int)cdif.keypoints.size());
  debug_msg("extract_features #4.5");
  gray_image.release();

  debug_msg("extract_features #4.6");
  images[i] = imread(param.layer_images[i]);  // keep the image open
}

在调试消息中#4.3之后崩溃了!

希望有所帮助!

编辑2:

我用cv :: SurfDescriptorExtracter替换了一些部分。我使用以下行替换4.3到4.5之间的所有内容:

 extractor.compute(gray_image, cdif.keypoints, cdif.descriptors);

所以现在,仍然存在一个错误,但它位于其他地方,与此问题没有必要相关!

1 个答案:

答案 0 :(得分:0)

我很惊讶对surf(gray_image, Mat(), cdif.keypoints, descriptors, true)的调用甚至编译。 descriptors参数应该是cv :: Mat,而不是矢量。