对图片进行索引,存入数据库中,实现快速搜索打开
这个任务分为两步:
第一步:建立索引
1 import os 2 import shutil 3 import sqlite3 4 # 扫描函数,需扫描路径目录处理该目录及下级目录所有图片地址,简单明了 5 6 def scanDirSearchFile(dir, dbname): 7 connsqlite3 = sqlite3.connect(dbname) 8 cu = connsqlite3.cursor() 9 for root, dirs, files in os.walk(dir, True, None, False): # 遍列目录 10 # 处理该文件夹下所有文件: 11 12 for f in files: 13 if os.path.isfile(os.path.join(root, f)): 14 ext = os.path.splitext(f)[1].lower() 15 if ext in ('.jpg', '.png', '.bmp'): 16 # print os.path.join(root,f) 17 cu.execute("insert into photoaddress(photoaddress,photoname) values(?,?);", 18 ((os.path.join(root, f)), (f))) 19 pass 20 connsqlite3.commit() 21 # 初始化数据库表 22 def CreatePhotoDB(sqliteName): 23 # 数据库文件处理 24 connsqlite3 = sqlite3.connect(sqliteName) 25 cu = connsqlite3.cursor() 26 # 创建表 27 sql = "create table IF NOT EXISTS photoaddress(photoaddress varchar(400),photoname varchar(200));" 28 cu.execute(sql) 29 # 创建图片地址索引 30 sql = "create index IF NOT EXISTS photoaddress_photoaddress on photoaddress(photoaddress);" 31 cu.execute(sql) 32 # 创建图片名索引 33 sql = "create index IF NOT EXISTS photoaddress_photoname on photoaddress(photoname);" 34 cu.execute(sql) 35 # 清空库表 36 sql = "delete from photoaddress;" 37 cu.execute(sql) 38 connsqlite3.commit() 39 if __name__ == "__main__": 40 path = 'E:\\Users\A\Pictures\Pictures\lfw' 41 work_dir = os.path.abspath(path) # 图片放置目录 42 43 sqliteName = os.path.join(work_dir, "photo.db") # sqlite数据库文件 44 45 # 初始化数据库表 46 CreatePhotoDB(sqliteName) 47 48 # 扫描目录,刷新数据库 49 50 51 scanDirSearchFile(work_dir, sqliteName)
第二部:界面+索引比对:
1 import sys 2 import pandas as pd 3 from PIL import Image 4 import matplotlib.pyplot as plt 5 import sqlite3 6 from PyQt5 import QtWidgets, QtCore 7 from PyQt5.QtGui import * 8 from PyQt5.QtWidgets import * 9 from PyQt5.QtCore import* 10 from PyQt5 import QtCore 11 dbpath = 'E:\\Users\A\Pictures\Pictures\lfw\\photo.db' 12 conn = sqlite3.connect(dbpath) 13 class MainWindow(QWidget): 14 def __init__(self,parent=None): 15 super(MainWindow,self).__init__(parent) 16 self.status = 0 17 self.initUi(MainWindow) 18 self.layout = QGridLayout(self) 19 self.setLayout(self.layout) 20 21 def initUi(self,MainWindow): 22 self.createGridGroupBox() 23 self.creatFormGroupBox() 24 25 26 mainLayout = QVBoxLayout() 27 hboxLayout = QHBoxLayout() 28 # hboxLayout.addStretch()/拉升上面空间 29 hboxLayout.addWidget(self.gridGroupBox) 30 mainLayout.addLayout(hboxLayout) 31 mainLayout.addWidget(self.formGroupBox) 32 self.setLayout(mainLayout) 33 34 @pyqtSlot(bool) 35 def on_btn_open_clicked(self): 36 self.status = 1 37 self.filename = QFileDialog.getOpenFileName(self, "OpenFile", ".", 38 "Image Files(*.jpg *.jpeg *.png)")[0] 39 # filename = self.filename 40 print(self.filename) 41 print(type(self.filename)) 42 print('status:',self.status) 43 self.createGridGroupBox() 44 self.picture_R(self.filename) 45 # self.initUi() 46 # print(self.createGridGroupBox(filename)) 47 48 return self.status,self.filename 49 50 51 def createGridGroupBox(self): 52 self.gridGroupBox = QGroupBox("Demo") 53 layout = QGridLayout() 54 nameLabel = QLabel("picture_name") 55 self.nameLineEdit = QLineEdit("") 56 layout.addWidget(nameLabel, 1, 0) 57 layout.addWidget(self.nameLineEdit, 1, 1) 58 59 imgeLabe1 = QLabel() 60 imgeLabe2 = QLabel() 61 # while(true): 62 pixMap = None 63 64 65 layout.setSpacing(10) 66 layout.addWidget(imgeLabe1, 0, 2, 4, 1) 67 layout.update() 68 self.gridGroupBox.setLayout(layout) 69 self.setWindowTitle('Search picture') 70 71 72 def creatFormGroupBox(self): 73 self.formGroupBox = QGroupBox("Form layout") 74 layout = QFormLayout() 75 76 serchBtn = QPushButton('查找') 77 78 # manage_Btn.clicked.connect(manage_ui.manage) 79 serchBtn.clicked.connect(self.name_link) 80 # tphoBtn.clicked.connect(realtime_facenet_git.detectface) 81 82 83 imgeLabe2 = QLabel() 84 pixMap = QPixmap("fileName1") 85 imgeLabe2.setPixmap(pixMap) 86 layout.addWidget(imgeLabe2) 87 hbox = QHBoxLayout() 88 hbox.addWidget(serchBtn) 89 90 vbox = QVBoxLayout() 91 vbox.addLayout(hbox) 92 93 self.formGroupBox.setLayout(vbox) 94 def getName(self): 95 name = self.nameLineEdit.text() # 获取文本框内容 96 97 df = ('文件名: %s \n ' % (name)) 98 print(df) 99 return name 100 def name_link(self): 101 102 cursor = conn.execute("SELECT photoname,photoaddress from photoaddress") 103 filename = self.getName() 104 # filename = "202599.jpg" 105 for row in cursor: 106 # print(row[0]) 107 if row[0] == filename: 108 print(row[1]) 109 110 img = Image.open(row[1]) 111 plt.figure("Results") 112 plt.imshow(img) 113 plt.show() 114 if __name__ == '__main__': 115 app = QApplication(sys.argv) 116 ex = MainWindow() 117 ex.show() 118 sys.exit(app.exec_())