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

OpenCV,Python:如何缝合两个不同大小和透明背景的图像,python,image,opencv,computer-vision,feature-detection,Python,Image,Opencv,Computer Vision,Feature Detection,我一直在做一个项目,我把一架以割草机模式飞行的无人机的图像拼接在一起。我能够将单个过程中的图像缝合在一起(多亏了stackoverflow的许多答案),但当我尝试将两个单独的过程横向缝合在一起时,我的方法产生的转换是毫无意义的。以下是我正在尝试缝合的两幅图像: 这是我用来估计两者之间单应性的代码,base和curr base_gray = cv2.cvtColor(base, cv2.COLOR_BGRA2GRAY) curr_gray = cv2.cvtColor(curr, cv2.CO

我一直在做一个项目,我把一架以割草机模式飞行的无人机的图像拼接在一起。我能够将单个过程中的图像缝合在一起(多亏了stackoverflow的许多答案),但当我尝试将两个单独的过程横向缝合在一起时,我的方法产生的转换是毫无意义的。以下是我正在尝试缝合的两幅图像:

这是我用来估计两者之间单应性的代码,
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)
base\u gray=cv2.cvt颜色(base,cv2.COLOR\u BGRA2GRAY)
curr\u gray=cv2.CVT颜色(curr,cv2.COLOR\u BGRA2GRAY)
检测器=cv2.ORB_create()
基本键,基本描述=检测器。检测和计算(基本灰,无)
curr\u key,curr\u desc=检测器。检测器和计算(curr\u gray,无)
法兰指数=6
法兰参数=dict(算法=法兰索引),
表_编号=12,
键大小=20,
多探头(水平=2)
搜索参数=dict(检查=100)
matcher=cv2.FlannBasedMatcher(法兰参数、搜索参数)
匹配=匹配器。匹配(基本描述、当前描述)
最大距离=0.0
最小距离=100.0
对于匹配中的匹配:
dist=match.distance
最小距离=如果距离小于最小距离,则距离小于其他最小距离
最大距离=如果距离>最大距离否则最大距离

好的匹配=[match if match.distance我认为Flann可能不是您想要在这里使用的匹配。首先,事实上,由于您正在转换为灰度,图像的黑点、边缘等可能会包含在您不想要的功能集中。其次,Flann使用方法来构建特定的描述符在图像数据库中快速搜索;用于单应估计,而不是单应估计


相反,只需使用
SIFT
SURF
ORB
BRISK
的正常方法即可。请注意,所有这些都允许为关键点检测步骤添加
mask
,以便您可以从alpha通道创建一个mask来忽略关键点。有关更多信息,请参阅OpenCV文档。

t、 使用遮罩忽略透明/黑色区域,并使用
BruteForce-Hamming
功能检测器而不是flann,效果更好。@user2457666很高兴它成功了!您的管道开始成形了。@VictorOdouard在使用BruteForce-Hamming功能检测器之后,您是否尝试过缝合图像?是的结果很好,但仍然有相当明显的接缝。我目前正在使用surf和sift构建opencv,看看这些特征检测器是否工作得更好,然后我将使用另一个特征匹配器,
cv2.BFMatcher()
在设置
cv2.NORM\u L2
@AnandSonawane时,OpenCV中还有一个图像拼接类,用于混合。