sqlite|使用sqlite保存人脸特征

需求 【sqlite|使用sqlite保存人脸特征】在做人脸识别的时候,需要在嵌入式端保存底库人脸的特征,我自然想到了sqlite。
每个人至少要保存两个字段,一个id, 一个特征。其中id我计划用char类型,人脸特征用blob类型,也就是二进制类型。这样我就可以直接把c++里的数据直接存储到sqlite的文件里。
创建table

std::string strCmd = "create tablestrTableName (idstr char PRIMARY KEY,feature BLOB NOT NULL)"; sqlite3_exec(DataBase, strCmd.c_str(), 0, 0, &error);

查询 查询的方法可以从参考资料里的《SQLite学习笔记(八)-- BLOB数据的插入与查询(C++实现)》和《SQLite C / C ++接口简介》里看到具体的例子。
这里只贴一段读取特征的代码
const void *pReadBolbData = https://www.it610.com/article/sqlite3_column_blob(stmt, 1); if (pReadBolbData == NULL) { printf("error info:[%s]\n", sqlite3_errmsg(m_DataBase)); retcode = -1; break; }auto len = sqlite3_column_bytes(stmt, 2); memcpy(featureptr, pReadBolbData, len);

我这里想说,使用sqlite3_prepare()+ sqlite3_step()是非常优雅的一种方式,比那种回调的方式要好的多。
比如下方我想要查询一个table是否存在,实现会很简单:
bool IsTableExist(const std::string &strTableName) { int table_num = 0; sqlite3_stmt *stmt; std::string strFindTable = "SELECT COUNT(*) FROM sqlite_master where type ='table' and name ='" + strTableName + "'"; sqlite3_prepare_v2(m_DataBase, strFindTable.c_str(), strFindTable.size(), &stmt, 0); int result = sqlite3_step(stmt); if (result == SQLITE_ROW) { table_num = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); return table_num > 0; };

参考资料 SQLite学习笔记(八)-- BLOB数据的插入与查询(C++实现)
sqlite3中BLOB数据类型存储大对象运用示例
SQLite C / C ++接口简介

    推荐阅读