你好,我正在尝试从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
。
还有几件事:
-
你使用
reinterpret_cast
是不必要的,而且很可能是不安全的。有关强制转换类型的详细解释,请参阅此问题。如果你想要一个指向描述符数据的常量指针,你可以简单地分配一个这样的指针:const uchar* inBuffer = desc.data;
-
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(。