2

您好,我正在尝试从 SURF 描述符中提取数据,当我使用 ORB 描述符尝试此操作时,它可以工作。当我使用 SURF 时,程序退出,并在 base64 编码行出现分段错误 11,我使用该站点的 base64 函数:Encoding and decoder base64

确切的问题是 ORB 描述符的格式是CV_8UC1SURF 描述符CV_32FC1。所以我必须 base64 编码一个 32 位浮点数而不是 8 位无符号字符。

我怎样才能做到这一点?

Mat desc;
vector<KeyPoint> kp;

SurfFeatureDetector detector(500);
SurfDescriptorExtractor extractor;
// OrbDescriptorExtractor extractor; This works

detector.detect(image, kp);
extractor.compute(image, kp, desc);

desc.convertTo(desc, CV_8UC1, 255, 0);

unsigned char const* inBuffer = reinterpret_cast<unsigned char const*>(desc.data);
unsigned int in_len = desc.total();
string code = base64_encode(inBuffer, in_len).c_str(); // This line causes the error
4

2 回答 2

1

您的问题的一个来源可能是您在使用它之前没有检查inBuffer值。NULL如果没有从您传入的图像中生成描述符,则desc.data,并且通过扩展inBuffer,将是NULL.

还有几件事:

  1. 您的使用reinterpret_cast是不必要的,而且很可能是不安全的。有关强制转换类型的良好解释,请参阅此问题。如果你想要一个指向描述符数据的 const 指针,你可以像这样简单地分配一个:

    const uchar* inBuffer = desc.data;
    
  2. SURF 使用float描述符,而 ORB 使用二进制描述符。如果您打算使用 SURF,您可能需要更改您的代码。的分配inBuffer可以更改为

    const float* inBuffer = reinterpret_cast<const float*>(desc.data);
    

    在这种情况下使用reinterpret_cast可能是合适的。但是,除非您确实必须这样做,否则建议避免进行直接指针操作。考虑使用cv::Mat_<float>元素访问。

编辑:鉴于更新的问题,第 2 点不太相关。出现了一个额外的问题:将 from 转换floatucharviaconvertTo()将丢失信息。在这种情况下,转换将使描述符数据的原始精度无法恢复。假设您的 base64 编码有效,则可以像以前一样简单地处理描述符数据,但这超出了这个问题的范围。

于 2013-03-07T17:04:32.623 回答
0
cv::initModule_nonfree(); //Patent protection related.

不要忘记包含库(例如 opencv_nonfree243.lib)。

于 2013-03-07T15:38:58.690 回答