【问题标题】:Calculating element position by computing transformation通过计算变换计算元素位置
【发布时间】:2012-09-25 07:35:30
【问题描述】:

这个问题与Transformation between two set of points 有关。但是,这是更好地指定,并添加了一些假设。

我有元素图像和一些模型。

我在两者上都检测到了轮廓

contoursModel0, hierarchyModel = cv2.findContours(model.copy(), cv2.RETR_LIST,   
                                                  cv2.CHAIN_APPROX_SIMPLE);
contoursModel = [cv2.approxPolyDP(cnt, 2, True) for cnt in contoursModel0];    
contours0, hierarchy = cv2.findContours(canny.copy(), cv2.RETR_LIST,  
                                        cv2.CHAIN_APPROX_SIMPLE);
contours = [cv2.approxPolyDP(cnt, 2, True) for cnt in contours0];

然后我将每个轮廓相互匹配

modelMassCenters = [];
imageMassCenters = [];
for cnt in contours:
for cntModel in contoursModel:
    result = cv2.matchShapes(cnt, cntModel, cv2.cv.CV_CONTOURS_MATCH_I1, 0);
    if(result != 0):
        if(result < 0.05):
           #Here are matched contours
           momentsModel = cv2.moments(cntModel);
           momentsImage = cv2.moments(cnt);
           massCenterModel = (momentsModel['m10']/momentsModel['m00'],  
                              momentsModel['m01']/momentsModel['m00']); 
           massCenterImage = (momentsImage['m10']/momentsImage['m00'], 
                              momentsImage['m01']/momentsImage['m00']); 
           modelMassCenters.append(massCenterModel);
           imageMassCenters.append(massCenterImage); 

匹配的轮廓类似于特征。

现在我想检测这两组点之间的转换。 假设:元素为刚体,只有旋转、位移和尺度变化。

某些功能可能会被漏检,如何消除它们。我曾经使用过cv2.findHomography,它需要两个向量并计算它们之间的单应性,即使有一些未匹配。

cv2.getAffineTransformation 只需要三分(不能应付错配),这里我有多个功能。 我在上一个问题中的回答说如何计算这种转换,但不会出现不匹配。另外我认为可以从算法中返回一些质量级别(通过检查有多少点不匹配,在计算其余部分的一些转换之后)

最后一个问题:我应该将所有矢量点都用于计算变换还是仅将这种形状的质心视为特征?

为了显示它,我添加了简单的图像。带有绿色的特征是红色坏匹配中的好匹配。这里的匹配应该是从 3 个绿色特征计算出来的,红色的不匹配应该会影响匹配质量。

我正在添加我现在想出的解决方案片段(但我认为它可以做得更好):

for i in range(0, len(modelMassCenters) - 1):
for j in range(i + 1, len(modelMassCenters) - 1  ):
    x1, y1 = modelMassCenters[i];
    x2, y2 = modelMassCenters [j];
    modelVec = (x2 - x1, y2 - y1);
    x1, y1 = imageMassCenters[i];
    x2, y2 = imageMassCenters[j];
    imageVec = (x2 - x1, y2 - y1);
    rotation = angle(modelVec,imageVec);
    rotations.append((i, j, rotation)); 
    scale = length(modelVec)/length(imageVec);
    scales.append((i, j,  scale)); 

在计算每对对应线给出的比例和旋转之后,我将找到旋转的中值和平均值,它们与中值的差异不超过一些增量。规模也一样。然后,将这些值用于计算的点将用于计算位移。

【问题讨论】:

  • 只是为了克服它 - 有人会过来指出你的代码在风格上有点 C/Java 风格。虽然不是语法错误 - if 周围不需要括号,并且行不需要以 ; 终止
  • 我知道,我根本不懂 Python。仅用于使用 OpenCV 测试一些视觉算法
  • 您在使用 findHomography 时是否使用了 ransac 选项?它到底有什么问题?
  • FindHomography 假设 3D 中的收缩和变换。我只添加了作为解决不匹配问题的示例。不适合解决这个问题。

标签: python opencv transformation


【解决方案1】:

如果特征具有相似的形状,您的第二步(通过成对的形状比较将轮廓相互匹配)听起来很容易出错,例如,您有几个相似大小的圆形轮廓。然而,如果您有一个仅在一个象限中具有 5 个圆形特征的刚体,那么如果您将刚体及其特征视为一个整体,您可以获得对仿射变换的非常稳健的估计。所以在匹配特征的时候,不要从整个身体的中心丢弃特征的范围和方向等信息。在关联特征方面,这些至少与单个轮廓的大小和形状一样重要。

我会尝试类似(未经测试的伪代码):

"""
Convert from rectangular (x,y) to polar (r,w)
    r = sqrt(x^2 + y^2)
    w = arctan(y/x) = [-\pi,\pi]
"""
def polar(x, y):        # w in radians
    from math import hypot, atan2, pi
    return hypot(x, y), atan2(y, x)

model_features = []
model = params(model_body_contour)    # return tuple (center_x, center_y, area)
for contour in model_feature_contours:
    f = params(countour)
    range, angle = polar(f[0]-model[0], f[1]-model[1])
    model_features.append((angle, range, f[2]))

image_features = []
image = params(image_body_contour)
for contour in image_feature_contours:
    f = params(countour)
    range, angle = polar(f[0]-image[0], f[1]-image[1])
    image_features.append((angle, range, f[2]))

# sort image_features and model_features by angle, range
#
# correlate image_features against model_features across angle offsets
#    rotation = angle offset of max correlation
#    scale = average(model areas and ranges) / average(image areas and ranges)

如果您有非常具有挑战性的图像,例如由 6 个等距大小相似的特征组成的环,其中 5 个具有相同的形状,一个不同(例如 5 个圆形和一个星形),您可以添加额外的参数,例如作为特征参数列表的偏心率和锐度,并在搜索旋转角度时将它们包含在相关性中。

【讨论】:

  • 感谢您提供非常好的解决方案。有时问题是没有检测到model_body_contour和image_body_contour或有一些遮挡。我可能会尝试将模型中心上检测到的所有特征都视为质心。图像也是如此。你的方法中的一些正确性措施怎么样?我看到可以在那里完成一些具有相关性的事情,但是如何做呢?我想找到更系统和可靠的输出匹配正确性的方法。
  • 1.0 的互相关(图像和模型之间)将是完美匹配;小于 1.0 的值表示匹配质量较低。
  • 好的。感谢您的完整回答。我将等待其他一些解决方案,因为这个问题可以通过多种方式解决,然后接受最佳答案
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多