簡體   English   中英

使用base64編碼CV_32FC1 Mat數據

[英]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之前不檢查inBufferNULL值。 如果傳入的圖像未生成任何描述符,則desc.data以及擴展名inBuffer都將為NULL

還有幾件事:

  1. 您不需要使用reinterpret_cast ,這很可能是不安全的。 請參閱此問題 ,以獲取對轉換類型的良好解釋。 如果您想要一個指向描述符數據的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_<float>進行元素訪問。

編輯:鑒於更新的問題,第二點不太重要。 出現了另一個問題:通過convertTo()float轉換為uchar將丟失信息。 在這種情況下,轉換將使描述符數據的原始精度無法恢復。 假設您的base64編碼有效,則可能像以前一樣簡單地處理描述符數據,但這超出了此問題的范圍。

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

不要忘記包括該庫(例如,opencv_nonfree243.lib)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM