【问题标题】:Encoding CV_32FC1 Mat data with base64使用 base64 编码 CV_32FC1 Mat 数据
【发布时间】:2013-03-07 15:13:01
【问题描述】:

您好,我正在尝试从 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

【问题讨论】:

  • 请更具体一点。哪一行导致了段错误?
  • 对不起,你是对的,我更新了问题,提供了更多信息。
  • 只能在描述符数据为NULL时重现段错误。另外,请参阅我编辑的答案。您编辑的问题要好得多,并且更准确地描述了您的实际问题。另请注意,如果您的问题不归结为“请为我调试我的代码”请求,您将更有可能得到好的答案。
  • 是的,我同意我的问题这样更好,但我认为问题出在其他地方。而且我没有必要找人来调试我的代码,我试图找到问题所在以及如何解决它的指针;我真的很想了解自己,但是关于这些主题的文档非常有限。
  • 啊,可以理解。我无意冒犯。

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


【解决方案1】:

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

还有一些事情:

  1. 您对reinterpret_cast 的使用是不必要的,而且很可能是不安全的。请参阅this question 以获得对强制转换类型的良好解释。如果你想要一个指向描述符数据的 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_&lt;float&gt; 进行元素访问。

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

【讨论】:

  • 我可能需要添加更多信息,我使用 base64 编码函数发送 Mat 数据:string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len),但是否可以将浮点数转换为字节而不丢失信息?
【解决方案2】:
cv::initModule_nonfree(); //Patent protection related.

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

【讨论】:

  • 我必须添加 #include &lt;opencv2/nonfree/nonfree.hpp&gt; 并添加了您的代码,但我仍然遇到分段错误。
猜你喜欢
  • 2015-03-16
  • 2011-01-31
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多