OpenCV-python轮廓提取与模板匹配

算子

'''contours:轮廓信息    hierarchy:层级信息'''
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)

# 这里的第二个参数不是第一是一个集合 所以不用中括号
# -1就是所有轮廓都画  BGR什么颜色的笔
res = cv.drawContours(draw_img, contours, -1, (0, 0, 255), 2)  

# 面积
print(cv.contourArea(cnt))
# 周长
print(cv.arcLength(cnt, True))  # 闭合

# 指定一个对比的值一般都是周长的0.几倍做比较
epsilon = 0.1 * cv.arcLength(cnt1, True)
# 轮廓和指定的值比较 小于阈值就近似直线,大于的话就二分直到小于
approx = cv.approxPolyDP(cnt1, epsilon, True)  

# 用处可能没有特别的大
# 轮廓可以做好多东西 比如外接矩形、圆形等
# 外接矩形
x, y, w, h = cv.boundingRect(cnt1)  # 知道了四个坐标点
res = cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

 水平的图像右侧减去左侧 白到黑就是正数,黑道白就是负数被截断了 所以要abs取绝对值
sobelX = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=3)
sobelX = cv.convertScaleAbs(sobelX)
showbao.cv_show("sobelX", sobelX)
# 竖直的图像下面减去上面 白到黑就是正数,黑道白就是负数被截断了 所以要abs取绝对值
sobelY = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=3)
sobelY = cv.convertScaleAbs(sobelY)
showbao.cv_show("sobelX", sobelY)
# 相加
sobelXY = cv.addWeighted(sobelX, 1, sobelY, 1, 0)

# sobel算子捕捉的信息没有scharr那么多
sobelX = cv.convertScaleAbs(cv.Sobel(img, cv.CV_64F, 1, 0, ksize=3))
sobelY = cv.convertScaleAbs(cv.Sobel(img, cv.CV_64F, 0, 1, ksize=3))
sobelXY = cv.addWeighted(sobelX, 1, sobelY, 1, 0)
# scharr算子能捕捉到更丰富的信息
scharrX = cv.convertScaleAbs(cv.Scharr(img, cv.CV_64F, 1, 0))
scharrY = cv.convertScaleAbs(cv.Scharr(img, cv.CV_64F, 0, 1))
scharrXY = cv.addWeighted(scharrX, 0.5, scharrY, 0.5, 0)
# 捕捉的信息不是那么丰富
laplacian = cv.Laplacian(img, cv.CV_64F)
laplacian = cv.convertScaleAbs(laplacian)

#小的排除掉,一个点的阈值在50-100之间并且连有100以上就留下 大于100留下 也就是说最大值越小检查的就越细
v2 = cv.Canny(img,50,100)

#高斯金字塔
#上采样 金字塔从上往下采样 就是变大
up = cv.pyrUp(img)
#下采样 金字塔从下往上采样 就是变小
down = cv.pyrDown(img)

#拉普拉斯金字塔
down_up = cv.pyrUp(cv.pyrDown(img))
res = img - down_up

#单模板匹配
img = cv.imread("D:/Images/pipeihutao.png", cv.IMREAD_GRAYSCALE)
template = cv.imread("D:/Images/facehutao.png", cv.IMREAD_GRAYSCALE)
h, w = template.shape[:2]

#参数方法
methods = [cv.TM_CCOEFF, cv.TM_CCOEFF_NORMED, cv.TM_CCORR, cv.TM_CCORR_NORMED, cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]
res = cv.matchTemplate(img1, template, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)

 # 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
    if meth in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
        bottom_right = (top_left[0] + w, top_left[1] + h)

   # 画矩形
    cv.rectangle(img2, top_left, bottom_right, 255, 2)
'''匹配多个模板'''
#一定要用cv.TM_CCOEFF_NORMED
res = cv.matchTemplate(img1, template, cv.TM_CCOEFF_NORMED)
threshold = 0.8
# 取匹配程度大于80%的坐标
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):  # *表示可选参数
    bottom_right = (pt[0] + w, pt[1] + h)
    cv.rectangle(img, pt, bottom_right, (0, 0, 255), 2)









你可能感兴趣的:(OpenCV,Python,机器视觉,c++,c语言,开发语言)