当前位置: 首页 > 知识库问答 >
问题:

图像处理中的角点检测OpenCV Python

锺星腾
2023-03-14

我有一个盒子的图像。我试图检测角点并从圆圈中标记这些角点。我正在为此使用以下代码:

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()

共有2个答案

顾跃
2023-03-14

@杰鲁·卢克。为什么Harriscornering不基于step1的结果数据呢?

  1. 我对灰度图像进行了双边过滤。
  2. 使用Canny边缘检测找到边缘。
  3. 使用形态扩张增强了边缘。

如果你这样做的话,画在角落里的画会很整齐,并且符合线条,对吗?

昝光临
2023-03-14

我不能说我已经找到了最好的解决方案,但经过大量编码后,我能够获得以下结果:

为了获得这一点,我遵循以下步骤:

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]
 类似资料:
  • 本文向大家介绍C#图像处理之头发检测的方法,包括了C#图像处理之头发检测的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#图像处理之头发检测的方法。分享给大家供大家参考。具体如下: 结果图像效果: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C#图像处理之边缘检测(Smoothed)的方法,包括了C#图像处理之边缘检测(Smoothed)的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#图像处理之边缘检测(Smoothed)的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C#图像处理之边缘检测(Sobel)的方法,包括了C#图像处理之边缘检测(Sobel)的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#图像处理之边缘检测(Sobel)的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 目标 在这一章中, 我们将会理解 Harris 角点检测背后的概念 我们会了解 cv2.cornerHarris() 和 cv2.cornerSubPix() 函数的使用方法 理论基础 上一章中,我们已经看到边角是在图像中各个方向上亮度都变化非常大的区域。试图找到这些边角的一个早期尝试由 Chris Harris 和 Mike Stephens 在它们1988年的的论文《A Combined Co

  • 问题内容: 我有以下几点: 背景图片(双) 图像1(i1) 图像3(i2) 我想将i1和i2以一定角度放置在bi上,然后生成最终图像。我有i1和i2的x和y轴值及其预期的旋转角度。i1和i2可能部分重叠。但是我知道i1和i2的z索引,如果它们重叠,那么谁将在前景。 我正在努力在Golang中实现这一目标。 http://golang.org/doc/articles/image_draw.html

  • 本文向大家介绍Python OpenCV处理图像之图像像素点操作,包括了Python OpenCV处理图像之图像像素点操作的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python OpenCV图像像素点操作的具体代码,供大家参考,具体内容如下 0x01. 像素 有两种直接操作图片像素点的方法: 第一种办法就是将一张图片看成一个多维的list,例如对于一张图片im,想要操作第四行第