CV2 之 轮廓检测
cv2.Canny(src,min,max)
contours,hierarchy=cv2.findCountours(img,mode,method)
#由于opencv版本原因,返回值由三个值(binary,contours,hierarchy)变成两个值
mode:轮廓检索模式
RETR_EXTERNAL:只检索外面的轮廓
RETR_LIST:检索所有的轮廓,并将其保存到一条链表中
RETR_COOMP:检索所有的轮廓,并将它们组织为两层,顶层是各部分的外部边界,第二层是空间的边界
RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次
method:轮廓逼近方法
CHAIN_APPROX_NONE:以Freeman链码的方法输出轮廓,所有其他方法输出多边形(顶点的序列)
CHAIN_APPROR_SIMPLE:压缩水平的,垂直的和斜的部分,也就是,函数只保留他们的终点部分
模板匹配
模板匹配与卷积原理很像,模板在源图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度在opencv里有六种,然后将每次计算的结果放入一个矩阵里,作为结果输出,假如原图像是A*B大小,而模板是a*b大小,则输出结果的矩阵是(A-a+1)*(B-b—+1)大小
img = cv2.imread('lena.jpg',0) #读入灰度图片
template = cv2.imread('face.jpg',0)
h,w = template.shape[:2]
res = cv2.matchTemplate(img,template,1) #1等价于TM_SQDIFF
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
methods = {'cv2.TM_CCOEFF','CV2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TMSQDIFF_NORMED'}
for meth in methods:
img2 = img,copy()
#匹配方法的真值
methd = eval(meth)
print(method)
res = cv2.matchTemplate(img,template,method)
min_val,max_val,min_loc,max_lac = cv2.minMaxLoc(res)
#如果是平方差匹配TM_SQDIFF或者归一化平方差匹配TM_SQDIFF_NORMED,取最小值
if method im [cv2.TM_SQDIFF,cv2.SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0]+top_left[1]+h)
#画矩形
cv2.rectangle(img,top_left,bottom_right,255,2)
plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.xticks([])
plt.yticks([])#隐藏坐标轴
plt.subtitle(meth)
plt.show()
TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
TM_CCORR:计算相关性,计算出来的值越大,越相关
TM_CCOEFF:计算相关系数,计算出来的值越大,越想关
TM_SQDIFF_NORMED:计算归一平方不同,计算出来的结果越接近0,越相关
TM_CCORR_NORMED:计算归一化相关性,计算出来的结果越接近1,越相关
TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的结果越接近1,越相关
x,y,w,h = cv2.boundingRect(img)
img 是一个二值图
返回四个值,x,y,w,h,
x,y是左上角的坐标,w,h是矩形宽和高
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
img是原图
(x,y)是矩阵左上角的坐标
(x+w,y+h)是矩形右下角坐标
(0,255,0)是画线对应的rgb颜色
2是线宽
这里参考文章cv2.imread(filename, flags)
cv2.imread(filename, flags)
参数:
filepath:读入imge的完整路径
flags:标志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED}
cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可用1作为实参替代
cv2.IMREAD_GRAYSCALE:读入灰度图片,可用0作为实参替代
cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道,可用-1作为实参替代
PS:alpha通道,又称A通道,是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度复信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明
参考链接:https://blog.csdn.net/weixin_44015965/article/details/109547129