开始写的时候,并不知道怎么开头,内容还是太多,就列了几个问题来自问自答一下,然后想着写一下及代码实现效果好了。
什么是角点和斑点?
常用的检测算法有哪些?
角点检测算法在Pycharm上的实现及在Opencv4.1.0的API详解
实现代码及效果
什么是角点和斑点?
1.角点就是极值点,即在某方面属性特别突出的点。角点是图像中一边物体的拐角或者线条之间的交叉部分,因此,图像(在两个方向)的梯度变化很大,可以用来检测。
2.斑点通常是指与周围有着颜色和灰度差别的区域。斑点是一个区域,斑点检测的主要思路都是检测出图像中比它周围像素灰度值大或比周围灰度值小的区域,所以它比角点的噪能力要强,稳定性要好。
常用的检测算法有哪些?
OpenCV中常用的特征检测和提取算法有如下六种:
(1)Harris:用于检测角点;
(2)SIFT:用于检测斑点;
(3)SURF:用于检测斑点;
(4)FAST:用于检测角点;
(5)BRIEF:用于检测斑点;
(6)ORB:表示带方向的FAST算法与具有旋转不变性的BRIEF算法;
这个是参考http://www.yyearth.com/index.php?aid=233
角点检测算法在Pycharm上的实现及在Opencv4.1.0的API详解
目前的角点检测算法可归纳为3类:基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。
开发环境:Windows上Pycharm
1.Harris:用于检测角点
Python:
dst = cv.cornerHarris( src, blockSize, ksize, k[, dst[, borderType]] )
Parameters
src Input single-channel 8-bit or floating-point image.(输入8位图或者浮点图)
dst Image to store the Harris detector responses. It has the type CV_32FC1 and the same size as src .(存储Harris检测结果的输出图像)
blockSize Neighborhood size. (领域大小)
ksize Aperture parameter for the Sobel operator.(Sobel求导中使用的窗口大小)
k Harris detector free parameter. See the formula above.(Harris 角点检测方程中的自由参数,取值参数为 [0.04,0.06].)
borderType Pixel extrapolation method. See BorderTypes.(边界的类型)
实例1:
import cv2
import numpy as np
import glob
images = glob.glob(r’C:/Users/admin/Desktop/python_test/?.jfif’)
for fname in images:
img = cv2.imread(fname)
#转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#数据类型变成float32
gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
#膨胀 提升后续图像角点标注的清晰准确度
dst = cv2.dilate(dst, None)
#这么多返回是满足条件的dst索引值 根据索引值来设置这个点的颜色
#参考https://cloud.tencent.com/developer/article/1149963
img[dst > 0.01 * dst.max()] = [0, 0, 255]
#显示图片
cv2.imshow(‘dst’, img)
#表示图片停留的时间, 0表示按任意键退出
if cv2.waitKey(0) & 0xff == 27:
cv2.destroyAllWindows()
实例1输入图片
程序运行输出
浅谈OpenCV之角点检测的点点滴滴
实例1输出图片
2.Shi-Tomasi 角点检测 goodFeaturesToTrack()
函数原型可以看OpenCV手册https://docs.opencv.org/4.1.0/dd/d1a/group__imgproc__feature.html#ga1d6bb77486c8f92d79c8793ad995d541
Python:
corners = cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]] )
corners = cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance, mask, blockSize, gradientSize[, corners[, useHarrisDetector[, k]]] )
参数详解:
第一个参数image:8位或32位单通道灰度图像;
第二个参数corners:位置点向量,保存的是检测到的角点的坐标;
第三个参数maxCorners:定义可以检测到的角点的数量的最大值;
第四个参数qualityLevel:检测到的角点的质量等级,角点特征值小于qualityLevel*最大特征值的点将被舍弃;
第五个参数minDistance:两个角点间最小间距,以像素为单位;
第六个参数mask:指定检测区域,若检测整幅图像,mask置为空Mat();
第七个参数blockSize:计算协方差矩阵时窗口大小;
第八个参数useHarrisDetector:是否使用Harris角点检测,为false,则使用Shi-Tomasi算子;
第九个参数k:留给Harris角点检测算子用的中间参数,一般取经验值0.04~0.06。第八个参数为false时,该参数不起作用;
注1:
numpy中的ravel()、flatten()、squeeze()都有将多维数组转换为一维数组的功能,区别:
ravel():如果没有必要,不会产生源数据的副本
flatten():返回源数据的副本
squeeze():只能对维数为1的维度降维
注2:
cv2.line()//画线,
cv2.circle()//画圆,
cv2.rectangle()//长方形,
cv2.ellipse()//椭圆,
cv2.putText()//文字绘制
实例2:
import cv2
import numpy as np
import glob
images = glob.glob(r’C:/Users/admin/Desktop/python_test/1.jpg’)
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
corners = cv2.goodFeaturesToTrack(gray, 500, 0.01, 10, None, None, 3, False, 0.04)
#corners = cv2.goodFeaturesToTrack(gray, 500, 0.01, 10)
corners = np.int0(corners)
print(len(corners))
for i in corners:
x, y = i.ravel()
cv2.circle(img, (x, y), 3, 255, -1)
cv2.namedWindow(‘img’ ,cv2.WINDOW_AUTOSIZE)
cv2.imshow(‘img’ ,img)
cv2.waitKey(0)
程序运行输出: