本节关键函数
-
高斯滤波函数:输入图像 滤波核 水平标准差 输出图像 垂直标准差 边界样式
cv2. GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None) -
边缘检测函数:输入图像 阈值1 阈值2
cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)
得到的是反映边缘位置的二值图,通过根据像素间的差异检测出轮廓边界的像素,但是它并没有将轮廓作为一个整体。 -
轮廓检测函数:图像 检测模式 检测方法
findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
contours:返回的轮廓
hierarchy:每条轮廓对应的属性
cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图。 -
轮廓面积
cv2.contourArea(contour, oriented=None) -
绘制轮廓:在哪幅图上绘制 轮廓本身 绘制轮廓l中的哪条 颜色 轮廓线宽度
drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
contourIdx如果是-1,则绘制其中的所有轮廓。
thickness如果是-1(cv2.FILLED),则为填充模式 -
计算轮廓弧长(周长): 输入的向量 标识曲线是否封闭
cv2.arcLength(curve, closed) -
把一个连续光滑曲线折线化: 输入曲线 距离阈值 是否闭合 输出折线
cv2. approxPolyDP(curve, epsilon, closed, approxCurve=None)
函数返回值是以该多边形的顶点坐标为对象的列表 -
获取图像的最小矩形边框信息的函数:img为一个二值图
cv2.boundingRect(img)
函数返回四个参数,矩形左上角坐标x,y,矩形的宽w和高h -
绘制矩形框的函数:要操作的图 左上角坐标 右下角坐标 绘制颜色 线的宽度
cv2,rectangle(img, (x,y),(x+w,y+h), color, thickness=None, lineType=None, shift=None) -
在图像中某一位置显示文字:要操作的图 要显示的文字 显示位置的左下角坐标 字体类型 字体大小 字体颜色 字体的粗细
putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
lineType – 线性.
bottomLeftOrigin – true, 图像数据原点在左下角. Otherwise, 图像数据原点在左上角.
边缘检测
import cv2
import numpy as np
path='E:/graduatedata/code/OpencvPython/Resources/shapes.png'
img=cv2.resize(cv2.imread(path),(300,300))
# 首先转换为灰度图 然后检测边缘 找到角点
# 灰度图
imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 高斯模糊函数 灰度图 滤波核大小 sigma
imgBlur=cv2.GaussianBlur(imgGray,(7,7),1)
# 边缘检测
imgCanny=cv2.Canny(imgBlur,50,50)
cv2.imshow("Original",img)
cv2.imshow("Gray",imgGray)
cv2.imshow("Blur",imgBlur)
cv2.imshow("Canny",imgCanny)
cv2.waitKey(0)
图像边缘非常容易受到噪声的干扰,因此为了避免检测到错误的边缘信息,通常需要对图像进行滤波以去除噪声,滤波的目的是平滑一些纹理较弱的非边缘区域,以便得到更准确的边缘。
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
形状检测
import cv2
import numpy as np
#创建获取轮廓的函数 图像面积aera 轮廓弧长peri 角点坐标approx 点的数量(判断是几边形)len(approx)
def getContours(img):
contours,hierarchy=cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area=cv2.contourArea(cnt)
#print(area)
if area>500:
cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)
peri=cv2.arcLength(cnt,True)
#print(peri)
approx=cv2.approxPolyDP(cnt,0.02*peri,True)
#print(approx)
print(len(approx))
objCor=len(approx)
x,y,w,h=cv2.boundingRect(approx)
if objCor==3:objectType="Tri"
elif objCor==4:
aspRatio=w/float(h)
if aspRatio>0.95 and aspRatio<1.05:objectType="Square"
else:objectType="Redtangle"
elif objCor>4:objectType="Circles"
else:objectType="None"
cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,255,0),2)
cv2.putText(imgContour,objectType,(x+(w//2)-10,y+(h//2)-10),cv2.FONT_HERSHEY_COMPLEX,0.4,(0,0,0),1)
path='E:/graduatedata/code/OpencvPython/Resources/shapes.png'
img=cv2.imread(path)
# 原始图像的脚本
imgContour=img.copy()
# 首先转换为灰度图 -> 检测边缘 -> 找角点
# 灰度图
imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 高斯模糊函数 : 灰度图 滤波核大小 sigma值
imgBlur=cv2.GaussianBlur(imgGray,(7,7),1)
# 边缘检测
imgCanny=cv2.Canny(imgBlur,50,50)
#调用函数
getContours(imgCanny)
cv2.imshow("Contour",imgContour)
cv2.waitKey(0)