使用sqlite保存人脸特征

需求

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

创建table

std::string strCmd = "create table  strTableName (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 = 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 ++接口简介

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个将爬取到的电影信息保存到本地SQLite数据库的示例代码: ```python import requests from bs4 import BeautifulSoup import sqlite3 url = 'https://movie.douban.com/top250' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299' } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') movies = soup.select('.item') # 连接到本地SQLite数据库 conn = sqlite3.connect('movies.db') # 创建表 conn.execute('''CREATE TABLE IF NOT EXISTS movie_top250 ( id INTEGER PRIMARY KEY, title TEXT, rating REAL, year INTEGER, director TEXT )''') # 插入数据 for movie in movies: title = movie.select('.title')[0].text.strip() rating = movie.select('.rating_num')[0].text.strip() year = movie.select('.inq')[0].text.strip()[1:-1] if movie.select('.inq') else 'N/A' info = movie.select('.bd p')[0].text.strip().split('\n') director = info[0][4:] conn.execute("INSERT INTO movie_top250 (title, rating, year, director) VALUES (?, ?, ?, ?)", (title, rating, year, director)) # 提交更改并关闭连接 conn.commit() conn.close() ``` 这段代码会将爬取到的电影信息保存到本地SQLite数据库中,如果数据库不存在,则会创建一个新的数据库。在这个示例中,我们创建了一个名为`movie_top250`的表,包含电影名称、评分、上映年份和导演等信息。你可以根据自己的需求修改表的结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值