Сохраните вывод cv :: imencode в sqlite3 - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь сохранить изображение (.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];
} 
...