我有一个盒子的图像.我正在尝试检测角落并从圆圈标记这些角落.我使用以下代码:
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()
此代码将返回带有圆圈的指向边缘的图像,但您可以看到两个边缘(框背面的边缘)检测不正确.我知道在确定角落时存在一些问题,因为我们只是在绘制角落.任何人都可以指导我在哪里做错了吗?谢谢
我不会说我已经达到了最佳解决方案,但经过相当多的编码后,我能够获得以下内容:
为此,我按照以下步骤操作:
1.首先:获取盒子的边缘
我对灰度图像进行了双边滤波.
使用Canny边缘检测找到边缘.
使用形态膨胀增强边缘.
这是上述结果:
现在,当我进行角落检测时,我一点都不满意:
那我该怎么办?
2.寻找理想的角落
我使用尺寸为9x9的窗口模糊了扩张的图像.
然后将Harris角点检测应用于此模糊图像.
结果我得到了这个:
我知道它并不完美,但它总是可以很好地调整.
以下是角点检测的代码:
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]