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

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