编程语言
首页 > 编程语言> > OpenCV,Python:如何缝合两个不同大小和透明背景的图像

OpenCV,Python:如何缝合两个不同大小和透明背景的图像

作者:互联网

我一直致力于一个项目,在那里我用无人机在割草机模式中飞行的图像拼接在一起.我能够将单个图像中的图像拼接在一起(感谢stackoverflow上的许多答案)但是当我尝试将两个单独的传递拼接在一起时,我的方法产生的变换是荒谬的.这是我想要缝合的两个图像:

enter image description here
enter image description here

这里是我用来估计两者之间的单应性的代码,base和curr.

base_gray = cv2.cvtColor(base, cv2.COLOR_BGRA2GRAY)
curr_gray = cv2.cvtColor(curr, cv2.COLOR_BGRA2GRAY)

detector = cv2.ORB_create()
base_keys, base_desc = detector.detectAndCompute(base_gray, None)
curr_keys, curr_desc = detector.detectAndCompute(curr_gray, None)

FLANN_INDEX_LSH = 6
flann_params = dict(algorithm = FLANN_INDEX_LSH,
                    table_number = 12,
                    key_size = 20,
                    multi_probe_level = 2)
search_params = dict(checks=100)
matcher = cv2.FlannBasedMatcher(flann_params, search_params)
matches = matcher.match(base_desc, curr_desc)

max_dist = 0.0
min_dist = 100.0

for match in matches:
    dist = match.distance
    min_dist = dist if dist < min_dist else min_dist
    max_dist = dist if dist > max_dist else max_dist

good_matches = [match for match in matches if match.distance <= 10 * min_dist ]

base_matches = []
curr_matches = []
for match in good_matches:
    base_matches.append(base_keys[match.queryIdx].pt)
    curr_matches.append(curr_keys[match.trainIdx].pt)

bm_final = np.asarray(base_matches)
cm_final = np.asarray(curr_matches)

# find perspective transformation using the arrays of corresponding points
transformation, hom_stati = cv2.findHomography(cm_final, bm_final, method=cv2.RANSAC, ransacReprojThreshold=1)

正如我所说,它不起作用.是因为透明背景搞乱计算?

解决方法:

我认为Flann可能不是你想用来匹配的东西.首先,实际上,由于您要转换为灰度,黑点,图像的边缘等可能会包含在您不想要的功能集中.其次,Flann使用方法构建特定的描述符,以便快速搜索图像数据库;它用于CBIR,不用于单应性估计.

相反,只需采用SIFT或SURF或ORB或BRISK的常规方法.请注意,所有这些都允许为其关键点检测步骤添加掩码,以便您可以从Alpha通道创建掩码以忽略其中的关键点.有关更多信息,请参阅SIFT and SURFORB and BRISK的OpenCV文档.

标签:python,opencv,image,computer-vision,feature-detection
来源: https://codeday.me/bug/20191001/1838344.html