【发布时间】: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