OpenCV:是一个基于BSD许可(开源)发行的跨平台计算视觉库。由一系列C函数和少量的C++编写,实现图像处理和计算机视觉方面的很多通用算法。

Canny边缘检测算子:是一种多级检测算法。1986年由John F. Canny提出,同时提出了边缘检测的三大准则:

  1. 低错误率的边缘检测:检测算法应该精确地找到图像中的尽可能多的边缘,尽可能的减少漏检和误检。
  2. 最优定位:检测的边缘点应该精确地定位于边缘的中心。
  3. 图像中的任意边缘应该只被标记一次,同时图像噪声不应产生伪边缘。

OpenCV将Canny算法封装在一个函数中,cv.Canny()。我们可以通过调用来使用它。

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])

Canny的前三个参数是必需的。第一个参数是我们的输入图像,第二个和第三个参数是我们的minVal和maxVal,其中maxVal用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用minVal用于将这些间断的边缘连接起来。

可选参数中 aperture_size是Sobel内核的大小,默认是3.最后一个参数是L2gradient,是一个布尔值。指定了求梯度大小的方程。如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则它将使用这个函数:Edge_Gradient(G)=|Gx|+|Gy|。默认值为False。

在使用python语言写OpenCV,确保已经安装了numpy, cv2, 和matplotlib模块

如果没有请在命令行执行以下命令

pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python

下面是一个简单的使用Canny检测边缘的例子。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0) #替换为需要检测的图片
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

效果如图

opencv滑动窗口检测 opencv动态检测_边缘检测

我们也可以动态改变边缘检测。在程序运行的时候改变参数大小,从而调整为合适的大小。

我们使用cv.createTrackbar()和cv.getTrackbarPos()来动态调整数值大小。

关于cv.createTrackbar()和cv.getTrackbarPos()的用法很简单。这里举一个例子就明白了

import numpy as np
import cv2 as cv

# trackbar更改触发的事件,事件为空
def nothing(x):
    pass
# 新建一个黑色窗口
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')

# 添加三个trackbar,范围为0~255,trackbar更改触发的事件为nothing
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)

#trackbar也可以作为开关
# 打开开关才可以更改颜色
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)

# 一直循环监听
while(1):
    cv.imshow('image',img)
    # 如果是32位机器可以写k=cv.waitKey(1),如果是64位机器要加上& 0xFF
    k = cv.waitKey(1) & 0xFF

    # 当检测到按下esc按键触发此事件,退出程序
    if k == 27:
        break
    # 获取trackbar的值,并更改图片颜色
    r = cv.getTrackbarPos('R','image')
    g = cv.getTrackbarPos('G','image')
    b = cv.getTrackbarPos('B','image')
    s = cv.getTrackbarPos(switch,'image')
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b,g,r]
cv.destroyAllWindows()

这个程序可以动态更改img的颜色,效果如下:

opencv滑动窗口检测 opencv动态检测_opencv滑动窗口检测_02

使用trackbar我们就可以动态更改minVal和maxVal的值了

# python动态边缘检测
import cv2
import numpy as np
from matplotlib import pyplot as plt

def nothing(x):
    pass

img = cv2.imread('che.jpg')
# img = cv2.imread('ceshi2.bmp')

cv2.namedWindow('image')
# 范围可以根据需求,自己更改
cv2.createTrackbar('Val','image',0,500,nothing)
edges = cv2.Canny(img, 100, 200)

while(1):
    k = cv2.waitKey(1) & 0xFF
    # 当按esc键 触发关闭事件
    if k == 27:
        break

    Val = cv2.getTrackbarPos('Val','image')
    # 这里我直接将maxVal的值设置为minVal+100,可以根据需求自行更改
    edges = cv2.Canny(img, Val,Val+100 )

    cv2.imshow('image',edges)
cv2.destroyAllWindows()

效果如图

opencv滑动窗口检测 opencv动态检测_边缘检测_03

opencv滑动窗口检测 opencv动态检测_opencv滑动窗口检测_04

opencv滑动窗口检测 opencv动态检测_Image_05

参考资料:

Trackbar as the Color Palette

Canny Edge Detection

OpenCV-Python教程(8、Canny边缘检测)