喜歡看動漫的朋友們大概都能體會到一個難受的事情,就是在論壇或者羣聊裏面看到一張動漫截圖,很想知道它的出處,但百度搜了一圈卻也沒有一個可靠結果,就很鬱悶。今天就來帶你們用Python作一個簡單的「以圖搜番」小應用。應用自己的實現不是很難的事情,其實就是調用別人的API接口來實現,主要目的仍是經過這個案例來學習如下內容:php
若是用 Python 語言開發 「跨平臺」 的圖形界面的程序,主要有3種選擇:python
「Tkinter」:基於Tk的Python庫,這是Python官方採用的標準庫,優勢是做爲Python標準庫、穩定、發佈程序較小,缺點是控件相對較少。git
「wxPython」:基於wxWidgets的Python庫,優勢是控件比較豐富,缺點是穩定性相對差點、文檔少、用戶少。程序員
「PyQt5」(或者PySide2):基於Qt 的Python庫,優勢是控件比較豐富、跨平臺體驗好、文檔完善、用戶多。缺點是庫比較大,發佈出來的程序比較大。github
本教程使用的就是PyQt5,它是Digia的一套Qt5應用框架與python的結合,同時支持2.x和3.x。本教程使用的是3.x。Qt庫由Riverbank Computing開發,是最強大的GUI庫之一 ,官方網站:https://www.riverbankcomputing.com/software/pyqt/。 PyQt5是由一系列Python模塊組成。超過620個類,6000函數和方法。能在諸如Unix、Windows和Mac OS等主流操做系統上運行。PyQt5有兩種證書,GPL和商業證書。 安裝方法:pip install PyQt5
web
在設計一個圖形化界面的應用時,咱們須要先繪製出其大體佈局,能夠在草稿紙上勾勒一下,而後經過PyQt5中的Qt Designer應用來設計,它的文件名叫designer.exe
,找不到位置能夠在本地文件中搜索一下:面試
下圖爲本應用的一個界面初步設計,經過標註的四個區域相互配合,便可完成一個UI設計,該工程會保存爲一個
.ui
後綴名的UI文件,最好放在Python代碼文件一塊兒。本次界面設計並不複雜,兩個按鈕,一個打開圖片,另外一個點擊後開始查詢;一個QComboBox部件,用於選擇備選結果;一個圖片顯示區域,顯示打開的查詢圖片,一個結果顯示區域,顯示查詢結果具體內容。界面下面是視頻顯示區域,即該圖片出如今原動畫中的視頻片斷。 算法
具體的Qt Designer基本使用方法我就不在這裏展開了,若是你第一次用,能夠參考這個入門視頻教程:https://www.bilibili.com/video/BV1cJ411R7bP ,講得還挺好,我就是跟着這個視頻入門學習的。它的文字版教程在這裏:http://www.python3.vip/tut/py/gui/qt_01/數據庫
我是使用的VSCode編輯器,推薦一個插件——PYQT Integration,能夠隨時預覽UI界面和編輯UI界面,也很方便把UI文件轉換成Python代碼。
json
在UI界面中加一個視頻顯示部分我花了很多時間去研究,主要「由於Qt Designer中沒有視頻播放器的小部件」,因而我就有點懵了,雖然能夠直接編輯Python代碼來弄,但爲了統一流程,仍是但願能在Qt Designer中佈置好。通過一番研究,總結如下方法: 「第一步」:拖拽一個Containers中的Widget到編輯界面; 「第二步」:選擇Widget部件,右鍵選擇「提高爲...(Promote to ...)」; 「第三步」:設置「提高的類名稱」爲
QVideoWidget
,「頭文件」爲PyQt5.QtMultimediaWidgets
「第四步」:點擊添加,而後點擊提高。 反應到編譯的Python代碼中,其實就是增長了一句
from PyQt5.QtMultimediaWidgets import QVideoWidget
在使用時,能夠參考下面代碼使用(僅僅是一個示例),此處僅僅播放視頻,沒有暫停、顯示進度條等功能,如需增長,能夠參考這篇教程:https://stackoverflow.com/questions/57842104/how-to-play-videos-in-pyqt
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
# 首先初始化一個mediaPlayer self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) self.mediaPlayer.setVideoOutput(self.ui.VideoDisplay) # 在須要使用這個mediaPlayer的函數中,從本地打開視頻並播放 self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(file_name))) self.mediaPlayer.play() 複製代碼
另外,須要下載一個解碼器,否則播放mp4視頻的時候會以下圖同樣報錯。解碼器的話下載安裝 LAV 解碼器就好,下載地址:LAV 0.74.1: Installer (both x86/x64)
它背後的實現依靠的是「大數據+基於內容的圖像檢索」(Content-based image retrieval ,CBIR),「基於內容」意味着搜索分析圖像的內容,而不是與圖像相關的元數據,如關鍵字、標籤或描述。術語「內容」在這個上下文中可能指的是顏色、形狀、紋理或任何其餘能夠從圖像自己衍生出來的信息。CBIR使用起來比較方便,由於它不須要標註信息,而純粹依賴元數據的搜索依賴於標註的質量和完整性。wikipedia上有列出不少CBIR engines,trace.moe則使用了Lire。對於圖像的描述,trace.moe則僅僅使用了顏色佈局(Color Layout )。另外一方面就是大數據,其背後的數據支撐爲30096小時的視頻內容(大約26億幀),來自於3194部動畫,大約18.1 TB大小。7.46億幀索引(重複數據刪除後),數據庫大小爲140 GB。具體實現細節能夠參考:trace.moe slide和trace.moe github 項目。
若是你不關心實現細節,能夠直接看下面的API接口使用。
import requests
img_path = 'xxx.png' traceMoe_api = "https://trace.moe/api/search" files = {"image": ('anime.png', open(img_path, 'rb'))} res = requests.post(traceMoe_api, files=files) 複製代碼
返回一個json結果,內容以下: 其中docs則包含了可能的結果,其內容以下:
獲得這些內容後,就能夠下載對應的視頻片斷:
url = f"https://trace.moe/preview.php?anilist_id={item['anilist_id']}&file={item['filename']}&t={item['at']}&token={item['tokenthumb']}"
video = requests.get(url) with open(item['filename'], 'wb') as f: f.write(video.content) 複製代碼
固然,也不是天天無限制請求的,普通用戶天天只能查詢150次
Nuitka的做用是將Python程序轉換成C語言的可執行elf文件。這樣在運行時就能夠享受到C語言處理過程當中的優化,提升速度。經測試,Nuitka打包後的exe比Pyinstaller打包後的exe運行速度提高30%,PyQT5的UI文件轉換成py文件轉換成C語言後,界面秒開呀。 「第一步」:下載MinGW64 8.1,解壓文件到C盤根目錄,並將bin路徑加入到環境變量中。而後安裝Nuitka:pip install nuitka
;
這樣就表示成功了:
❝import的系統庫,使用python3x.dll來執行,其餘本身實現的UI界面和數據庫的鏈接以及函數和功能實現,須要加密(反編譯)和快速反應的,用戶的體驗就在這裏,這部分藉助Nuitka來實現。 如下是Nuitka的關鍵命令段: 「--nofollow-imports #全部的import所有不使用,交給python3x.dll執行
❞
--follow-import-to=need #need爲你須要編譯成C/C++的py文件夾命名」 ——引用自:Python打包exe(32/64位)-Nuitka再下一城
「第二步」:調試階段,逐個加入所需的輪子文件: 首先運行 nuitka --standalone --mingw64 --show-memory --show-progress --nofollow-imports --plugin-enable=qt-plugins --follow-import-to=need --output-dir=output app_main.py
而後運行output\app_main.dist中的app_main.exe,逐個找到缺的輪子的文件,並加入到output\app_main.dist目錄下,以下圖,代表缺乏
requests
等庫,則能夠利用Everything,XSearch等軟件快速定位文件所在地(關注公衆號:野風同窗,回覆「文件查找」便可獲取軟件)。加到能夠運行爲止。「記住把這些庫文件單獨另外找一個文件夾放着,後面須要複製到正式輸出的文件夾中」。
「第三步」:生成階段, 運行
nuitka --standalone --windows-disable-console --mingw64 --nofollow-imports --show-memory --show-progress --plugin-enable=qt-plugins --follow-import-to=need --recurse-all --output-dir=output app_main.py
,而後將剛剛找到庫文件複製到app_main.dist文件夾下。這樣就基本完成了打包,進入app_main.dist中,點擊app_main.exe便可運行(前提是安裝了LAV 解碼器,否則視頻不會顯示!)。
下面演示一下: https://zhuanlan.zhihu.com/p/156851623
本文Python源碼及exe打包後的軟件,關注個人公衆號「「野風同窗」」,回覆「「以圖搜番」」便可獲取。 一個程序員的自我成長之路,持續分享機器學習基礎與應用、LeetCode面試算法和Python基礎與應用等技術乾貨文章,同時也常常推薦高質量軟件工具、網站和書籍。