1. Harris Corner Detector Algorithm
2. SIFT
Harris Corner Response Function
R > 0, λ1, λ2 large
1.Compute horizontal and vertical derivatives of the image (convolve with derivative of Gaussians)
2.Compute outer products of gradients M
3.Convolve with larger Gaussian
4.Compute scalar interest measure R
Harris Detector Algorithm(Preview)
-compute Gaussian derivatives at each pixel
-compute second moment matrix M in a Gaussian window around each pixel
-compute corner response function R
-Threshold R
-Find local maxima of response function(non-maximum suppression)
"""Haris Cornaer Detection""" import numpy as np import cv2 def find_corners(img): """Find corners in an image using Harris corner detection method.""" img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if len(img.shape) == 3 else img h_response = cv2.cornerHarris(img_gray, 2, 3, 0.04) h_min, h_max, _, _ = cv2.minMaxLoc(h_response) cv2.imshow("Harris response", np.uint8((h_response - h_mimn) * (255.0 / (h_max - h_min)))) h_thresh = 0.01 * h_max _, h_selected = cv2.threshold(h_response, 1, cv2.THRESH_TOZERO) nhood_size = 5 nhood_r = int(nhood_size / 2) corners = [] for y in xrange(h_selected.shape[0]): for x in xrange(h_selected.shape[1]): h_value = h_selected.item(y, x) nhood = h_selected[(y - nhood_r):(y + nhood_r + 1),(x - nhood_r):(x + nhood_r + 1)] if not nhood.size: continue local_max = np.amax(nhood) if h_value == local_max: corners.append((x, y, h_value)) h_selected[(y - nhood_r):(y + nhood_r),(x- nhood_r):(x + nhood_r)] = 0 h_selected.itemset((y,x), h_value) h_suppressed = np.uint8((h_selected - h_thresh) * (255.0/ (h_max - h_thresh))) cv2.imshow("Suppressed Harris response", h_suppressed) return corners def test(): """Test find_corners() with sample imput. """ # Read image img = cv2.imread("octagon.png") cv2.imshow("image", img) corners = find_corners(img) print "\n".join("{}{}".format(corner[0], corner[1]) for corner in corners) img_out = img.copy() for (x, y, resp) in corners: cv2.circle(img_out, (x, y), 1, (0, 0, 255), -1) cv2.circle(img_out, (x, y), 5, (0, 255, 0), 1) cv2.imshow("Output", img_out)