摘要:许多情况下我们需要用到摄像头获取图像,进而处理图像,这篇博文介绍利用pyqt5、OpenCV实现用电脑上连接的摄像头拍照并保存照片。为了使用和后续开发方便,这里利用pyqt5设计了个相机界面,后面将介绍如何实现,要点如下:
1. 前言
最近的项目中需要用到摄像头获取画面,于是利用OpenCV-python写了个调用摄像头的程序,同时为了后面开发和使用方便,这里利用pyqt5设计了个简单的UI界面。调用摄像头的程序非常简单,网上也有很多类似代码但带界面的不多,本来只想写个利用摄像头获取画面的程序,后来一想干脆在里面加了个拍照并保存照片的功能,有需要的朋友可以在上面进行改进或再次开发。
2. 界面设计
从运行界面就能看出,这里UI界面的层次是非常简单的,利用Qt-Designer进行设计,拖出三个按钮及两个label控件摆放如下面的界面窗口所示:
所添加控件的层次和命名如下图所示:
当然虽说目的是写个简单版的相机UI界面,但为了适当美观博主还对控件的字体、文本显示、图标等进行了设置,其中用到的图片资源如下图所示:
利用PyQt5中的PyUIC工具将UI文件转换为py文件,其代码如下,在其中就能看到对于控件的具体设置:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Camera.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# 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.setWindowModality(QtCore.Qt.NonModal)
MainWindow.resize(765, 645)
MainWindow.setMinimumSize(QtCore.QSize(765, 645))
MainWindow.setMaximumSize(QtCore.QSize(16777215, 16777215))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/newPrefix/pic/pai.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setToolTip("")
MainWindow.setAutoFillBackground(False)
MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("华文隶书")
font.setPointSize(20)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.horizontalLayout.setContentsMargins(-1, 50, -1, -1)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton_open = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_open.setMinimumSize(QtCore.QSize(100, 40))
self.pushButton_open.setMaximumSize(QtCore.QSize(120, 40))
font = QtGui.QFont()
font.setFamily("华文彩云")
font.setPointSize(12)
self.pushButton_open.setFont(font)
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap(&q