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

  

这个任务分为两步:

第一步:建立索引

  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. 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. mainLayout = QVBoxLayout()
  26. hboxLayout = QHBoxLayout()
  27. # hboxLayout.addStretch()/拉升上面空间
  28. hboxLayout.addWidget(self.gridGroupBox)
  29. mainLayout.addLayout(hboxLayout)
  30. mainLayout.addWidget(self.formGroupBox)
  31. self.setLayout(mainLayout)
  32.  
  33. @pyqtSlot(bool)
  34. def on_btn_open_clicked(self):
  35. self.status = 1
  36. self.filename = QFileDialog.getOpenFileName(self, "OpenFile", ".",
  37. "Image Files(*.jpg *.jpeg *.png)")[0]
  38. # filename = self.filename
  39. print(self.filename)
  40. print(type(self.filename))
  41. print('status:',self.status)
  42. self.createGridGroupBox()
  43. self.picture_R(self.filename)
  44. # self.initUi()
  45. # print(self.createGridGroupBox(filename))
  46.  
  47. return self.status,self.filename
  48.  
  49. def createGridGroupBox(self):
  50. self.gridGroupBox = QGroupBox("Demo")
  51. layout = QGridLayout()
  52. nameLabel = QLabel("picture_name")
  53. self.nameLineEdit = QLineEdit("")
  54. layout.addWidget(nameLabel, 1, 0)
  55. layout.addWidget(self.nameLineEdit, 1, 1)
  56.  
  57. imgeLabe1 = QLabel()
  58. imgeLabe2 = QLabel()
  59. # while(true):
  60. pixMap = None
  61.  
  62. layout.setSpacing(10)
  63. layout.addWidget(imgeLabe1, 0, 2, 4, 1)
  64. layout.update()
  65. self.gridGroupBox.setLayout(layout)
  66. self.setWindowTitle('Search picture')
  67.  
  68. def creatFormGroupBox(self):
  69. self.formGroupBox = QGroupBox("Form layout")
  70. layout = QFormLayout()
  71.  
  72. serchBtn = QPushButton('查找')
  73.  
  74. # manage_Btn.clicked.connect(manage_ui.manage)
  75. serchBtn.clicked.connect(self.name_link)
  76. # tphoBtn.clicked.connect(realtime_facenet_git.detectface)
  77.  
  78. imgeLabe2 = QLabel()
  79. pixMap = QPixmap("fileName1")
  80. imgeLabe2.setPixmap(pixMap)
  81. layout.addWidget(imgeLabe2)
  82. hbox = QHBoxLayout()
  83. hbox.addWidget(serchBtn)
  84.  
  85. vbox = QVBoxLayout()
  86. vbox.addLayout(hbox)
  87.  
  88. self.formGroupBox.setLayout(vbox)
  89. def getName(self):
  90. name = self.nameLineEdit.text() # 获取文本框内容
  91.  
  92. df = ('文件名: %s \n ' % (name))
  93. print(df)
  94. return name
  95. def name_link(self):
  96.  
  97. cursor = conn.execute("SELECT photoname,photoaddress from photoaddress")
  98. filename = self.getName()
  99. # filename = "202599.jpg"
  100. for row in cursor:
  101. # print(row[0])
  102. if row[0] == filename:
  103. print(row[1])
  104.  
  105. img = Image.open(row[1])
  106. plt.figure("Results")
  107. plt.imshow(img)
  108. plt.show()
  109. if __name__ == '__main__':
  110. app = QApplication(sys.argv)
  111. ex = MainWindow()
  112. ex.show()
  113. sys.exit(app.exec_())

对图片进行索引,存入数据库sqlite3中,实现快速搜索打开的更多相关文章

  1. 借助Mac自带的强大的搜索功能,如何快速搜索打开Tuxera Disk Manager

    现在很多小伙伴们在遇到Mac读写NTFS格式硬盘问题的时候,都会选择使用Tuxera NTFS这个磁盘读写工具.因为这款读写工具不仅可以帮助我们进行读写工作,还具有一个磁盘管理工具Disk Manag ...

  2. 数据库 - SQLite3 中的数据类型

    ------------------------------ 安装 Sqlite3 和 数据库查看工具: sudo apt-get install sqlite3 sudo apt-get insta ...

  3. Springboot(九).多文件上传下载文件(并将url存入数据库表中)

    一.   文件上传 这里我们使用request.getSession().getServletContext().getRealPath("/static")的方式来设置文件的存储 ...

  4. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  5. 为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?

    B树: B+树 1) B+-tree的磁盘读写代价更低 B+-tree的内部结点并没有指向关键字具体信息的指针.因此其内部结点相对B 树更小.如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所 ...

  6. B+树比B树更适合实际应用中操作系统的文件索引和数据库索引

    B+树比B树更适合实际应用中操作系统的文件索引和数据库索引 为什么选择B+树作为数据库索引结构?   背景 首先,来谈谈B树.为什么要使用B树?我们需要明白以下两个事实: [事实1]不同容量的存储器, ...

  7. 解决:HTML中多文本域(textarea)回车后数据存入数据库,EL表达式取出异常。

    问题描述: 当多文本域(textarea)回车后数据存入数据库. EL表达式取出异常,值换行倒置页面报错. 问题解决: 存值脚本代码,提交前转换\n为<br/>. <script t ...

  8. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  9. 关于数据库表中的索引及索引列的CRUD

     -- 查询一个数据库表中的索引及索引列use [RuPengWangDB]GOSELECT  indexname = a.name , tablename = c. name , indexcolu ...

随机推荐

  1. 详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes

    写在前面 Ingress 英文翻译 进入;进入权;进食,更准确的讲就是入口,即外部流量进入k8s集群必经之口.这到大门到底有什么作用?我们如何使用Ingress?k8s又是如何进行服务发现的呢?先看一 ...

  2. JavaScript四(DOM编程)

    一.绪论 DOM是文档对象模型(Document Object Module)的简称,借助DOM模型,可以将结构化文档,转换成DOM树,程序可以访问,修改,增加,删除树的节点.程序通过操作DOM树时, ...

  3. Ubuntu本地uwsgi配Django问题的解决

    版本Ubuntu14.04,Django1.6.5 ubuntu本地Uwsgi调Django可能会报错: -- unavailable modifier requested: 0 -- 解决方法:先安 ...

  4. Qt5.7 实现Https 认证全过程解析(亲自动手版)

    #### NetworkRequestManager.h #include <QSsl>#include <QSslKey>#include <QSslSocket> ...

  5. ArcCore重构-生成%_offset.h文件

    基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5 基本问题   ArcCore中,需要生成asm_offset.h和arch_offset.h这两个头文件,定义着代 ...

  6. Java单例模式(Singleton)以及实现

    一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...

  7. spring cloud 入门系列七:基于Git存储的分布式配置中心

    我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为 ...

  8. mysql性能调优与架构设计笔记

    1.mysql基本介绍 mysql支持多线程高并发的关系型数据库; 数据库存储引擎InnoDB.MyISAM; mysql快速崛起的原因就是他是开源的; 性能一直是mysql自豪的一大特点; 2.my ...

  9. Node.js中的异步I/O是如何进行的?

    Node.js的异步I/O通过事件循环的方式实现.其中异步I/O又分磁盘I/O和网络I/O.在磁盘I/O的调用中,当发起异步调用后,会将异步操作送进libuv提供的队列中,然后返回.当磁盘I/O执行完 ...

  10. c/c++(hiredis)异步调用redis【转】

    hiredis是redis官方推荐的C/C++客户端代码库.使用hiredis库很简易方便的进行redis的相关开发. 同步方式 不过大多数情况下,我们采用的都是同步的调用方式.   1 2 3 4 ...