Corner detection with Harris Corner Detection method using OpenCV
The Harris corner detection algorithm
The Harris corner detection method is a popular algorithm for detecting corners in an image. It works by calculating the second-order partial derivatives of the image intensity at each pixel and detecting local maxima in the resulting matrix. These local maxima correspond to corners in the image.
The Harris corner detection method can be described mathematically as follows:
- Compute the gradient of the image using a finite difference method or a gradient operator such as the Sobel operator.
- Compute the structure tensor, which is a matrix that describes the local image structure at each pixel. This is done by multiplying the gradient vector at each pixel by its transpose.
- Compute the corner response function, which is a measure of the cornerness at each pixel. This is done by taking the determinant of the structure tensor and dividing it by the trace of the structure tensor.
- Threshold the corner response function to eliminate low-response pixels and suppress false positives.
- Non-maximum suppression to eliminate redundant corners.
The Harris corner detection method has some advantages over other corner detection methods, such as the Shi-Tomasi corner detector. It is more robust to noise and can detect corners even in the presence of large intensity variations. However, it can be sensitive to parameter selection and can be slower to compute than some other methods.
Corner detection with Harris Corner Detection
Here's an example of how you could use the Harris corner detection method in OpenCV:import cv2
import numpy as np
# Load the image
image = cv2.imread('image.jpg')
# Convert the image to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Compute the Harris corner map
harris_corner_map = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
# Threshold the corner map
threshold = 0.1*harris_corner_map.max()
harris_corner_map[harris_corner_map < threshold] = 0
# Dilate the corner map to make the corners more prominent
kernel = np.ones((5,5), np.uint8)
harris_corner_map = cv2.dilate(harris_corner_map, kernel, iterations=1)
# Overlay the corner map on the original image
image[harris_corner_map > 0] = [0, 0, 255]
# Show the image
cv2.imshow('Harris corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
This code will load an image, convert it to grayscale, and then use the cv2.cornerHarris()
function to compute the Harris corner map. The blockSize
and ksize
parameters control the size of the neighborhood used to compute the corner map, and the k
parameter controls the sensitivity of the detector.
Next, the code threshold the corner map and dilates it to make the corners more prominent. Finally, it overlays the corner map on the original image, highlighting the corners with red pixels.
I hope this helps!
Leave a Comment