计算机视觉基础21---角检测

计算机视觉基础21---角检测,第1张

参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。



# 图像的特征:图像中具有独特性和易于识别性的区域,如:角、边缘;

# 角检测:
# 角是两条边的交点,可称为角点或拐角,是图像中各个方向上强度变化最大的区域;

# 1.哈里斯角检测
# 语法格式:dst = cv2.cornerHarris(src, blockSize, ksize, k)
# 参数说明:
# a.dst:返回结果,一个numpy.ndarray对象,大小和src相同,每一个数组元素对应一个像素点,值越大,对应像素点是角的概率越高;
# b.src:8位单通道或浮点值图像;
# c.blockSize:邻域大小,值越大,检测出的角占的区域越大;
# d.ksize:哈里斯角检测器使用的Sobel算子的中孔参数;
# e.k:哈里斯角检测器的自由参数;ksize和k影响检测的敏感度,值越小,检测出的角越多,但准确率越低;
import cv2 as cv
import numpy as np

img1 = cv.imread("shapes2.JPG")
cv.imshow("original", img1)

gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray, 15, 7, 0.01)

# 将检测结果中值大于"最大值 * 0.02"对应的像素设置为蓝色
img1[dst > 0.02 * dst.max()] = [255, 0, 0]

cv.imshow("dst", img1)
cv.waitKey(0)

# 2.优化哈里斯角
# 语法格式:dst = cv2.cornerSubPix(src, corners, winSize, zeroZone, criteria)
# 参数说明:
# a.dst:返回结果,存储优化后的角信息;
# b.src:8位单通道或浮点值图像;
# c.corners:哈里斯角的质心坐标;
# d.winSize:搜索窗口边长的一半;
# e.zeroZone:零值边长的一半;
# f.criteria:优化查找的终止条件;
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img1 = cv.imread("shapes2.JPG")
gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray, 8, 7, 0.04)
r, dst = cv.threshold(dst, 0.01 * dst.max(), 255, 0)
dst = np.uint8(dst)
r, l, s, cxys = cv.connectedComponentsWithStats(dst)    # 查找质点坐标
cif = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 100, 0.01)  # 定义优化查找条件
corners = cv.cornerSubPix(gray, np.float32(cxys), (5, 5), (-1, -1), cif)  # 执行优化查找
res = np.hstack((cxys, corners))  # 堆叠构造新数组,便于标注角
res = np.int0(res)

img1[res[:, 1], res[:, 0]] = [0, 0, 255]  # 将哈里斯角对应像素设置为红色
img1[res[:, 3], res[:, 2]] = [0, 255, 0]  # 将优化结果像素设置为绿色
img1 = cv.cvtColor(img1, cv.COLOR_BGR2RGB)

plt.imshow(img1)
plt.axis("off")
plt.show()

# 3.Shi-Tomasi角检测
# 语法格式:dst = cv2.goodFeaturesToTrack(src, maxCorners, qualityLevel, minDistance)
# 参数说明:
# a.dst:返回结果,保存了检测到的角在原图像中的坐标;
# b.src:8位单通道或浮点值图像;
# c.maxCorners:返回的角的最大数量;
# d.qualityLevel:可接受的角的最低质量;
# e.minDistance:返回的角之间的最小欧几里得距离;
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img1 = cv.imread("shapes2.JPG")
gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
corners = cv.goodFeaturesToTrack(gray, 10, 0.1, 100)
corners = np.int0(corners)

for i in corners:
    x, y = i.ravel()
    cv.circle(img1, (x, y), 4, (0, 0, 255), -1)

img1 = cv.cvtColor(img1, cv.COLOR_BGR2RGB)

plt.imshow(img1)
plt.axis("off")
plt.show()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/785903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存