Tin tổng hợp

OPENCV – BÀI 9: CÀI ĐẶT QT5 + OpenCV + Python, thiết kế GUI trên Raspberry

  • 28/12/2021
  • Chúng ta sẽ tiến hành cài đặt với bản Bullseye OS cho Raspberry 

    và viết một chương trình chụp ảnh đơn giản có giao diện người dùng.

    Bước 1:kiểm tra các gói thư viện:

    $ sudo apt-get update

    Bước 2 : Update các gói thư viện:

    $ sudo apt-get dist-upgrade

    Bước 3 : Cài QT5:

    $ sudo apt-get install qtbase5-dev qtchooser
    $ sudo apt-get install qtcreator
    $ sudo apt-get install qtdeclarative5-dev
    $ sudo apt-get install qt5-qmake qtbase5-dev-tools

    cài thêm thư viện giao tiếp serial hỗ trợ QT5:

    $ sudo apt-get install libqt5serialport5

    cài đặt phần mềm eric:

    $ sudo apt-get install eric

    sau đó reboot:

    $ reboot

    Bước 4. Khởi động phần mềm Eric IDE

    Tạo thư mục chứa Workspace

    Bước 5: Tạo project mới.

    Project –> New

     

    ở sources, nhấn chuột phải chọn new packge, đạt tên thư mục là ui

    chuyển sang Forms –> new form–> Main Window , đặt tên mainWindow.ui lưu trong thư mục ui.

    sẽ xuất hiện cửa sổ chương trình QT designer của file mainWindow.ui

    Tiến hành thiết kế giao diện sửa tên object và text hiển thị

    Tiến hành down tool convert UI to code Pyuic5

    Tiếp theo nhấn chuột phải vào file mainWindow.ui –> Generate Dialog Code

    chon New –>OK

    Ở các đối tượng nút bấm click tạo sự kiện cho nút bấm như hình dưới:

    tiến hành corvert code

    Bước 6 : Tiến hành viết code

    sẽ xuất hiện code , chúng ta viết code cho file main.py như sau:

    from PyQt5.QtWidgets import QApplication
    from ui.mainWindow import MainWindow

    if __name__==’__main__’:
    import sys
    app = QApplication(sys.argv)
    ui = MainWindow()
    ui.show()
    sys.exit(app.exec_())

    Bấm phím F2 hoặc nút run script để chạy thử chương trình

    Phần giao diện app được hiển thị:

    Tiến hành viết code chức năng cho từng nút bấm trong file mainWindow.py như sau:

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

    “””
    Module implementing MainWindow.
    “””

    from PyQt5.QtCore import pyqtSlot
    from PyQt5.QtWidgets import QMainWindow
    from PyQt5 import QtCore, QtGui, QtWidgets
    from .Ui_mainWindow import Ui_MainWindow
    import sys
    import os
    import cv2
    import time

    class MainWindow(QMainWindow, Ui_MainWindow):
    “””
    Class documentation goes here.
    “””
    def __init__(self, parent=None):
    super(MainWindow, self).__init__(parent)
    self.setupUi(self)
    self.startButton.clicked.connect(self.start_webcam)
    self.exitButton.clicked.connect(self.exit)
    self.captureButton.hide()
    self.cap = None
    self.image_label.setScaledContents(True)
    self.timer = QtCore.QTimer(self, interval = 5)
    self.timer.timeout.connect(self.update_frame)

    @pyqtSlot()
    def start_webcam(self):
    self.startButton.hide()
    if self.cap is None:
    self.cap = cv2.VideoCapture(0)
    self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    self.timer.start()
    self.captureButton.show()
    self.captureButton.clicked.connect(self.capture_image)

    @pyqtSlot()
    def capture_image(self):
    flag, frame = self.cap.read()
    path = r’images/’
    if flag:
    QtWidgets.QApplication.beep()
    timestr = time.strftime(“%Y%m%d-d%H%M%S”)
    name = “img_{}.JPEG”.format(timestr)
    #cv2.imwrite(os.path.join(path, name), frame)
    cv2.imwrite(name, frame)
    @pyqtSlot()
    def update_frame(self):
    ret, image = self.cap.read()
    simage = cv2.flip(image, 1)
    self.displayImage(image, True)
    def displayImage(self, img, window=True):
    qformat = QtGui.QImage.Format_Indexed8
    if len(img.shape)==3 :
    if img.shape[2]==4:
    qformat = QtGui.QImage.Format_RGBA8888
    else:
    qformat = QtGui.QImage.Format_RGB888
    outImage = QtGui.QImage(img, img.shape[1], img.shape[0], img.strides[0], qformat)
    outImage = outImage.rgbSwapped()
    if window:
    self.image_label.setPixmap(QtGui.QPixmap.fromImage(outImage))

    @pyqtSlot()
    def exit(self):
    sys.exit()

    Tiến hành  chạy file main.py

    ảnh sau khi chụp được lưu tại thư mục chứa project