千家信息网

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

发表于:2024-12-03 作者:千家信息网编辑
千家信息网最后更新 2024年12月03日,这篇"如何使用PyQt5实现将Matplotlib图像嵌入Scoll Area中并显示滚动条效果"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,
千家信息网最后更新 2024年12月03日如何使用PyQt5实现将Matplotlib图像嵌入Scoll Area中并显示滚动条效果

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

解决步骤

1 qt designer

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

保存为testpiv.ui文件

2 pycharm编写程序

代码

import cv2import osimport sysimport mathfrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.uic import loadUiimport matplotlibfrom matplotlib import pyplot as pltmatplotlib.use("Qt5Agg")  # 声明使用QT5from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasmatplotlib.use("Qt5Agg")  # 声明使用QT5from 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中并显示滚动条效果"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

特征 内容 图片 样本 图像 效果 图库 路径 面的 位置 图形 大小 控件 数据 文件 文章 方法 步骤 比率 画布 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 扬州国脉网络技术有限公司 数据库偶数年龄的去掉简历 网络安全行业产值 软件开发与测试就业方向 绝地求生国际服战队服务器 电脑数据库是什么 上海交通大学网络安全硕士 市网络安全应急指挥中心职员 网络安全交流大会有哪些 远程访问服务器数据库 苏州高品质服务器价格咨询 潍坊凤军软件开发公司 三种主要服务器配置操作 女生26岁学网络安全好学吗 搭建 外网访问服务器 中学生网络安全教育短视频 大数据库技术PPT 关系数据库二维表哪两部分 四川网络安全专业怎么样 数据库根据某一个字段分组 易销互联网科技 确保欧盟5G网络安全的 数据库设置外键约束 服务器怎么给电脑更新显卡驱动 网络安全pdrr模型包括 极速开票安全接入服务器 浙大兰德网络技术有限公司 计算机网络技术的女生多吗 网络安全管理学的是什么 scum服务器服主有什么权限
0