c-使用base64编码CV_32FC1 Mat数据
作者:互联网
您好,我尝试从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
解决方法:
问题的来源之一可能是您在使用inBuffer之前不检查inBuffer的NULL值.如果传入的图像未生成任何描述符,则desc.data(以inBuffer为扩展名)将为NULL.
还有几件事:
>您不需要使用reinterpret_cast,这很可能是不安全的.有关转换类型的详细说明,请参见this question.如果您想要一个指向描述符数据的const指针,则可以像这样简单地分配一个:
const uchar* inBuffer = desc.data;
> SURF使用浮点描述符,而ORB使用二进制描述符.如果您打算使用SURF,则可能需要更改代码. inBuffer的分配可以更改为
const float* inBuffer = reinterpret_cast<const float*>(desc.data);
在这种情况下,使用reinterpret_cast可能是合适的.但是,除非确实需要,否则建议避免直接操作指针.考虑使用cv :: Mat_< float>用于元素访问.
编辑:鉴于更新的问题,第二点不太重要.出现了另一个问题:通过convertTo()从float转换为uchar将丢失信息.在这种情况下,转换将使描述符数据的原始精度无法恢复.假设您的base64编码有效,则可能像以前一样简单地处理描述符数据,但这超出了此问题的范围.
标签:surf,c,base64,opencv,feature-descriptor 来源: https://codeday.me/bug/20191011/1894463.html