如何使用PyQt5实现将Matplotlib图像嵌入Scoll Area中并显示滚动条效果

发布时间:2022-02-24 17:04:27 作者:iii
来源:亿速云 阅读:284

这篇“如何使用PyQt5实现将Matplotlib图像嵌入Scoll Area中并显示滚动条效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用PyQt5实现将Matplotlib图像嵌入Scoll Area中并显示滚动条效果”文章吧。

解决步骤

1 qt designer

设计ui文件,控件的位置需要和自己项目中控件的位置相同,以便功能实现后方便项目调用

保存为testpiv.ui文件

2 pycharm编写程序

代码

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中并显示滚动条效果”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

推荐阅读:
  1. PyQt5中QScrollBar滚动条控件怎么用
  2. 使用matplotlib怎么显示伪彩色图像

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

pyqt5 matplotlib

上一篇:react框架有哪些特点

下一篇:numpy和torch数据类型如何转化

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》