栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pyside2+QTdesigner+opencv人脸考勤系统中的遇到的问题

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pyside2+QTdesigner+opencv人脸考勤系统中的遇到的问题

动态载入ui文件无法更新

self.ui = QUiLoader().load('xx.ui')       #动态载入ui文件

这个是最常见的载入ui文件的方法,还有一种利用pycharm将ui文件转成py文件的方法我没有用过,今天说的这种其实是个乌龙,因为在qtdesigner更新之后运行,发现运行的窗口没有变,是因为我之前把ui文件复制过一次,导致之后更改的ui文件不是我导入的这个文件,所以只要换一下qtdesigner中打开的ui文件就行了

pyside2如何显示opencv的图像?

这个真的找了我很久的时间,其大概思路是:

1,用OpenCV的imread()函数读取图片数据;

2,将读取出来的图像数据BGR格式或者BGRA格式转换为RGB格式,用cvtColor()函数转换;

3,将转换过的RGB格式图像数据转换成Qt中的QImage格式;

4,通过QLabel控件显示出来(即把图像设置成背景图片);

然后把代码附上:

from PySide2.QtGui import QImage,QPixmap
    def r(self):
        a = self.ui.camera
        cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)
        while(cap.isOpened()):      #人脸检测循环
             ret, frame = cap.read()
             frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)     # RGB转BGR,不然直接显示会变蓝
             frame = cv2.flip(frame, 1)                         #摄像头是和人对立的,将图像左右调换回来正常显示。
             image = QImage(frame, frame.shape[1], frame.shape[0],
                       frame.strides[0], QImage.Format_RGB888)  #Qlmage的参数(data, width, height, bytesPerLine, format )图像存储使用8-8-8 24位RGB格式
             a.setPixmap(QPixmap.fromImage(image)) #把图像设置为背景
             a.setSizePolicy(QSizePolicy.Ignored,QSizePolicy.Ignored)   #按比例填充
             a.setScaledContents(True)
             key=cv2.waitKey(0)  #更新的同时等待操作
             if self.ui.close_.isChecked() is True:
                break
        cv2.destroyAllWindows()      #相当于把图相框删掉
        cap.release()               #释放摄像头

self.ui.camera是指我的Qlabel控件,self.ui.close_则是指我的QcheckBox控件.这里很容易造成内容泄漏啥的,我调试到半夜一点多才弄好。

pyside2实现图像更新

在opencv里面我们一般都是直接一个while循环实现帧数更新,但是在pyside2里面如果用while会及其不方便,不是组件无法使用,就是组件一直被触发,后来才发现大佬们们都是使用定时器来实现更新:

        self.timer=QTimer()     #设置定时器
        self.timer.timeout.connect(self.show)   # 这里调用不能有函数括号,不是单纯的运行函数
        self.timer.start(10)    #更新时间为每10秒

其中show方法在这里就是指图像显示在label上

pyside2释放opencv的摄像头

一般我们都会直接:

        self.cap.release()           #释放摄像头
        cv2.destroyAllWindows()      #相当于把图相框删掉

但是我本来是想实现在子窗口调用opencv的摄像头,然后关掉,再重新回主界面调用摄像头的,结果一直报错:cv2.error: OpenCV(4.5.5) D:aopencv-pythonopencv-pythonopencvmodulesimgprocsrccolor.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

找了很久并不是中文路径的问题,就是摄像头释放的问题,而我直接×掉子页面就不会报错,调用释放函数反而报错了,没办法了,而且我看大佬的代码好像也没有直接释放掉摄像头,那我也就不写这个函数了,直接让用户×掉吧。但是我也不知道这样会不会造成内存泄漏,目前调试的情况还行。

pyside2窗口交互

这里我推荐这篇博客

但有几个要注意的地方是每个类的init方法下一定要加

super().__init__()

此外这个博客是直接初始化里面调用了函数,而我的是还设置了属性,我照搬它的会报错没有show()这个方法,改成xx.ui.show()就可以了

self.ui = QUiLoader().load('1.ui')       #动态载入ui文件

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920708.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号