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:
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