Revision 3c90f44207fd7407b961cdb816446f89f84a2028 (click the page title to view the current version)
Corner Detection
Briefing
Corners and Feature Points
Differentiation
Harris Feature Detector
Exercises
Setup
We will use scipy for a small part of the exercises, if you haven’t already, run ‘pip install scipy’.
We need an image to work with, you can either load an image from disk or capture a new image from the webcam with the below code.
# Imports
import cv2 as cv
# Capture a single frame
vid = cv.VideoCapture(0)
image = None
# Capture frames until we click the space button, use that image
while True:
_, frame = vid.read()
# Display the resulting frame
cv.imshow("frame", frame)
# Click space to capture frame
k = cv.waitKey(1)
if k % 256 == 32:
# SPACE pressed
image = frame
break
# After the loop release the cap object
vid.release()
# Destroy all the windows
cv.destroyAllWindows()
As we will be working with a lot of different images in this exercise, it is recommended to save it to disk, we can do that with
# Imports
from pathlib import Path
# First we create a path to an images directory
p = Path.cwd() / "images" # <--- current working directory + /images
if not p.is_dir():
p.mkdir()
# Then we save the image to the directory with name "frame.jpg"
cv.imwrite(str(p / "frame.jpg"), image)
Now we convert the image to gray-scale
# Convert frame to grayscale
image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# Save gray to images
cv.imwrite(str((p / "gray.jpg")), image_gray)
Exercise 1
The first exercise is to implement a Sobel-filter. Recall from the theory that we need to implement two 3x3 kernels to convolve with the original image.
This can be done using scipy.signal.convolve2d ( https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve2d.html )
(Note: For a larger challenge you can also try implementing your own algorithm for the convolve function using numpy)
Hint (Click to expand)
Note: Use signal.convolve2d(/Code answers from here on will be collapsed, we recommend that you try to implement them yourself before reading an answer.
Answer (Click to expand)
You should then show the images using cv.imshow or save using cv.imwrite, as we did earlier Discuss what you see.
You can compare the results of your implementation with the built in function cv.Sobel
grad_x_cv = cv.Sobel(image_gray, cv.CV_64F, 1, 0, ksize=3) # gradient along x axis,
grad_y_cv = cv.Sobel(image_gray, cv.CV_64F, 0, 1, ksize=3) # gradient along y axis,