三、例程源码
python
import numpy as np
import cv2 as cv
def harris(image):
blockSize = 2
apertureSize = 3
k = 0.04
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
dst = cv.cornerHarris(gray, blockSize, apertureSize, k)
dst_norm = np.empty(dst.shape, dtype=np.float32)
cv.normalize(dst, dst_norm, alpha=0, beta=255, norm_type=cv.NORM_MINMAX)
for i in range(dst_norm.shape[0]):
for j in range(dst_norm.shape[1]):
if int(dst_norm[i, j]) > 120:
cv.circle(image, (j, i), 2, (0, 255, 0), 2)
return image
src = cv.imread("test.jpg")
result = harris(src)
cv.imshow('result', result)
cv.waitKey(0)
cv.destroyAllWindows()
3.1 cornerHarris
函数原型:dst = cv2.cornerHarris(src, blockSize, ksize, k)
参数说明:
- src:输入灰度图像,必须是单通道8位或浮点型
- blockSize:邻域窗口大小,决定在多大区域内寻找角点
- ksize:Sobel算子的核大小,通常设为3
- k:Harris检测方程的自由参数,推荐范围[0.04, 0.06]
返回值:
dst是返回结果,它是一个numpy.ndarray对象,大小和src相同,每一个数组元素对应一个像素点,其值越大,对应像素点是角的概率越大。
3.2 Sobel算子
Sobel算子是一种常用的边缘检测算法,用于计算图像的梯度,以识别图像中的边缘和结构。它通过在空间域上进行卷积运算,有效提取出图像的边缘信息,尤其适合于检测水平和垂直方向的边缘
Sobel算子使用两个3×3的卷积核(也称为滤波器),分别用于检测水平方向和垂直方向的边缘。这两个卷积核如下:

Sobel核的大小,必须是1,3,5或7
3.3 normalize
OpenCV的cv::normalize()函数用于对数组或图像进行归一化处理,支持范围归一化和范数归一化两种模式。归一化选择的数学公式类型有:
- NORM_MINMAX: 数组的数值被平移或缩放到一个指定的范围,线性归一化。
- NORM_INF: 归一化数组的(切比雪夫距离)L∞范数(绝对值的最大值)
- NORM_L1 : 归一化数组的(曼哈顿距离)L1-范数(绝对值的和)
- NORM_L2: 归一化数组的(欧几里德距离)L2-范数
void cv::normalize(InputArray src, InputOutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray())
- src:输入数组或图像。
- dst:输出数组,与src形状一致。
- alpha:归一化目标值或范围下限(范围归一化时为下界)。
- beta:仅在范围归一化时使用,为范围上限。
- norm_type:归一化类型,支持NORM_L1、NORM_L2、NORM_INF、NORM_MINMAX。
- dtype:输出数据类型,若为-1则与输入一致。
- mask:可选掩码,指定感兴趣区域。
3.4 circle
cv::circle() 是 OpenCV 提供的一个函数,用于在图像上绘制圆形。它非常适用于在图像处理任务中标记特定的点或区域。这个函数具有多种参数,允许你根据需要控制圆的颜色、位置、半径和边界厚度。
void cv::circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0)
- img (InputOutputArray):
输入/输出图像。在此图像上绘制圆形。图像可以是灰度图像或彩色图像。 - center (Point): 圆心的坐标,用 cv::Point(x, y) 表示。x 和 y 是圆心的像素坐标。
- radius (int): 圆的半径,以像素为单位。
- color (Scalar):圆的颜色。
对于彩色图像,颜色通过 cv::Scalar(blue, green, red) 定义,注意顺序为 BGR。
对于灰度图像,颜色为单个强度值,如 cv::Scalar(255) 表示白色。 - thickness (int, 默认值 = 1):圆的边界厚度。
如果 thickness 为正数,则表示边界线的厚度。
如果 thickness = FILLED (-1),圆将被填充。 - lineType (int, 默认值 = LINE_8):线条的类型,可以是以下选项之一:
LINE_8:8-connected 线条 (默认值)。
LINE_4:4-connected 线条。
LINE_AA:抗锯齿线条(更平滑的圆)。 - shift (int, 默认值 = 0):圆心坐标和半径的小数位精度(位移)。默认值 0 表示整数精度。