亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • PyQt5如何實現將Matplotlib圖像嵌入到Scoll Area中顯示滾動條效果

PyQt5如何實現將Matplotlib圖像嵌入到Scoll Area中顯示滾動條效果

發布時間:2021-05-18 14:43:29 來源:億速云 閱讀:281 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關PyQt5如何實現將Matplotlib圖像嵌入到Scoll Area中顯示滾動條效果,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

前言

如題目所述,又是花費了兩天的時間實現了該功能,本來今天下午有些心灰意冷,打算放棄嵌入到Scoll Area中的想法,但最后還是心里一緊,仔細梳理了一下邏輯,最終實現了功能

效果展示

PyQt5如何實現將Matplotlib圖像嵌入到Scoll Area中顯示滾動條效果

注意:當你想實現一個子功能的時候,可以從新創建兩個文件:

×××.ui文件(如上圖效果展示是和我項目里的位置一樣的)×××.py文件(用來實現功能)

截圖

PyQt5如何實現將Matplotlib圖像嵌入到Scoll Area中顯示滾動條效果

如上圖所示,紅色框里的文件是實現效果展示的所有源文件。但是文件夾testcode是為了實現將Matplotlib圖像嵌入到Scoll Area中所做的所有工作,稍后我會將參考資源放入文章末尾


一、解決步驟

1.1 qt designer

設計ui文件,控件的位置需要和自己項目中控件的位置相同,以便功能實現后方便項目調用

PyQt5如何實現將Matplotlib圖像嵌入到Scoll Area中顯示滾動條效果

保存為testpiv.ui文件

1.2 pycharm編寫程序

直加看代碼不懂得話,建議查看1.3中的參考文章,我實現該功能也是來源于這些

代碼

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中顯示滾動條效果”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇坪县| 堆龙德庆县| 永寿县| 吉林省| 浮山县| 阜新市| 韩城市| 万安县| 建水县| 海宁市| 吉隆县| 修水县| 西吉县| 大同县| 英德市| 独山县| 锦屏县| 泸州市| 吉首市| 汕头市| 隆回县| 石城县| 仙游县| 永和县| 林西县| 拜城县| 黄山市| 教育| 新邵县| 抚顺市| 富源县| 嫩江县| 英超| 九江县| 年辖:市辖区| 永寿县| 临潭县| 万年县| 遂宁市| 旅游| 诸暨市|