I have an image of the box. I am trying to detect corners and mark those corner from circles. I am using the following code for this:
import cv2
import numpy as np
img_file = 'Image.jpg'
img = cv2.imread(img_file, cv2.IMREAD_COLOR)
imgDim = img.shape
dimA = imgDim[0]
dimB = imgDim[1]
# RGB to Gray scale conversion
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
# Noise removal with iterative bilateral filter(removes noise while preserving edges)
noise_removal = cv2.bilateralFilter(img_gray,9,75,75)
# Thresholding the image
ret,thresh_image = cv2.threshold(noise_removal,220,255,cv2.THRESH_OTSU)
th = cv2.adaptiveThreshold(noise_removal, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
# Applying Canny Edge detection
canny_image = cv2.Canny(th,250,255)
canny_image = cv2.convertScaleAbs(canny_image)
# dilation to strengthen the edges
kernel = np.ones((3,3), np.uint8)
# Creating the kernel for dilation
dilated_image = cv2.dilate(canny_image,kernel,iterations=1)
np.set_printoptions(threshold=np.nan)
_, contours, h = cv2.findContours(dilated_image, 1, 2)
contours= sorted(contours, key = cv2.contourArea, reverse = True)[:1]
corners = cv2.goodFeaturesToTrack(thresh_image,6,0.06,25)
corners = np.float32(corners)
for item in corners:
x,y = item[0]
cv2.circle(img,(x,y),10,255,-1)
cv2.namedWindow("Corners", cv2.WINDOW_NORMAL)
cv2.imshow("Corners",img)
cv2.waitKey()
This code will return my image with pointing edges with circles but you can see that two edges (edges at the back of the box) are detected incorrectly. I know there is some problem in determining the corners because here we are just plotting the corners. Can anyone guide me where I am doing it wrong ? Thanks
Corner detection works on the principle that if you place a small window over an image, if that window is placed on a corner then if it is moved in any direction there will be a large change in intensity.
To detect the corners of objects in an image, one can start by detecting edges then determining where two edges meet. There are however other methods, among which: the Moravec detector [Moravec 1980], the Harris detector [Harris & Stephens 1988].
Corner detection is an approach used within computer vision systems to extract certain kinds of features and infer the contents of an image. Corner detection is frequently used in motion detection, image registration, video tracking, image mosaicing, panorama stitching, 3D reconstruction and object recognition.
I wouldn't say I have reached the best solution, but after quite a lot of coding I was able to obtain the following:
To obtain this I followed the following steps:
1. First: Obtain the edges of the box
This is the result of the above:
Now when I did Corner detection, I was not at all satisfied:
So what did I do?
2. Finding desired corners
As a result I was able to obtain this:
I know it is not perfect but it can always be fine tuned.
Here is the code for corner detection:
dst = cv2.cornerHarris(dilate,2,3,0.04)
#----result is dilated for marking the corners, not important-------------
dst = cv2.dilate(dst,None)
#----Threshold for an optimal value, it may vary depending on the image---
img[dst>0.01*dst.max()]=[0,0,255]
@Jeru Luke. Why not Harriscornering based on the result data from your step1?
- I performed bilateral filtering on the grayscale image.
- Found the edges using Canny edge detection.
- Enhanced the edges using morphological dilation.
If you do that the painting on the corners would be neat and fit within the lines, right?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With