使用base64编码CV_32FC1 Mat数据

时间:2013-03-07 15:13:01

标签: c++ opencv base64 surf feature-descriptor

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

确切的问题是ORB描述符的格式是CV_8UC1和SURF描述符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

2 个答案:

答案 0 :(得分:1)

问题的一个原因可能是您在使用inBuffer之前未检查NULL值。desc.data如果您传入的图片未生成描述符,inBuffer和扩展名NULL将为reinterpret_cast

还有一些事情:

  1. 您使用const uchar* inBuffer = desc.data; 是不必要的,而且可能不安全。有关演员类型的详细说明,请参阅this question。如果你想要一个指向描述符数据的const指针,你可以简单地指定一个如下:

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

    reinterpret_cast

    在这种情况下,使用cv::Mat_<float>可能是合适的。但是,除非你真的需要,否则建议避免执行直接指针操作。考虑使用float进行元素访问。

  3. 编辑:根据更新的问题,第2点不太相关。还会出现一个问题:通过ucharconvertTo()转换为{{1}}会丢失信息。在这种情况下,转换将使描述符数据的原始精度不可恢复。假设您的base64编码有效,可以像以前一样简单地处理描述符数据,但这超出了这个问题的范围。

答案 1 :(得分:0)

cv::initModule_nonfree(); //Patent protection related.

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