找红色绿色四边形物体——带qt界面

95 篇文章 11 订阅

2021.4.6版本程序备份

效果图

在这里插入图片描述

代码

import cv2
import numpy as np
from imutils import contours

# 获取一个视频并打开
cap = cv2.VideoCapture('test.mp4')

# 绿色阈值
green_lower = np.array([35, 43, 35])
green_upper = np.array([90, 255, 255])

# 红色阈值
red_lower = np.array([160, 20, 70])
red_upper = np.array([190, 255, 255])
# 内核
kernel = np.ones((5, 5), np.uint8)

# VideoCapture对象是否成功打开
if cap.isOpened():
    print('已经打开了视频')
    fps = cap.get(cv2.CAP_PROP_FPS)
    print('视频的帧率为:', fps)
    while 1:
        # 读取一帧视频
        ret, frame = cap.read()
        if not ret:
            print('视频已结束')
            break
        draw_frame = frame.copy()
        # 转变为HSV颜色空间
        img_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        # 颜色识别
        #img = cv2.inRange(img_hsv, green_lower, green_upper)
        img = cv2.inRange(img_hsv, red_lower, red_upper)
        # 膨胀操作
        dilation = cv2.dilate(img, kernel, iterations=1)
        # 闭操作
        closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel)
        # 高斯滤波
        closing = cv2.GaussianBlur(closing, (5, 5), 0)
        # 边缘检测
        edges = cv2.Canny(closing, 10, 20)

        # 寻找轮廓
        contour, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

        if len(contour) > 0:
            # 存放轮廓面积的列表
            s = []
            # 存放最大轮廓的索引
            max_index = 0
            # 获得排序后的轮廓列表以及每个轮廓对应的外接矩形
            (contour, boundingBoxes) = contours.sort_contours(contour)
            # 寻找面积最大的轮廓的索引
            for cnt in contour:
                s.append(cv2.contourArea(cnt))
            max_index = s.index(max(s))
            # 根据面积最大轮廓的索引找到它的外接矩形的信息
            (x, y, w, h) = boundingBoxes[max_index]
            # 画矩形
            frame_out = cv2.rectangle(draw_frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.namedWindow('draw_frame', 0)
        cv2.imshow("draw_frame", draw_frame)
        cv2.waitKey(int(fps))
else:
    print('视频打开失败')

2021.4.6第二版本程序备份

效果图

在这里插入图片描述

代码

import cv2
import numpy as np
from imutils import contours

Picture_display_flag=0

# 获取一个视频并打开
cap = cv2.VideoCapture('test.mp4')

# 绿色阈值
green_lower = np.array([35, 43, 35])
green_upper = np.array([90, 255, 255])

# 红色阈值
red_lower = np.array([160, 20, 70])
red_upper = np.array([190, 255, 255])
# 内核
kernel = np.ones((5, 5), np.uint8)
kernel_1 = np.ones((7, 7), np.uint8)
# VideoCapture对象是否成功打开
if cap.isOpened():
    print('已经打开了视频')
    fps = cap.get(cv2.CAP_PROP_FPS)
    print('视频的帧率为:', fps)
    while 1:
        # 1、 读取一帧视频
        ret, frame = cap.read()
        if not ret:
            print('视频已结束')
            break
        draw_frame = frame.copy()
        # 2、转变为HSV颜色空间
        img_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        # 3、颜色识别
        #img = cv2.inRange(img_hsv, green_lower, green_upper)
        img = cv2.inRange(img_hsv, red_lower, red_upper)#红色
        if Picture_display_flag==1:
            cv2.namedWindow('img', 0)
            cv2.imshow("img", img)
        # 4、膨胀操作
        dilation = cv2.dilate(img, kernel_1, iterations=1)
        # 5、闭操作
        closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel_1)
        # 6、高斯滤波
        closing = cv2.GaussianBlur(closing, (5, 5), 0)
        if Picture_display_flag==1:
            cv2.namedWindow('closing', 0)
            cv2.imshow("closing", img)

        # 7、寻找轮廓
        contour, hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
        new_contour = []#新轮廓

        if len(contour) > 0:
            if Picture_display_flag == 1:
                drawlk = cv2.drawContours(draw_frame, contour, -1, (0, 255, 255),2)  # 画出所有轮廓,-1 ;最大的轮廓  1是cants【1】,-1是所有轮廓
            # 存放轮廓面积的列表
            s = []
            # 存放最大轮廓的索引
            max_index = 0
            # 获得排序后的轮廓列表以及每个轮廓对应的外接矩形
            (contour, boundingBoxes) = contours.sort_contours(contour)

            # 8、寻找面积最大的轮廓的索引,通过面积滤除小轮廓
            for cnt in contour:
                s.append(cv2.contourArea(cnt))
            max_index = s.index(max(s))

            # 9、拟合多边形
            epsilon = 0.01 * cv2.arcLength(contour[max_index], True)        #精度为最大轮廓长*0.01,参数越小越表示逼近的多边形精密
            #epsilon = 0.1 * cv2.arcLength(contour[1], True)  # 精度为最大轮廓长*0.01
            approx=cv2.approxPolyDP(contour[max_index],epsilon,True)        #以最大轮廓为准,构造逼近多边形
            cv2.polylines(draw_frame, [approx], True, (255, 255, 0), 4)#画出多边形


        cv2.namedWindow('draw_frame', 0)
        cv2.imshow("draw_frame", draw_frame)
        cv2.waitKey(int(fps))
else:
    print('视频打开失败')

2021.4.7第一版本程序备份——gui界面

效果图

在这里插入图片描述

代码

# -*- coding: utf-8 -*-
'''**************************************************************************
这是通用的图像识别的qt界面,具有读入图片,读入视频,显示图片显示视频的功能。

版本:1.0
内容:创建pyqt界面,用于图像识别,有基本打开图像,显示图像功能
时间:2020.3.20
作者:狄云

版本:2.0
内容:新增视频可以实时显示并检测,修改图片检测缓存路径,改为相对路劲
时间:2020.7.20
作者:狄云

版本:3.0
内容:新增空间间距设置,新增打开视频功能,(与之前打开图片功能相同)
时间:2020.8.16
作者:狄云

版本:4.0
内容:新增表格显示,使用方法参考:https://www.cnblogs.com/linyfeng/p/11832237.html
时间:2020.8.30
作者:狄云

版本:5.0
内容:新增登录界面,新增保存excel文件,使用方法参考:https://www.cnblogs.com/jyroy/p/9465034.html
时间:2020.9.04
作者:狄云
***************************************************************************'''

from PIL import Image


import datetime


import sys
import argparse

from PIL import Image
import numpy as np
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

import os
import datetime
from timeit import time
import warnings
import cv2 as cv
import numpy as np
import argparse
from PIL import Image


import sys
from PyQt5.QtCore import QSize
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QComboBox
from PyQt5.QtWidgets import QGridLayout
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QLabel
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QTextEdit

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *


from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *



from imutils import contours




from qtpy import QtGui
from PyQt5.QtGui import QFont

###========全局变量 定义开始=======###
# 打开的是摄像头还是本地视频
camera_or_local_flag = 0
# 识别进行中还是暂停识别中,1为摄像头,2位本地摄像头
Start_or_pause_flag = 0

#是否显示调试图像
Picture_display_flag=0

result_image = ...

fps = 0.0
len_last = 0
#查找系统有几个摄像头
class Camera:
    def __init__(self, cam_preset_num=10):
        self.cam_preset_num = cam_preset_num

    def get_cam_num(self):
        cnt = 0
        for device in range(0, self.cam_preset_num):
            stream = cv.VideoCapture(device)

            grabbed = stream.grab()
            stream.release()
            if not grabbed:
                break
            cnt = cnt + 1

        return cnt
class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        # 1、总界面框大小 MainWindow
        MainWindow.resize(1650, 820)  # 总界面框
        # 左边界面区域:verticalLayoutWidget    QWidget类
        self.verticalLayoutWidget = QtWidgets.QWidget(MainWindow)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(30, 25, 1280, 720))  # 左边图片框。左上角坐标及宽度高度
        self.verticalLayoutWidget.setStyleSheet('background-color:rgb(55,55,55)')  # 设置做左边框的颜色
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)  # QVBoxLayout类 垂直地摆放小部件
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)  # 设置左侧、顶部、右侧和底部边距,以便在布局周围使用。
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_ShowPicture = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_ShowPicture.setObjectName("label_ShowPicture")
        self.verticalLayout.addWidget(self.label_ShowPicture)

        # 右边按钮及显示结果字符的一块区域:verticalLayoutWidget_2    QWidget类
        self.verticalLayoutWidget_2 = QtWidgets.QWidget(MainWindow)
        self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(1350, 50, 250, 700))  # 右边按钮及显示结果字符的大小
        # self.verticalLayoutWidget_2.setStyleSheet('background-color:rgb(155,155,155)')  # 设置做左边框的颜色
        self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)  # QVBoxLayout类 垂直地摆放小部件
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")

        # 设置控件间的间距
        self.verticalLayout_2.setSpacing(30)

        # 按钮0 查看系统有几个摄像头:pushButton_select_pcture
        self.pushButton_find_camera = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
        self.pushButton_find_camera.setObjectName("pushButton_find_camera")
        self.verticalLayout_2.addWidget(self.pushButton_find_camera)  # 将按钮1增加到




        # 按钮1 选择图片按钮:pushButton_select_pcture
        self.pushButton_open_camera = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
        self.pushButton_open_camera.setObjectName("pushButton_open_camera")
        self.verticalLayout_2.addWidget(self.pushButton_open_camera)  # 将按钮1增加到

        # 按钮2 选择视频按钮:pushButton_select_pcture
        self.pushButton_open_Local_video = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
        self.pushButton_open_Local_video.setObjectName("pushButton_open_Local_video")
        self.verticalLayout_2.addWidget(self.pushButton_open_Local_video)  # 将按钮1增加到

        # 2:下拉菜单:颜色选择
        self.comboBox_1 = QtWidgets.QComboBox(self.verticalLayoutWidget_2)
        self.comboBox_1.setObjectName("comboBox_1")
        self.verticalLayout_2.addWidget(self.comboBox_1)
        self.comboBox_1.addItems(['          颜色选择', '          红色', '          绿色'])

        # 2:下拉菜单:形状选择
        self.comboBox_2 = QtWidgets.QComboBox(self.verticalLayoutWidget_2)
        self.comboBox_2.setObjectName("comboBox_2")
        self.verticalLayout_2.addWidget(self.comboBox_2)
        self.comboBox_2.addItems(['          形状选择', '          矩形', '          圆形'])


        # 按钮3 开始识别按钮:pushButton_shibie
        self.pushButton_Start_or_pause = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
        self.pushButton_Start_or_pause.setObjectName("pushButton_Start_or_pause")
        self.verticalLayout_2.addWidget(self.pushButton_Start_or_pause)
        # 按钮4 选择模型:pushButton_shibie
        self.pushButton_save = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
        self.pushButton_save.setObjectName("pushButton_save")
        self.verticalLayout_2.addWidget(self.pushButton_save)

        # 放“图像识别结果为”这一句话
        self.label = QtWidgets.QLabel(self.verticalLayoutWidget_2)
        font = QtGui.QFont()
        font.setPointSize(15)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.verticalLayout_2.addWidget(self.label)

        #lable_2放显示结果1
        self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget_2)
        font = QtGui.QFont()
        font.setPointSize(15)
        self.label_2.setFont(font)
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")
        self.verticalLayout_2.addWidget(self.label_2)
        #


        # 表格
        self.tableWidget = QtWidgets.QTableWidget(self.verticalLayoutWidget_2)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(3)  # 列数
        self.tableWidget.setRowCount(100000)  # 行数
        # 设置表格的行、列标题,如下:
        self.tableWidget.setHorizontalHeaderLabels(['帧号', '时刻', '状态'])
        # self.tableWidget.setVerticalHeaderLabels(['1', '2'])
        self.verticalLayout_2.addWidget(self.tableWidget)  # 将表格加入到verticalLayout_2空间中,依次罗列
        self.msg_box = QtWidgets.QMessageBox
        # 指定列宽
        self.tableWidget.horizontalHeader().resizeSection(0, 55)
        self.tableWidget.horizontalHeader().resizeSection(1, 265)
        self.tableWidget.horizontalHeader().resizeSection(2, 140)

        # self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)#禁止用户编辑,即只读
        # 行、列标题的显示与隐藏。
        # self.tableWidget.horizontalHeader().setVisible(False)#列标题不显示
        self.tableWidget.verticalHeader().setVisible(False)  # 行标题不显示

        self.timer_camera = QtCore.QTimer()  # 初始化定时器
        self.cap = cv.VideoCapture()  # 初始化摄像头
        self.CAM_NUM = 0
        self.__flag_work = 0
        self.x = 0
        self.count = 0
        # 视频显示与计时器,以及关闭识别
        # 建立通信连接
        self.pushButton_find_camera.clicked.connect(self.button_find_camera_click)
        self.pushButton_open_camera.clicked.connect(self.button_open_camera_click)
        self.timer_camera.timeout.connect(self.deep_sort)
        self.pushButton_open_Local_video.clicked.connect(self.pushButton_open_Local_video_click)  #
        self.pushButton_Start_or_pause.clicked.connect(self.pushButton_Start_or_pause_click)
        self.pushButton_save.clicked.connect(self.pushButton_save_click)

        # 下拉菜单信号事件
        self.comboBox_1.currentIndexChanged[str].connect(self.print_value_1)  # 条目发生改变,发射信号,传递条目内容
        self.comboBox_1.currentIndexChanged[int].connect(self.print_value_1)  # 条目发生改变,发射信号,传递条目索引
        # 下拉菜单信号事件
        self.comboBox_2.currentIndexChanged[str].connect(self.print_value_2)  # 条目发生改变,发射信号,传递条目内容
        self.comboBox_2.currentIndexChanged[int].connect(self.print_value_2)  # 条目发生改变,发射信号,传递条目索引
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        name_picture = 0

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "pyqt通用界面"))
        #  self.label_ShowPicture.setText(_translate("MainWindow", "图片展示区"))
        self.pushButton_find_camera.setText(_translate("MainWindow", "检查设备"))
        self.pushButton_open_camera.setText(_translate("MainWindow", "打开摄像头识别"))
        self.pushButton_open_Local_video.setText(_translate("MainWindow", "选择本地视频识别"))
        self.pushButton_Start_or_pause.setText(_translate("MainWindow", "开始识别"))
        self.pushButton_save.setText(_translate("MainWindow", "保存结果"))
        #self.label.setText(_translate("MainWindow", "图像识别结果为:"))


    image = None


    # 查看系统有几个摄像头
    def button_find_camera_click(self):
        cam = Camera()
        cam_num = cam.get_cam_num()
        print(cam_num)
        new_num=str(cam_num)
        #self.label_2.setText(cam_num)
        self.label.setText( "当前设备摄像头个数为:")
        self.label_2.setText(new_num)

    # 打开摄像头
    def button_open_camera_click(self):
        global camera_or_local_flag
        if self.timer_camera.isActive() == False:
            flag = self.cap.open(self.CAM_NUM)
            if flag == False:
                msg = QtWidgets.QMessageBox.Warning(self, u'Warning', u'请检测相机与电脑是否连接正确',
                                                    buttons=QtWidgets.QMessageBox.Ok,
                                                    defaultButton=QtWidgets.QMessageBox.Ok)
            # if msg==QtGui.QMessageBox.Cancel:
            #                     pass
            else:
                self.timer_camera.start(30)
                camera_or_local_flag = 1  # 打开了摄像头
                self.pushButton_open_camera.setText(u'关闭相机')
        else:
            self.timer_camera.stop()
            self.cap.release()
            camera_or_local_flag = 0  # 关闭了摄像头
            self.label_ShowPicture.clear()
            self.pushButton_open_camera.setText(u'打开相机')

    # 选择图片
    def pushButton_select_pcture_click(self):
        filename = QFileDialog.getOpenFileName(None, 'Open file', 'C:/Users/Desktop/testpicture/')
        # 设置标签的图片
        src0 = cv.imread(filename[0])
        resized0 = cv.resize(src0, (1280, 720), interpolation=cv.INTER_AREA)
        cv.imwrite("./temp/temp0.jpg", resized0)
        self.label_ShowPicture.setPixmap(QPixmap("./temp/temp0.jpg"))
        print("filename[0]=", filename[0])
        self.image = Image.open(filename[0])

    # img1 = yolo.detect_image(image)
    # img1.show()

    # 选择视频
    def pushButton_open_Local_video_click(self):
        global camera_or_local_flag
        # 打开本地视频,则关闭摄像头的视频
        self.timer_camera.stop()
        self.cap.release()
        camera_or_local_flag = 0  # 关闭了摄像头
        self.label_ShowPicture.clear()
        self.pushButton_open_camera.setText(u'打开相机')

        if self.timer_camera.isActive() == False:
            print("打开本地视频")
            self.fileName, self.fileType = QFileDialog.getOpenFileName(None, 'Choose file', '', '*.mp4')
            self.cap_Local_video = cv.VideoCapture(self.fileName)

            # self.timer_camera.start(30)
            camera_or_local_flag = 2  # 打开了本地视频
            #self.pushButton_open_Local_video.setText(u'关闭本地视频')

            # 打开录像后,不进行播放,等点击开始识别后开始播放
            ret, self.frame = self.cap_Local_video.read()
            img = cv.resize(self.frame, (1280, 720), interpolation=cv.INTER_AREA)
            height, width, bytesPerComponent = img.shape  # 取彩色图片的长、宽、通道
            bytesPerLine = 3 * width
            cv.cvtColor(img, cv.COLOR_BGR2RGB, img)
            QImg = QImage(img.data, width, height, bytesPerLine, QImage.Format_RGB888)
            pixmap = QPixmap.fromImage(QImg)
            self.label_ShowPicture.setPixmap(QPixmap(pixmap))
        else:
            self.timer_camera.stop()
            self.cap_Local_video.release()
            camera_or_local_flag = 0  # 关闭了摄像头
            self.label_ShowPicture.clear()
            self.pushButton_open_Local_video.setText(u'打开本地视频')

    # 开启按钮
    def pushButton_Start_or_pause_click(self):
        global camera_or_local_flag
        global Start_or_pause_flag
        print(camera_or_local_flag, Start_or_pause_flag)
        print(254)
        if camera_or_local_flag == 1: # 摄像头视频
            if Start_or_pause_flag == 0:
                Start_or_pause_flag = 1  # 代表开始识别
                print(258)
                self.timer_camera.start(30)
                self.pushButton_Start_or_pause.setText(u'识别中')
            # self.deep_sort()  # 调用函数

            else:
                Start_or_pause_flag = 0  # 3代表开始识别
                self.timer_camera.stop(30)
                self.pushButton_Start_or_pause.setText(u'开始识别')
        elif camera_or_local_flag == 2: # 本地视频
            if Start_or_pause_flag == 0:
                Start_or_pause_flag = 1  # 代表开始识别
                self.timer_camera.start(30)
                print(269)
                print(camera_or_local_flag, Start_or_pause_flag)
                self.pushButton_Start_or_pause.setText(u'识别中')
            # self.deep_sort()  # 调用函数

            else:
                Start_or_pause_flag = 0  # 3代表开始识别
                self.timer_camera.stop(30)
                self.pushButton_Start_or_pause.setText(u'开始识别')

        print(" 2 camera_or_local_flag =%d Start_or_pause_flag =%d", camera_or_local_flag, Start_or_pause_flag)

    def pushButton_save_click(self):
        print("保存成功")
    #下拉框
    def print_value_1(self, i):
        global type_seting_yanse
        if i==0:
            print("请选择等级")
            type_seting_yanse = -1
        if i == 1:
            print("等级为红色")
            type_seting_yanse=0
        if i == 2:
            print("等级为绿色")
            #global type_seting
            type_seting_yanse = 1
    #下拉框
    def print_value_2(self, i):
        global type_seting_xingzhuang
        if i==0:
            print("请选择等级")
            type_seting_xingzhuang = -1
        if i == 1:
            print("等级为矩形")
            type_seting_xingzhuang=0
        if i == 2:
            print("等级为圆形")
            #global type_seting
            type_seting_xingzhuang = 1

    # 事件函数
    def select_shipin(self):
        global camera_or_local_flag
        global Start_or_pause_flag
        global result_image
        print("选择视频中")


    def deep_sort(self):
        global camera_or_local_flag
        global Start_or_pause_flag
        global result_image
        global counter_zhenhao
        global counter_jueduizhenhao
        global fps
        global len_last
        i = int(0)
        ret = False
        if camera_or_local_flag == 1 and Start_or_pause_flag == 0:
            ret, self.frame = self.cap.read()
        elif camera_or_local_flag == 2 and Start_or_pause_flag == 0:  # 打开本地文件,且只显示首帧
            ret, self.frame = self.cap_Local_video.read()

        if camera_or_local_flag == 1 and Start_or_pause_flag == 1:
            ret, self.frame = self.cap.read()
        elif camera_or_local_flag == 2 and Start_or_pause_flag == 1:  # 打开本地文件,且只显示首帧
            ret, self.frame = self.cap_Local_video.read()

        # print(ret, camera_or_local_flag, Start_or_pause_flag)

        if ret != True:
            print("打开图像失败 or 识别结束")
            return
        if Start_or_pause_flag == 1:

            t1 = time.time()
            frame0 = cv.resize(self.frame, (1280, 720), interpolation=cv.INTER_AREA)
            frame = frame0.copy()
            draw_frame = frame0.copy()
            # 2、转变为HSV颜色空间
            img_hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
            # 3、颜色识别
            # img = cv2.inRange(img_hsv, green_lower, green_upper)
            img = cv.inRange(img_hsv, red_lower, red_upper)  # 红色
            if Picture_display_flag == 1:
                cv.namedWindow('img', 0)
                cv.imshow("img", img)
            # 4、膨胀操作
            dilation = cv.dilate(img, kernel_1, iterations=1)
            # 5、闭操作
            closing = cv.morphologyEx(dilation, cv.MORPH_CLOSE, kernel_1)
            # 6、高斯滤波
            closing = cv.GaussianBlur(closing, (5, 5), 0)
            if Picture_display_flag == 1:
                cv.namedWindow('closing', 0)
                cv.imshow("closing", img)

            # 7、寻找轮廓
            contour, hierarchy = cv.findContours(closing, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
            new_contour = []  # 新轮廓

            if len(contour) > 0:
                if Picture_display_flag == 1:
                    drawlk = cv.drawContours(draw_frame, contour, -1, (0, 255, 255),
                                              2)  # 画出所有轮廓,-1 ;最大的轮廓  1是cants【1】,-1是所有轮廓
                # 存放轮廓面积的列表
                s = []
                # 存放最大轮廓的索引
                max_index = 0
                # 获得排序后的轮廓列表以及每个轮廓对应的外接矩形
                (contour, boundingBoxes) = contours.sort_contours(contour)

                # 8、寻找面积最大的轮廓的索引,通过面积滤除小轮廓
                for cnt in contour:
                    s.append(cv.contourArea(cnt))
                max_index = s.index(max(s))

                # 9、拟合多边形
                epsilon = 0.01 * cv.arcLength(contour[max_index], True)  # 精度为最大轮廓长*0.01,参数越小越表示逼近的多边形精密
                # epsilon = 0.1 * cv2.arcLength(contour[1], True)  # 精度为最大轮廓长*0.01
                approx = cv.approxPolyDP(contour[max_index], epsilon, True)  # 以最大轮廓为准,构造逼近多边形
                cv.polylines(draw_frame, [approx], True, (255, 255, 0), 4)  # 画出多边形


            fps = (fps + (1. / (time.time() - t1))) / 2
            #print("fps= %.2f" % (fps))
            draw_frame = cv.putText(draw_frame, "fps= %.2f" % (fps), (0, 40), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
            frame0 = draw_frame.copy()

        else:
            frame0 = self.frame.copy()
        # 在界面实时显示结果
        img = cv.resize(frame0, (1280, 720), interpolation=cv.INTER_AREA)
        height, width, bytesPerComponent = img.shape  # 取彩色图片的长、宽、通道
        bytesPerLine = 3 * width
        cv.cvtColor(img, cv.COLOR_BGR2RGB, img)
        QImg = QImage(img.data, width, height, bytesPerLine, QImage.Format_RGB888)
        pixmap = QPixmap.fromImage(QImg)
        self.label_ShowPicture.setPixmap(QPixmap(pixmap))


if __name__ == "__main__":

    counter_zhenhao = 3
    counter_jueduizhenhao = 0
    #os.system('python login_main.py')  # 执行login_main.py文件,即登录界面,账号和密码为 diyun  12345
    # 绿色阈值
    green_lower = np.array([35, 43, 35])
    green_upper = np.array([90, 255, 255])

    # 红色阈值
    red_lower = np.array([160, 20, 70])
    red_upper = np.array([190, 255, 255])
    # 内核
    kernel = np.ones((5, 5), np.uint8)
    kernel_1 = np.ones((7, 7), np.uint8)



    app = QtWidgets.QApplication(sys.argv)

    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
课程摘要1 Qt音视频开发实战 是陈超老师用10年以上音视频一线实战开发经验,四年音视频开发教学经验打造的Qt音视频开发课程。2 Qt音视频开发实战以Qt c++开发为中心。所有课程全部围绕Qt音视频开发展开。3 非常适合那些只做Qt开发的工程师来学习,学习更容易一些。学习目标,培养高级Qt音视频开发工程师.4 Qt音视频开发实战适合那些掌握Qt基础开发,初级开发工程师,月薪在20k以下,通过学习,达到更高薪水的Qt高级开发工程师。 课程优势1 老师过去15年+ 音视频,网络通讯,数字图像处理一线实战经验。过去四年积累了丰富的音视频开发教学经验,学员从年薪30w~50w,就职于腾讯,阿里等各大互联网公司。2 老师10多年Qt开发经验,长期大量使用Qt开发项目,国内最早一批使用Qt的程序员。3 QQ 一对一教学指导,阶段性作业案例小项目指导,就业面试指导。 课程内容1 Qt 核心基础加强。对于那些学了很多年Qt开发而不得要领的学员非常友好。2 音视频开发基础。音视频原理,RGB YUV, 音频原理。图像压缩编码,音频压缩编码,H.264压缩,H.264编码原理 I P B SPS PPS解析,   视频存储容器,mp4 , AAC.  Qt音频视频采集,FFmpeg编码,解码,x264编码,AAC编码。mp3编码。格式转换。视频播放器内核。图像渲染。3 OpenGL数字图像处理基础。OpenGL基础,渲染管线,shader编程。滤镜,美颜,后期处理。编写渲染引擎。4 网络socket通讯编程,自定义私有协议。TCP/UDP音视频传输。 学员要求1 熟悉c/c++,掌握Qt基本控件,类基础。2 每天学习两小时,学习周期3~5个月,做完练习,小项目。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翟羽嚄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值