python+opencv+opencv_contrib+Anaconda+pyqt+pycharm环境配置

安装软件

Anaconda3-5.2.0-Windows-x86_64

pycharm-professional-2018.1.4

然后新建一个conda的环境: 【opencv+pyqt】

如果通过conda直接查找适合的opencv

版本是opencv3.3.1,并不是最新版本,且不含contrib模块

此时我们通过pip安装我们想要的最新的opencv模块

点击【opencv+pyqt】环境的Open Termial

若此时直接输入

pip install opencv-python
pip install opencv-contrib-python

此时得到的一定是最新的opencv版本,如果我们想换次新的,可以通过输入错误的版本号,让pip去提示都有什么版本opencv

此时,我们就可以安装,我们想要的任何一个版本了,通过代码,比如3.4.2.16最新版

pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16

opencv需要numpy环境,所以会伴随着自动安装

接下来安装pyqt

我们需要使用qt中的designer去设计框架(当然也可以手敲代码布局)

两种方式:一种是通过pip安装pyqt5-tools工具,但是本人尝试后出错【丢失api-ms-win-crt-runtime-l1-1-0.dll】,所以换另外一种方式,第二种,下载一个Qt,因为我们只是需要designer去设计而已,pycharm路径设置为一个不会出错的designer路径即可,这里我下载的是

qt-opensource-windows-x86-5.11.1这种有mingw的

如果你下载的是

qt-opensource-windows-x86-msvc2013_64-5.7.0,这种必须安装有对应的VS,designer才可正常启动

我们安装好qt后,designer就确定下来了:C:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin

接下来需要安装pyqt

还是和前面一样,如果用conda安装,有固定的qt版本【qt=5.9.2】

我们可以用pip安装自己想要的版本,还是一样,输入错误版本去让pip提示

然后我们安装最新的5.11.2

这里它会伴随着自动安装【PyQt5-sip】,这是一种专为Python调用C/C++模块使用的,sip是RiverBank(也就是PyQt的开发商)开发的用于PyQt的Python/C++混合编程解决方案。

全部安装完成后,我们打开pycharm,新建一个项目,然后选择python环境为我们创建的【opencv+pyqt】

新建工程,然后新建一个main.py

然后配置pyqt的快捷环境,流程如下:


1.打开Pycharm,进入设置,添加外部工具

2.添加QtDesigner,exe的路径在安装目录下C:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\designer.exe

Program:   C:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\designer.exe

Arguments:   $FileDir$\$FileName$

Work directory:   $FileDir$

3.设置“PyUIC5” -- 这个主要是用来将 Qt界面 转换成 py代码

Program:   D:\ProgramData\Anaconda3\envs\opencv+pyqt\Scripts\pyuic5.exe

Arguments:   $FileName$ -o $FileNameWithoutExtension$.py

Work directory:   $FileDir$

4.设置“PyRCC5” -- 如果你用到了资源文件,资源文件需要用pyrcc5.exe转码

Program:   D:\ProgramData\Anaconda3\envs\opencv+pyqt\Scripts\pyuic5.exe

Arguments:   $FileName$ -o $FileNameWithoutExtension$.py

Work directory:   $FileDir$


配置完环境后,点击快捷方式 QtDesigner

我们选择新建窗体

然后就可以拖拽控件了,我们拖拽一个按钮控件,给他加槽后,通过pyuci5把设计文件变成py文件,

界面需要有类合并来支撑这个界面。用过Qt的应该知道。界面有了还需要一个类与界面合并,可以想像这个类相当于cpp和.h文件,通俗点,我们需要有一个类继承UI转化出的这个untitled.py,并且实现槽函数

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(80, 80, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(50, 150, 481, 311))
        self.label.setObjectName("label")
        self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox.setGeometry(QtCore.QRect(350, 40, 71, 16))
        self.checkBox.setObjectName("checkBox")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(460, 30, 141, 31))
        self.lineEdit.setObjectName("lineEdit")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(MainWindow.push)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.label.setText(_translate("MainWindow", "TextLabel"))
        self.checkBox.setText(_translate("MainWindow", "CheckBox"))

from PyQt5.QtWidgets import QApplication, QMainWindow

from untitled import *
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QDockWidget, QListWidget
from PyQt5.QtGui import *


import sys

import cv2
class Mywindow(QtWidgets.QMainWindow,Ui_MainWindow):

    def __init__(self):
        super(Mywindow, self).__init__()
        self.setupUi(self)

    def push(self):  #push(),也可以理解为重载类Ui_MainWindow中的槽函数push()
        Im = cv2.imread('img1.jpg')  # 通过Opencv读入一张图片
        image_height, image_width, image_depth = Im.shape  # 获取图像的高,宽以及深度。
        QIm = cv2.cvtColor(Im, cv2.COLOR_BGR2RGB)  # opencv读图片是BGR,qt显示要RGB,所以需要转换一下
        QIm = QImage(QIm.data, image_width, image_height,  # 创建QImage格式的图像,并读入图像信息
                     image_width * image_depth,
                     QImage.Format_RGB888)
        self.label.setPixmap(QPixmap.fromImage(QIm))  # 将QImage显示在之前创建的QLabel控件中

    def mouseMoveEvent(self, event):
        # 缺省情况下,只有按下鼠标键移动时,才会调用mouseMoveEvent()
        # 如果要处理窗口中鼠标移动的事件,需要调用grabMouse()方法

        self.setMouseTracking(True)

        pointX = event.globalX()
        pointY = event.globalY()
        AA = QPoint(pointX,pointY)
        BB = self.mapFromGlobal(AA)  # mapFromGlobal(QPoint) - 将屏幕座标转换成窗口座标;
        # 除了上述方法,计算出QT界面的(x,y),也可以直接通过 XY = event.pos() 获取当前鼠标在QT界面的座标
        resultX = BB.x()  # QPoint中返回x,y的值
        resultY = BB.y()
        print('(', resultX,',',resultY, ')')




import sys

from Mywindow import *

if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Mywindow()
    window.show()
    sys.exit(app.exec_())
 
import sys

from PyQt5.QtWidgets import QApplication, QMainWindow

from Demo import *
from main3 import *
if __name__=='__main__':
    app=QtWidgets.QApplication(sys.argv) #外部参数列表
    Form=Mywindow() #我就是要合体的类哦 如果是空的可以直接定义 QtWidgets.QDialog也是可以的,会让新手很迷惑
    #ui=Ui_Dialog()  #啊啊啊,界面类也实例化了
    #ui.setupUi(Form) #我要合体了
    Form.show()      #合体后的成功展示喽
    sys.exit(app.exec_()) #退出中使用的消息循环,结束消息循环时就退出程序

结果如下:

参考文献:https://blog.csdn.net/gucunlin/article/details/77883440

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章