参考书目:《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()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)