Python_OpenCV对摄像头图像进行边缘检测

 主要就这个Canny函数,这个什么Canny算法据说是1986年发布的,有点牛批

mat=cv2.Canny(mat,MinVal,MaxVal,5,L2gradient=True)
# minVal:最小梯度,小于阈值的都不作为边缘
# maxVal:最大梯度,大于阈值的都作为边缘
# 5 :5*5大小的高斯模糊,用来消除噪点
# L2gradient :求图像梯度,从而进行去除非边界上的点(非极大值抑制)

 mat是从摄像头采集到并已经完成数据格式转换的图像数据

用的摄像头用OpenCV打不开,只能用厂家提供的SDK,代码肯定不能和其他摄像头通用,用的黑白摄像头,彩色的话要先把图像转换成灰度图

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

import sys
import numpy as np
import cv2
from PyQt5.QtWidgets import QApplication, QMainWindow,QMessageBox
from matplotlib import pyplot as plt

from UI import Ui_MainWindow

from dvp import *

flag=False
MinVal=50
MaxVal=50

def frame2mat(frameBuffer):
    frame, buffer = frameBuffer
    bits = np.uint8 if(frame.bits == Bits.BITS_8) else np.uint16
    shape = None
    convertType = None
    if(frame.format >= ImageFormat.FORMAT_MONO and frame.format <= ImageFormat.FORMAT_BAYER_RG):
        shape = 1
    elif(frame.format == ImageFormat.FORMAT_BGR24 or frame.format == ImageFormat.FORMAT_RGB24):
        shape = 3
    elif(frame.format == ImageFormat.FORMAT_BGR32 or frame.format == ImageFormat.FORMAT_RGB32):
        shape = 4
    else:
        return None

    mat = np.frombuffer(buffer, bits)
    mat = mat.reshape(frame.iHeight, frame.iWidth, shape)   #转换维度
    return mat

class MyWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setupUi(self)

        # 绑定控件的事件     格式:控件名.事件.connect(处理函数) ,不用带参数和括号
        self.Open.clicked.connect(self.OpenTheCamera)#打开相机
        self.Canny.stateChanged.connect(self.StartCanny)#边缘检测复选框
        self.Min.valueChanged.connect(self.SetTheMin)#最小值滑动条
        self.Max.valueChanged.connect(self.SetTheMax)#最大值滑动条
        
    def OpenTheCamera(self):#打开相机
        global camera
        global flag
        try:
            camera = Camera(0)#以索引号的方式打开相机
            camera.Start()#启动视频流
            cv2.namedWindow(u"Camera",0)#可以拖动窗口大小
            cv2.resizeWindow(u"Camera", 640, 480)#设置窗口大小
            cv2.moveWindow(u"Camera",1200,500)#设置窗口位置

            while (cv2.waitKey(1) != 27):
                    frame = camera.GetFrame(3000)#从相机采集图像数据,超时时间为3000毫秒
                    mat = frame2mat(frame)#转换为标准数据格式
                    if flag==True:
                        # minVal:最小梯度,小于阈值的都不作为边缘
                        # maxVal:最大梯度,大于阈值的都作为边缘
                        # 5 :5*5大小的高斯滤波器(卷积核),用来消除噪声影响
                        # L2gradient :求图像梯度,从而进行去除非边界上的点(非极大值抑制)
                        mat=cv2.Canny(mat,MinVal,MaxVal,5,L2gradient=True)
                    cv2.imshow(u"Camera", mat)#显示图像数据
        except BaseException:
            QMessageBox.about(self, "错误", "相机已经开启")
        return None


    def StartCanny(self):
        global camera
        global flag
        if self.Canny.isChecked():#判断复选框是否被选中
            flag=True
        else:
            flag=False
        return None

    def SetTheMin(self):
        global MinVal
        MinVal=self.Min.value()
        return None

    def SetTheMax(self):
        global MaxVal
        MaxVal=self.Max.value()
        return None
    

#运行程序
if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = MyWindow()
    mainWindow.show()
    sys.exit(app.exec_())

试了一下,感觉8行

Python_OpenCV对摄像头图像进行边缘检测_第1张图片

Python_OpenCV对摄像头图像进行边缘检测_第2张图片

你可能感兴趣的:(Python,工业摄像机,python,计算机视觉,opencv,边缘检测)