Corner detection in Image processing Opencv Python

余生长醉 提交于 2019-12-04 13:41:24

问题


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


回答1:


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

  • I performed bilateral filtering on the grayscale image.
  • Found the edges using Canny edge detection.
  • Enhanced the edges using morphological dilation.

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

  • I blurred the dilated image using a window of size 9x9.
  • Then applied Harris corner detection to this blurred image.

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]



回答2:


@Jeru Luke. Why not Harriscornering based on the result data from your step1?

  1. I performed bilateral filtering on the grayscale image.
  2. Found the edges using Canny edge detection.
  3. Enhanced the edges using morphological dilation.

If you do that the painting on the corners would be neat and fit within the lines, right?



来源:https://stackoverflow.com/questions/41681695/corner-detection-in-image-processing-opencv-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!