[英]Encoding CV_32FC1 Mat data with base64
您好,我嘗試從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
之前不檢查inBuffer
的NULL
值。 如果傳入的圖像未生成任何描述符,則desc.data
以及擴展名inBuffer
都將為NULL
。
還有幾件事:
您不需要使用reinterpret_cast
,這很可能是不安全的。 請參閱此問題 ,以獲取對轉換類型的良好解釋。 如果您想要一個指向描述符數據的const指針,則可以像這樣簡單地分配一個:
const uchar* inBuffer = desc.data;
SURF使用float
描述符,而ORB使用二進制描述符。 如果您打算使用SURF,則可能需要更改代碼。 inBuffer
的分配可以更改為
const float* inBuffer = reinterpret_cast<const float*>(desc.data);
在這種情況下,使用reinterpret_cast
可能是合適的。 但是,除非確實需要,否則建議避免直接操作指針。 考慮使用cv::Mat_<float>
進行元素訪問。
編輯:鑒於更新的問題,第二點不太重要。 出現了另一個問題:通過convertTo()
從float
轉換為uchar
將丟失信息。 在這種情況下,轉換將使描述符數據的原始精度無法恢復。 假設您的base64編碼有效,則可能像以前一樣簡單地處理描述符數據,但這超出了此問題的范圍。
cv::initModule_nonfree(); //Patent protection related.
不要忘記包括該庫(例如,opencv_nonfree243.lib)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.