1

我有一张包含约 400 个点的图像。我一直在使用 Simpleblob 检测器来查找关键点。然后我 for 遍历所有关键点以找到每个关键点的中心(下面的代码)。这很好用,但我也对时刻信息感兴趣,因为我想 .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 ,但这也失败了。

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

4

1 回答 1

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.  

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

于 2017-08-02T17:23:48.897 回答