如何使用PyQt5实现将Matplotlib图像嵌入Scoll Area中并显示滚动条效果
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇"如何使用PyQt5实现将Matplotlib图像嵌入Scoll Area中并显示滚动条效果"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,
千家信息网最后更新 2025年11月09日如何使用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安全错误
数据库的锁怎样保障安全
福清国家网络安全宣传
网络安全板块怎么操作
无锡常规软件开发行业
阳江无线软件开发供应商
法治教育网络安全手抄报
吉林服务器硬盘多少钱
网络技术属于什么学
简易的语音对讲软件开发
平安保险数据库
封特网络技术有限公司
学校网络安全心得体会
cad网络安全
深圳市亿佳网络技术有限公司官网
计算机网络技术与实训第三版
香港服务器网站收录慢
ad 域 服务器管理器
第五人格角色服务器选择
快单王软件开发
联想服务器td340机箱怎么开
惠普服务器报错011
深圳理奥网络技术有限公司
定制企业app软件开发杭州
宁波电脑软件开发流程
应用软件开发费用计算方法
软件开发环境试卷
宝塔数据库地址
ajax实现网页数据库
中国科技刊期数据库
哪些应用数据库
网络安全防护技术研究论文