许多对象的时刻(Python OpenCV)

时间:2017-08-01 21:42:02

标签: python opencv keypoint

我有一个包含~400点的图像。我一直在使用Simpleblob探测器找到关键点。然后我循环遍历所有关键点以找到每个关键点的中心(下面的代码)。这很有效,但我也对瞬间信息感兴趣,正如我想象的那样.pt只是平均与关键点相关的所有像素的位置。

import cv2
import numpy as np
import csv

im = cv2.imread("8f3secshim.bmp", cv2.IMREAD_GRAYSCALE)

detector = cv2.SimpleBlobDetector_create()

keypoints = detector.detect(im)

im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), 
(0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imshow("Keypoints", im_with_keypoints)

x = np.empty([len(keypoints), 2])

for i in range(len(keypoints)):

    x[i] = keypoints[i].pt

我想按照以下方式做点什么:

M = np.empty([lens(keypoints), 1])

for j in range(len(keypoints)):
    M[j] = cv2.moments(keypoints[j])

但它失败了。

我已经尝试放弃Simpledetector,并在此处列出的时刻使用治疗http://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html ,但那也失败了。

如果有人有任何建议,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

我似乎错误地提出了我的问题。如果有人想要找到与给定图像中找到的单个对象相关联的时刻,则可以使用以下代码。

import cv2
import numpy as np

img = cv2.imread('8f3secshim.bmp',0)
ret,thresh = cv2.threshold(img,127,255,0)
im2,contours,hierarchy = cv2.findContours(thresh, 1, 2)

print(len(contours))
a = np.empty([len(contours), 1])
cx = np.empty([len(contours), 1])
cy = np.empty([len(contours), 1])
for i in range(0, len(contours)):
     Mi = cv2.moments(contours[i])
#if any m00 moment is equal to zero the code can not be completed...
     if Mi['m00'] != 0:
     cx[i]= Mi['m10']/Mi['m00']
     cy[i]= Mi['m01']/Mi['m00']
     a[i] = cv2.contourArea(contours[i])

x = np.hstack((cx, cy, a))
#x is a len(contours), 3 matrix.  

我确信可能有一种更优雅的方式来做到这一点,但这很有效。