使用base64编码CV_32FC1 Mat数据

Encoding CV_32FC1 Mat data with base64

本文关键字:32FC1 Mat 数据 CV base64 编码 使用      更新时间:2023-10-16

你好,我正在尝试从SURF描述符中提取数据,当我尝试使用ORB描述符时,它可以工作。当我使用SURF时,程序在base64编码线上出现分段故障11而退出,我使用该站点的base64函数:编码和解码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

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

还有几件事:

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

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

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

    在这种情况下,CCD_ 11的使用可能是适当的。但是,除非迫不得已,否则最好避免直接操作指针。考虑使用cv::Mat_<float>进行元素访问。

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

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

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