计算机视觉基础
- 针孔相机模型
- 透视投影
- 相机校准
- 立体视觉、对极几何和三角测量
- 运动和光流的结构
理想情况下,点特征检测器应该对旋转、缩放、强度的线性变化和仿射变换保持不变。
角点特征检测器对缩放(角度可以只是一个面/边缘)和仿射变换(扭曲角点附近的图像变换可以改变对“角度”的反应)不是一成不变的。
哈里斯探测器:
Harris 检测器的工作原理如下:
图像以灰度拍摄,每个像素的强度使用以下公式计算:
I = 0.299R + 0.587G + 0.114B
此外,还考虑了某个窗口 w (x, y) 内强度的变化(u 沿 x 的位移,v 沿 y 的位移)。

w (x, y) - 点 x, y 处的窗口。
I (x, y) - x, y 点的强度。
I (x + u, y + v) - 移动窗口中的强度(求和是在 x, y 上进行的)。
由于我们正在寻找带角的窗户,因此我们对强度变化很大的窗户感兴趣。 因此,我们必须最大化上述方程,公式:

将其展开为泰勒级数,我们得到:

展开括号里的,得到:

让我们用符号代替:

那么上面的表达式将会变成这样:

为每个窗口计算使用以下公式计算的分数,以确定它是否可以包含一个角度:
R = det (M) −k (trace (M)) 2
其中 det (M) = λ1λ2
轨迹 (M) = λ1 + λ2,k是任意参数,R值大于某个值的窗口被认为是包含角点的窗口。
在 Python 中的 OpenCV 中的实现:
mport cv2 as cv
import numpy as np
import argparse
max_thresh = 255 #最大阈值
def cornerHarris(val):
thresh = val
# 探测器参数
blockSize = 2
apertureSize = 3
k = 0.04
# 角点检测
dst = cv.cornerHarris(src_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)
dst_norm_scaled = cv.convertScaleAbs(dst_norm)
# 用圆圈标出角
for i in range(dst_norm.shape[0]):
for j in range(dst_norm.shape[1]):
if int(dst_norm[i,j]) > thresh:
cv.circle(dst_norm_scaled, (j,i), 5, (0), 2)
cv.namedWindow('Corners detected')
cv.imshow('Corners detected', dst_norm_scaled)
# 加载图像并将其转换为灰度
parser = argparse.ArgumentParser(description='Code for Harris corner detector')
parser.add_argument('--input', help='Path to input image.', default='building.jpg')
args = parser.parse_args()
src = cv.imread(cv.samples.findFile(args.input))
if src is None:
print('Could not open or find the image:', args.input)
exit(0)
src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.namedWindow('Source image')
thresh = 200 # 初始阈值
cv.createTrackbar('Threshold: ', source_window, thresh, max_thresh, cornerHarris)
cv.imshow('Source image', src)
cornerHarris(thresh)
cv.waitKey()
版权声明:本文为lesl551原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。