Title
2020

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

 

posted @ 2021-08-03 17:55  俗了清风  阅读(599)  评论(0编辑  收藏  举报
Title