我正在使用opencv-python对齐两个图像(由同一设备扫描,因此它们应该仅通过平移和旋转就可以彼此对齐,而无需缩放)。考虑到图像实际上是在同一台机器上扫描的,因此特征匹配和变换估计中应该没有缩放或只有一点点缩放。
我在几年前发布的opencv论坛上找到了答案。
https://answers.opencv.org/question/90428/scale-variant-feature-matching/
建议在使用orb时将nlevels设置为1。
所以我将代码修改为这样。
if __name__ == "__main__":
full_affine = False
try_cuda = True
match_conf = 0.3
finder = cv2.ORB_create(scaleFactor=1.2, nlevels=1, edgeThreshold=31,
firstLevel=0, WTA_K=2, scoreType=cv2.ORB_HARRIS_SCORE,
nfeatures=100, patchSize=31)
matcher = cv2.detail_AffineBestOf2NearestMatcher(full_affine, try_cuda, match_conf)
source_img = cv2.imread("000010.jpg")
target_img = cv2.imread("000000.jpg")
source_feature = cv2.detail.computeImageFeatures2(featuresFinder=finder, image=source_img)
target_feature = cv2.detail.computeImageFeatures2(featuresFinder=finder, image=target_img)
matching_result = matcher.apply(source_feature, target_feature)
print(type(matching_result))
print("matching_result.confidence")
print(matching_result.confidence)
print("matching_result.H")
print(matching_result.H)
print("matching_result.dst_img_idx")
print(matching_result.dst_img_idx)
print("matching_result.src_img_idx")
print(matching_result.src_img_idx)
t = matching_result.H
print(type(t))
根据opencv的python api,matching_result.H是估计的2D变换
我希望输出结果是一个无需缩放的仿射变换矩阵。
但是,它显然可以缩放图像。
我的猜测是先前建议的设置nlevels = 1的解决方案确实限制了特征计算,但是变换估计仍然可以进行缩放。
有什么想法吗?