Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测image-OpenCV-Python中的特定角点_Python_Opencv_Image Processing - Fatal编程技术网

检测image-OpenCV-Python中的特定角点

检测image-OpenCV-Python中的特定角点,python,opencv,image-processing,Python,Opencv,Image Processing,我刚使用OpenCV,在检测图像中的角点时遇到问题。假设我有一个像这样的图像网格,其中有多个角 我只想抓住4个极端的角落,用红色突出显示 使用cv2.cornerHarris()我成功地突出显示了所有可能的角点,但我找不到调整这些值的方法,只保留了4个极端 这是我的代码: import cv2 import numpy as np filename = 'start.jpg' img = cv2.imread(filename) gray = cv2.cvtColor(img,cv2.COL

我刚使用OpenCV,在检测图像中的角点时遇到问题。假设我有一个像这样的图像网格,其中有多个角

我只想抓住4个极端的角落,用红色突出显示

使用
cv2.cornerHarris()
我成功地突出显示了所有可能的角点,但我找不到调整这些值的方法,只保留了4个极端

这是我的代码:

import cv2
import numpy as np

filename = 'start.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,29,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]

cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()
我从OpenCV官方网站上获得了这段代码,并调整了一些值

有人能帮忙吗?我是不是完全错了?如果我还不清楚我想要的是我在问题中附加的输出图像,而我的代码只是给我网格中所有可能的角落

栅格不从坐标x开始,y=0,0


提前感谢各位

如果网格在图像中处于一般位置,则没有简单的解决方案。根据图像本身的质量,哈里斯滤波器甚至可能检测不到栅格极值角点。对于健壮的解决方案,您需要显式地对检测到的角点图的拓扑进行建模(即,找出哪个角点与网格中的哪个角点相邻)。这是一个如何在棋盘格中实现的示例


对于鲁棒性稍差的解决方案,您可以计算检测到的角点分布的凸包,然后为其拟合4条线。线的交点将产生极值角。

我有另一个使用等高线的解决方案

  • 将图像转换为灰度
  • 获取二值图像
  • 执行形态闭合操作
  • 找到外部存在的轮廓

    contours,hierarchy=cv2.findContours(th,cv2.RETR\u EXTERNAL,cv2.CHAIN\u APPROX\u SIMPLE)

  • 获取此轮廓周围的边框。您将获得该矩形的坐标,即网格的角

    cnts=轮廓[0]
    x、 y,w,h=cv2.boundingRect(cnts)

  • 在网格上画那些角

    cv2.圆(im,(x,y),3,(0,0255),-1)
    cv2.圆(im,(x+w,y),3,(0,0255),-1)
    cv2.圆(im,(x+w,y+h),3,(0,0255),-1)
    cv2.圆(im,(x,y+h),3,(0,0255),-1)
    cv2.imshow(“网格角”,img)


  • 您可以尝试在图像上使用Hough变换。这将为您提供图像中所有线段的坐标(起点、终点)。然后,如果正方形在图像中没有旋转,您可以将它们与在corner harris中找到的角进行比较。