对图片进行索引,存入数据库sqlite3中,实现快速搜索打开
对图片进行索引,存入数据库中,实现快速搜索打开

这个任务分为两步:

第一步:建立索引
import os
import shutil
import sqlite3
# 扫描函数,需扫描路径目录处理该目录及下级目录所有图片地址,简单明了 def scanDirSearchFile(dir, dbname):
connsqlite3 = sqlite3.connect(dbname)
cu = connsqlite3.cursor()
for root, dirs, files in os.walk(dir, True, None, False): # 遍列目录
# 处理该文件夹下所有文件: for f in files:
if os.path.isfile(os.path.join(root, f)):
ext = os.path.splitext(f)[1].lower()
if ext in ('.jpg', '.png', '.bmp'):
# print os.path.join(root,f)
cu.execute("insert into photoaddress(photoaddress,photoname) values(?,?);",
((os.path.join(root, f)), (f)))
pass
connsqlite3.commit()
# 初始化数据库表
def CreatePhotoDB(sqliteName):
# 数据库文件处理
connsqlite3 = sqlite3.connect(sqliteName)
cu = connsqlite3.cursor()
# 创建表
sql = "create table IF NOT EXISTS photoaddress(photoaddress varchar(400),photoname varchar(200));"
cu.execute(sql)
# 创建图片地址索引
sql = "create index IF NOT EXISTS photoaddress_photoaddress on photoaddress(photoaddress);"
cu.execute(sql)
# 创建图片名索引
sql = "create index IF NOT EXISTS photoaddress_photoname on photoaddress(photoname);"
cu.execute(sql)
# 清空库表
sql = "delete from photoaddress;"
cu.execute(sql)
connsqlite3.commit()
if __name__ == "__main__":
path = 'E:\\Users\A\Pictures\Pictures\lfw'
work_dir = os.path.abspath(path) # 图片放置目录 sqliteName = os.path.join(work_dir, "photo.db") # sqlite数据库文件 # 初始化数据库表
CreatePhotoDB(sqliteName) # 扫描目录,刷新数据库 scanDirSearchFile(work_dir, sqliteName)
第二部:界面+索引比对:
import sys
import pandas as pd
from PIL import Image
import matplotlib.pyplot as plt
import sqlite3
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import*
from PyQt5 import QtCore
dbpath = 'E:\\Users\A\Pictures\Pictures\lfw\\photo.db'
conn = sqlite3.connect(dbpath)
class MainWindow(QWidget):
def __init__(self,parent=None):
super(MainWindow,self).__init__(parent)
self.status = 0
self.initUi(MainWindow)
self.layout = QGridLayout(self)
self.setLayout(self.layout) def initUi(self,MainWindow):
self.createGridGroupBox()
self.creatFormGroupBox() mainLayout = QVBoxLayout()
hboxLayout = QHBoxLayout()
# hboxLayout.addStretch()/拉升上面空间
hboxLayout.addWidget(self.gridGroupBox)
mainLayout.addLayout(hboxLayout)
mainLayout.addWidget(self.formGroupBox)
self.setLayout(mainLayout) @pyqtSlot(bool)
def on_btn_open_clicked(self):
self.status = 1
self.filename = QFileDialog.getOpenFileName(self, "OpenFile", ".",
"Image Files(*.jpg *.jpeg *.png)")[0]
# filename = self.filename
print(self.filename)
print(type(self.filename))
print('status:',self.status)
self.createGridGroupBox()
self.picture_R(self.filename)
# self.initUi()
# print(self.createGridGroupBox(filename)) return self.status,self.filename def createGridGroupBox(self):
self.gridGroupBox = QGroupBox("Demo")
layout = QGridLayout()
nameLabel = QLabel("picture_name")
self.nameLineEdit = QLineEdit("")
layout.addWidget(nameLabel, 1, 0)
layout.addWidget(self.nameLineEdit, 1, 1) imgeLabe1 = QLabel()
imgeLabe2 = QLabel()
# while(true):
pixMap = None layout.setSpacing(10)
layout.addWidget(imgeLabe1, 0, 2, 4, 1)
layout.update()
self.gridGroupBox.setLayout(layout)
self.setWindowTitle('Search picture') def creatFormGroupBox(self):
self.formGroupBox = QGroupBox("Form layout")
layout = QFormLayout() serchBtn = QPushButton('查找') # manage_Btn.clicked.connect(manage_ui.manage)
serchBtn.clicked.connect(self.name_link)
# tphoBtn.clicked.connect(realtime_facenet_git.detectface) imgeLabe2 = QLabel()
pixMap = QPixmap("fileName1")
imgeLabe2.setPixmap(pixMap)
layout.addWidget(imgeLabe2)
hbox = QHBoxLayout()
hbox.addWidget(serchBtn) vbox = QVBoxLayout()
vbox.addLayout(hbox) self.formGroupBox.setLayout(vbox)
def getName(self):
name = self.nameLineEdit.text() # 获取文本框内容 df = ('文件名: %s \n ' % (name))
print(df)
return name
def name_link(self): cursor = conn.execute("SELECT photoname,photoaddress from photoaddress")
filename = self.getName()
# filename = "202599.jpg"
for row in cursor:
# print(row[0])
if row[0] == filename:
print(row[1]) img = Image.open(row[1])
plt.figure("Results")
plt.imshow(img)
plt.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())

对图片进行索引,存入数据库sqlite3中,实现快速搜索打开的更多相关文章
- 借助Mac自带的强大的搜索功能,如何快速搜索打开Tuxera Disk Manager
现在很多小伙伴们在遇到Mac读写NTFS格式硬盘问题的时候,都会选择使用Tuxera NTFS这个磁盘读写工具.因为这款读写工具不仅可以帮助我们进行读写工作,还具有一个磁盘管理工具Disk Manag ...
- 数据库 - SQLite3 中的数据类型
------------------------------ 安装 Sqlite3 和 数据库查看工具: sudo apt-get install sqlite3 sudo apt-get insta ...
- Springboot(九).多文件上传下载文件(并将url存入数据库表中)
一. 文件上传 这里我们使用request.getSession().getServletContext().getRealPath("/static")的方式来设置文件的存储 ...
- 转:SQL SERVER数据库中实现快速的数据提取和数据分页
探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...
- 为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?
B树: B+树 1) B+-tree的磁盘读写代价更低 B+-tree的内部结点并没有指向关键字具体信息的指针.因此其内部结点相对B 树更小.如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所 ...
- B+树比B树更适合实际应用中操作系统的文件索引和数据库索引
B+树比B树更适合实际应用中操作系统的文件索引和数据库索引 为什么选择B+树作为数据库索引结构? 背景 首先,来谈谈B树.为什么要使用B树?我们需要明白以下两个事实: [事实1]不同容量的存储器, ...
- 解决:HTML中多文本域(textarea)回车后数据存入数据库,EL表达式取出异常。
问题描述: 当多文本域(textarea)回车后数据存入数据库. EL表达式取出异常,值换行倒置页面报错. 问题解决: 存值脚本代码,提交前转换\n为<br/>. <script t ...
- iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】
在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...
- 关于数据库表中的索引及索引列的CRUD
-- 查询一个数据库表中的索引及索引列use [RuPengWangDB]GOSELECT indexname = a.name , tablename = c. name , indexcolu ...
随机推荐
- Flask框架之 --- 我的第一个个人网站(雏形)
现在还是个静态网站 , 而且这里的Flask也只是起到了提供虚拟web服务器的作用 , 下一步是实现数据库的连接 , 实现简单的动态访问.
- 关于Resin SSL支持的两个问题
1.Resin的OpenSLL支持功能只有收费Pro版才支持,这一点,只有你做好配置,测试的时候才会在提示中发现,文档里没有说明. 2.它的官方文档这部分有问题,第一个问题就是上面第一条没有说,第二个 ...
- pc端页面打包成安卓apk
一.phoneGap PhoneGap是一个采用HTML,CSS和JavaScript的技术,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够在网页中调用IOS,Android,Palm,Sy ...
- 导入项目 idea
下的java核心编程的源码,只有java文件,没有idea或者eclipse的项目结构信息. 分别用eclipse和idea打开了一遍,方便学习调试. 项目文件夹:E:\学习资料\Java\语法\ja ...
- 0基础一分钟入门Python
这篇文章面向所有想学python的小伙伴(甚至你从没听过编程),这篇文章将会带你以最快的速度入门python.赶快上车,时间来不及了... 一,下载和安装python 1.下载: 1.1 python ...
- ASP.NET Core Api网关Ocelot的中文文档
架构图 入门 不支持 配置 路由 请求聚合 GraphQL 服务发现 微服务ServiceFabric 认证 授权 Websockets 管理 流量控制 缓存 QoS服务质量 转换Headers 转换 ...
- NewLife.Net——构建可靠的网络服务
网络程序应该注册成为系统服务,以保证其自启动以及稳定可靠运行! 这一场,讲讲怎么建立一个生产级别的网络服务. 老规矩,先上源码:https://github.com/nnhy/NewLife.Net. ...
- Android 源码中的设计模式
最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...
- vs2015 key
vs2015 企业版 专业版 密钥 亲测可用 专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- DX11 Without DirectX SDK--使用Windows SDK来进行开发
在看龙书(Introduction to 3D Game Programming with Directx 11)的时候,里面所使用的开发工具包为Microsoft DirectX SDK(June ...