您好,登錄后才能下訂單哦!
這篇“如何使用PyQt5實現將Matplotlib圖像嵌入Scoll Area中并顯示滾動條效果”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“如何使用PyQt5實現將Matplotlib圖像嵌入Scoll Area中并顯示滾動條效果”文章吧。
設計ui文件,控件的位置需要和自己項目中控件的位置相同,以便功能實現后方便項目調用
保存為
testpiv.ui
文件
代碼
import cv2
import os
import sys
import math
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi
import matplotlib
from matplotlib import pyplot as plt
matplotlib.use("Qt5Agg") # 聲明使用QT5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
matplotlib.use("Qt5Agg") # 聲明使用QT5
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
#創建一個matplotlib圖形繪制類
class MyFigure(FigureCanvas):
def __init__(self,width, height, dpi):
# 創建一個Figure,該Figure為matplotlib下的Figure,不是matplotlib.pyplot下面的Figure
self.fig = plt.figure(figsize=(width, height), dpi=dpi)
# 在父類中激活Figure窗口,此句必不可少,否則不能顯示圖形
super(MyFigure,self).__init__(self.fig)
# 調用Figure下面的add_subplot方法,類似于matplotlib.pyplot下面的subplot(1,1,1)方法
class scollarea_showpic(QMainWindow):
def __init__(self, queryPath=None, samplePath=None,limit_value = None):
super().__init__()
self.queryPath = queryPath # 圖庫路徑
self.samplePath = samplePath # 樣本圖片
self.limit_value = limit_value
self.ui()
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 只有這樣中文字體才可以顯示
def ui(self):
loadUi('./testpiv.ui', self)
self.SIFT(self.queryPath,self.samplePath,self.limit_value)
def getMatchNum(self,matches,ratio):
'''返回特征點匹配數量和匹配掩碼'''
matchesMask=[[0,0] for i in range(len(matches))]
matchNum=0
for i,(m,n) in enumerate(matches):
if m.distance < ratio * n.distance: #將距離比率小于ratio的匹配點刪選出來
matchesMask[i]=[1,0]
matchNum+=1
return (matchNum,matchesMask)
def SIFT(self,dirpath,picpath,limit_value):
# path='F:/python/gradu_design/gra_des/'
queryPath=dirpath #圖庫路徑
samplePath=picpath #樣本圖片
comparisonImageList=[] #記錄比較結果
#創建SIFT特征提取器
sift = cv2.xfeatures2d.SIFT_create()
#創建FLANN匹配對象
"""
FLANN是類似最近鄰的快速匹配庫
它會根據數據本身選擇最合適的算法來處理數據
比其他搜索算法快10倍
"""
FLANN_INDEX_KDTREE=0
indexParams=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)
searchParams=dict(checks=50)
flann=cv2.FlannBasedMatcher(indexParams,searchParams)
sampleImage=cv2.imread(samplePath,0)
kp1, des1 = sift.detectAndCompute(sampleImage, None) #提取樣本圖片的特征
for parent,dirnames,filenames in os.walk(queryPath):
print('parent :',parent,' ','dirnames :',dirnames)
for p in filenames:
p=queryPath+p
# print('pic file name :',p)
queryImage=cv2.imread(p,0)
kp2, des2 = sift.detectAndCompute(queryImage, None) #提取比對圖片的特征
matches=flann.knnMatch(des1,des2,k=2) #匹配特征點,為了刪選匹配點,指定k為2,這樣對樣本圖的每個特征點,返回兩個匹配
(matchNum,matchesMask) = self.getMatchNum(matches,0.9) #通過比率條件,計算出匹配程度
matchRatio=matchNum*100/len(matches)
drawParams=dict(matchColor=(0,255,0),
singlePointColor=(255,0,0),
matchesMask=matchesMask,
flags=0)
comparisonImage=cv2.drawMatchesKnn(sampleImage,kp1,queryImage,kp2,matches,None,**drawParams)
comparisonImageList.append((comparisonImage,matchRatio)) #記錄下結果
comparisonImageList.sort(key=lambda x:x[1],reverse=True) #按照匹配度排序 降序
new_comparisonImageList = comparisonImageList[:limit_value]
count=len(new_comparisonImageList)
column = 1 # 列
row = math.ceil(count/column) # 行 math.ceil: 函數返回大于或等于一個給定數字的最小整數
print('列:',column, ' ','行:',row)
#繪圖顯示
F = MyFigure(width=10, height=10, dpi=100) # 500 * 400
for index,(image,ratio) in enumerate(new_comparisonImageList):
F.axes = F.fig.add_subplot(row,column,index+1)
F.axes.set_title('Similiarity %.2f%%' % ratio)
plt.imshow(image)
# 調整subplot之間的間隙大小
plt.subplots_adjust(hspace=0.2)
self.figure = F.fig
# FigureCanvas:畫布
self.canvas = FigureCanvas(self.figure) # fig 有 canvas
self.canvas.resize(self.picwidget.width(), 3000) # 畫布大小
self.scrollArea = QScrollArea(self.picwidget) # picwidget上有scroll
self.scrollArea.setFixedSize(self.picwidget.width(), self.picwidget.height())
self.scrollArea.setWidget(self.canvas) # widget上有scroll scroll有canvas
self.nav = NavigationToolbar(self.canvas, self.picwidget) # 創建工具欄
self.setMinimumSize(self.width(), self.height())
self.setMaximumSize(self.width(), self.height())
self.setWindowTitle('Test')
if __name__ == "__main__":
app = QApplication(sys.argv)
queryPath='F:/python/gradu_design/gra_des/imges/' #圖庫路徑
samplePath='F:/python/gradu_design/gra_des/imges/resized_logo1_1.jpg' #樣本圖片
main = scollarea_showpic(queryPath,samplePath,3)
main.show()
sys.exit(app.exec_())
以上就是關于“如何使用PyQt5實現將Matplotlib圖像嵌入Scoll Area中并顯示滾動條效果”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。