OpenCV python - 从Origin到Harris Corners的距离

时间:2014-12-22 13:49:33

标签: python opencv image-processing

我正在编写一个python库来对几何图像进行基本处理。其中一个理想的功能是返回所有角落的距离列表。距原点的距离。在查看我的角落物体的印刷品后,我正在努力解决这个问题;

[[  9.20031281e+01   9.20031281e+01   9.20031281e+01 ...,   6.66796863e-01
1.01710939e+01   1.01710939e+01]
[  1.36668701e+02   1.36668701e+02   1.36668701e+02 ...,   1.33374023e+00
1.07448441e+02   1.07448441e+02]
[  1.36668701e+02   1.36668701e+02   1.36668701e+02 ...,   1.33374023e+00
1.07448441e+02   1.07448441e+02]
..., 
[ -7.81250012e-04   3.12500005e-03   1.83593743e-02 ...,   3.36616707e+01
2.24355469e+01   2.24355469e+01]
[ -4.88281257e-05   3.12500005e-03   5.41992206e-03 ...,   3.67563972e+01
2.24355469e+01   2.24355469e+01]
[ -4.88281257e-05   5.37109387e-04   5.37109387e-04 ...,   3.67563972e+01
2.24355469e+01   2.24355469e+01]]

此图像看起来像这样(注意两个粉红色检测到的角落);

enter image description here

如何从原点到角落找到距离(角度不是必需的,虽然也有用)?

谢谢!

2 个答案:

答案 0 :(得分:0)

以下是检索每个匹配的(x,y)位置的示例。我会说实话,它不是最好的做事方式,也可能是最快的方式,但它有效(我也没有对检测参数进行微调)。

import cv2
import numpy as np
import math

filename = "/Users/me/Downloads/square.jpg"
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)

for y in range(0, gray.shape[0]):
 for x in range(0, gray.shape[1]):
  harris = cv2.cv.Get2D(cv2.cv.fromarray(dst), y, x) # get the x,y value
  # check the corner detector response
  if harris[0] > 0.01*dst.max():
   print x,y # these are the locations of the matches
   print 'Distance in pixels from origin: %d' % math.sqrt(x**2+y**2)
   # draw a small circle on the original image
   cv2.circle(img,(x,y),2,(155, 0, 25))

cv2.imshow('Harris', img) # show the image
cv2.waitKey()

答案 1 :(得分:0)

我在一段时间后重新审视了这一点,发现Shi-Tomasi方法允许更加明显,最重要的是,可以更快地访问角坐标。

corners = cv2.goodFeaturesToTrack(image, 4, 0.5, 10)

将填充角落,文档中解释的参数,然后;

for i in self.new_corners: #draws on corners
    x,y = i.ravel()

每次迭代都会暴露坐标。

我确信这也可以通过角落哈里斯,我只是找不到任何描述它所创造的物体的东西。