import cv2 as cv
import numpy as np
# 图像金字塔(下采样--缩小;上采样--放大)
'''
img_up = cv.pyrUp(img) # 1.将图像与高斯内核卷积;2.将所有偶数行和列去掉
img_down = cv.pyrDown(img) # 1.将原图每个方向扩为原先两倍,用零填充;2.将放大后图像与高斯内核卷积,获得近似值
'''
# 拉普拉斯金字塔(滤波--缩小尺寸--放大尺寸--原图与新图相减)
'''
down = cv.pyrDown(img)
down_up = cv.pyrUp(down)
l_1 = img - down_up
'''
# 图像轮廓(为提高准确率,建议使用二值图像)
'''
# model参数(检测轮廓的方法)--cv.RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次
# method参数(表示轮廓的方法)--cv.CHAIN_APPROX_NONE:把轮廓上的所有点储存;cv.CHAIN_APPROX_SIMPLE:只存储水平,垂直,对角直线的起始点
binary, contours, hierarchy = cv.findContours(img, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) # contours:检测到的轮廓;hierarchy:各个轮廓的继承关系
draw_img = img.copy() # 注意copy,否则原图会变
res = cv.drawContours(draw_img, contours, -1, (0, 0, 255), 2) # 绘制图像,轮廓,轮廓索引,线条颜色,线条宽度
'''
# 轮廓特征
'''
cnt = contours[0]
cv.contourArea(cnt) # 面积
cv.arcLength(cnt, True) # 周长,True表示闭合的
'''
# 轮廓近似
'''
cnt = contours[0]
epsilon = 0.05 * cv.arcLength(cnt, True) # 通常间隔阈值是通过周长的百分比进行比较
approx = cv.approxPolyDP(cnt, epsilon, True) # 轮廓近似
draw_img = img.copy() # 注意copy,否则原图会变
res = cv.drawContours(draw_img, [approx], -1, (0, 0, 255), 2) # 绘制图像,轮廓,轮廓索引,线条颜色,线条宽度
'''
# 边界矩形
'''
x, y, w, h = cv.boundingRect(cnt) # 对边界计算外接矩形
img = cv.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
'''
# 外接圆
'''
(x, y), radius = cv.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
img = cv.circle(img, center, radius, (0, 255, 0), 2)
'''
# 模板匹配
'''
# cv.TM_SQDIFF_NORMED--计算归一化平方不同越接近0,越相关
# cv.TM_CCORR_NORMED--计算归一化相关性,越接近1,越相关
# cv.TM_CCOEFF_NORMED--计算归一化相关系数,越接近1,越相关
res = cv.matchTemplate(img, template, cv.TM_SQDIFF_NORMED) # res的shape值为(原图-模板+1)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res) # 根据计算方法,选择左上角坐标(min_loc或max_loc)
bottom_right = min_loc[0]+template.shape[1], min_loc[1]+template.shape[0]
# 多模板匹配
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
bottom_right = pt[0]+template.shape[1], pt[1]+template.shape[0]
cv.rectangle(img, pt, bottom_right, (0, 0, 255), 2)
'''
opencv基础教程(唐宇迪)--03
最新推荐文章于 2023-03-30 15:12:42 发布