gpt4 book ai didi

python - 通过计算变换计算元素位置

转载 作者:太空宇宙 更新时间:2023-11-03 21:09:30 26 4
gpt4 key购买 nike

这个问题与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 个绿色特征计算,红色不匹配应影响匹配质量。

enter image description here

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

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));

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

最佳答案

如果特征具有相似的形状,您的第二步(通过成对形状比较将轮廓相互匹配)听起来很容易出错,例如,您有几个相似大小的圆形轮廓。然而,如果您的刚体仅在一个象限中具有 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 个圆圈和一个星形),您可以添加额外的参数,例如作为特征参数列表的偏心率和锐度,并在搜索旋转角度时将它们包含在相关性中。

关于python - 通过计算变换计算元素位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12560339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com