将cv :: imencode的输出存储到sqlite3中

时间:2018-08-29 19:11:18

标签: c++ opencv sqlite blob imread

我正在尝试将图像(.png)存储到sqlite3数据库中。一个简单的灰度图像将由opencv创建,并将通过使用cv::imencode(cv::Mat img, params)命令(功能的输出为std::vector<uchar>)存储到缓冲区中。

接下来,我想将其推送到数据库中。因此,我正在准备一个sqlite3表,语句等……这很好。
要添加blob内容,我需要执行以下步骤(最小示例):

bool MyClass::bindTableContent(int index, std::vector<uchar> data){

 char * blob_imdecode = reinterpret_cast<char*>(data.data());

 this->rc = sqlite3_bind_blob(this->statement, index, blob_imdecode, sizeof(blob_imdecode[0]) * data.size(), SQLITE_STATIC);
 if (this->rc != SQLITE_OK) {
  return false;
 }

 if(sqlite3_step(this->statement) == SQLITE_DONE){
  return true;
 }
 else{
  return false;
 }
}

完成此操作后,blob数据即存储在数据库中,但是数据类型错误(我猜是出问题了,长度可能是错误的,...)。 如果我对此向量进行imdecode并使用imwrite保存,则图像将正确保存。

尽管如此,如果我用fstream读取图像并执行与上述相同的操作,则数据将正确存储(作为.png)到数据库中(最小示例):

bool MyClass::bindTableContent(int index, std::string image_path){

 char * blob;
 std::ifstream::pos_type size;
 std::ifstream file(image_path, std::ios::in | std::ios::binary | std::ios::ate);
 if (file.is_open()) {
  size = file.tellg();
  blob = new char[size];
  file.seekg(0, std::ios::beg);
  file.read(blob, size);
  file.close();
 }

 else{
  blob = NULL;
 }

 this->rc = sqlite3_bind_blob(this->statement, index, blob, size, SQLITE_STATIC);

 delete [] blob;
 if (this->rc != SQLITE_OK) {
  return false;
 }

 if(sqlite3_step(this->statement) == SQLITE_DONE){
  return true;
 }
 else{
  return false;
 }
}

有人有什么想法吗?
我将非常感谢您的帮助:)

*解决方案* 如果有人遇到相同的问题,请使用以下解决方案:

制作输入矢量数据的硬拷贝/替换:

char * blob_imdecode = reinterpret_cast<char*>(data.data());

char * blob;
blob = new char[data.size()];
for(int i = 0; i < data.size(); i++){
 blob[i] = data[i];
} 

0 个答案:

没有答案