OpenCV简单应用(三、边缘检测及轮廓检测)

1.Canny边缘检测

canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 
必要参数:
第一个参数image是需要处理的原图像,该图像须为单通道的灰度图;
第二个参数threshold1是阈值1;
第三个参数threshold1是阈值2;
其中较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的阈值1用于将这些间断的边缘连接起来;
可选参数中apertureSize就是Sobel算子的大小;
L2gradient参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加);
函数返回值为一张二值图像(黑白图像),包含检测出的边缘。

2.阈值函数

threshold(src, thresh, maxval, type) 
第一个参数src是需要处理的原图像(数组),该图像须为单通道的灰度图;
第二个参数thresh是阈值;
第三个参数maxval是拟设定的最大值;
第四个参数type为取阈值方法:
THRESH_BINARY:二值阈值化                   0
THRESH_TOZERO_INV:反二值阈值化       1
THRESH_TRUNC:截断阈值化                     2
THRESH_TOZERO:低于阈值被置为0          3
THRESH_TOZERO_INV:超过阈值被置为0     4
函数有两个返回值,第一个返回值ret是指定的thresh,第二个返回值是阈值化后输出结果,例如threshold(img, 127, 255, 0),就是将图像img进行二值阈值化处理,灰度值小于thresh即127设为0,大于127设为maxval即255。

3.轮廓检测函数

findContours(imgt, mode, method) 
第一个参数imgt是需要处理的原图像(数组),该图像须为二值图像;
第二个参数mode是轮廓检测模式:
cv2.RETR_EXTERNAL:只检测外轮廓
cv2.RETR_LIST:检测的轮廓不建立等级关系
cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层
cv2.RETR_TREE:建立一个等级树结构的轮廓
第三个参数method是轮廓近似方法:
cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain近似算法
该函数有两个返回值,第一个是轮廓本身contours ,还有一个是每条轮廓对应的属性hierarchy(层级关系)。

4.轮廓绘制函数

drawContours(image, contours,contouridx,scalar&color,thickness) 
第一个参数image是需要处理的原图像(数组),输出结果直接更新原图像image;
第二个参数contours为轮廓本身;
第三个参数contouridx指定绘制轮廓中的哪条轮廓,如果是-1,则绘制其中的所有轮廓;
第四个参数为轮廓线颜色(B,G,R);
第五个参数thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。

5.以下代码为分屏实时显示:原始图、灰度图、canny边缘检测图、轮廓检测图。在一个窗口显示时需要图像需为三通道,故利用COLOR_BGR2GRAY将灰度图变为BGR彩色图。

import cv2
import numpy as np
#打开摄像头(只有一个摄像头则编号为0,若有2个则依次为0,1)
camera = cv2.VideoCapture(0)
#创建窗口
cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL)
#持续间隔1ms等待按键,若有按键跳出循环
while (cv2.waitKey(1)==-1):
    #读取摄像头数据并处理,注意需要深拷贝(deep copy)
    success, frame =camera.read()
    original=frame.copy()#原始图
    gray=cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)#转成灰度图
    canny=cv2.Canny(gray, 200, 300) #Canny边缘检测
    ret, imgt= cv2.threshold(gray, 127, 255, 0) #阈值处理
    contours, hierarchy = cv2.findContours(imgt, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #轮廓检测
    cont = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) #将gray转成彩色图像cont
    cv2.drawContours(cont, contours, -1, (0,0,255))#绘制轮廓
    #分屏显示
    h1 = np.hstack((original, cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)))#第一行
    h2 = np.hstack((cv2.cvtColor(canny,cv2.COLOR_GRAY2BGR), cont))#第二行
    vdisp = np.vstack((h1, h2))#纵行
    cv2.imshow('Webcam',vdisp)
#断开摄像头
camera.release()
#释放所有窗口
cv2.destroyAllWindows()

你可能感兴趣的:(Python,opencv)