Python 缝合无人机图像时单应性问题?

Python 缝合无人机图像时单应性问题?,python,opencv,Python,Opencv,我有一系列从无人机上拍摄的20张航空照片,这些照片不是特别整齐。我正在尝试使用opencv缝合器api将它们缝合在一起。首先,我试着写一些代码将两张照片缝合在一起,但是我认为我的单应性有问题。这是我的密码: import numpy as np import cv2 import sys img1 = cv2.imread('images/00000710.png', 0) img1 = cv2.blur(img1,(5,5)) h1, w1 = img1.shape[:2] img

我有一系列从无人机上拍摄的20张航空照片,这些照片不是特别整齐。我正在尝试使用opencv缝合器api将它们缝合在一起。首先,我试着写一些代码将两张照片缝合在一起,但是我认为我的单应性有问题。这是我的密码:

import numpy as np 
import cv2 
import sys

img1 = cv2.imread('images/00000710.png', 0)   
img1 = cv2.blur(img1,(5,5))
h1, w1 = img1.shape[:2]
img2 = cv2.imread('images/00000711.png', 0)
img2 = cv2.blur(img2,(5,5))
h2, w2 = img2.shape[:2]

sift = cv2.xfeatures2d.SIFT_create()
kp1, desc1 = sift.detectAndCompute(img1, None)
kp2, desc2 = sift.detectAndCompute(img1, None)

FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)

#matches
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(desc1, desc2, k=2)
matches = sorted(matches, key = lambda x:x[0].distance)
good = [m1 for (m1, m2) in matches if m1.distance < 0.7 * m2.distance]

src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)

H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
pts = np.float32([[0,0],[0,h1-1],[w1-1,h1-1],[w1-1,0]]).reshape(-1,1,2)

warped_img = cv2.warpPerspective(img2, H, (1200,1200))
cv2.imwrite('warped.jpg', warped_img)

stitcher = cv2.createStitcher(False)
result = stitcher.stitch((img1, warped_img))

cv2.imwrite('result.jpg', result[1])
将numpy导入为np
进口cv2
导入系统
img1=cv2.imread('images/00000710.png',0)
img1=cv2.模糊(img1,(5,5))
h1,w1=img1.形状[:2]
img2=cv2.imread('images/00000711.png',0)
img2=cv2.模糊(img2,(5,5))
h2,w2=img2.形状[:2]
sift=cv2.xfeature2d.sift_create()
kp1,desc1=sift.detectAndCompute(img1,无)
kp2,desc2=sift.detectAndCompute(img1,无)
法兰索引KDTREE=0
索引参数=dict(算法=FLANN\u索引树,树=5)
搜索参数=dict(检查=50)
#火柴
flann=cv2.FlannBasedMatcher(索引参数、搜索参数)
matches=flann.knnMatch(desc1,desc2,k=2)
匹配=已排序(匹配,键=λx:x[0]。距离)
良好=[如果m1.distance<0.7*m2.distance,则匹配中(m1,m2)的m1]
src_pts=np.float32([kp1[m.queryIdx].pt代表m处于良好状态])。重塑(-1,1,2)
dst_pts=np.float32([kp2[m.trainIdx].pt代表m处于良好状态])。重塑(-1,1,2)
H、 掩模=cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,5.0)
pts=np.32([[0,0],[0,h1-1],[w1-1,h1-1],[w1-1,0]])。重塑(-1,1,2)
翘曲_img=cv2。翘曲透视图(img2,H,(12001200))
cv2.imwrite('warped.jpg',warped_img)
stitcher=cv2.CreateSitcher(假)
结果=针迹(img1,翘曲)
cv2.imwrite('result.jpg',result[1])


我从未做过类似的事情,但我在网上读过很多指南,也看过文档。但是,扭曲的图像看起来不正确,并且该代码输出一个空白jpg——甚至不是全黑或全白,它只是在打开图像文件时给出一个错误。任何帮助都将不胜感激

你的缝纫机可能坏了。
stitcher.stitch()
返回的是一个元组,其中第一个值表示失败或成功,第二个值表示图像。如果图像为
None
,则您的缝合器出现故障。我对你的代码有点困惑——stitcher类本身会扭曲图像,你不需要手动操作。另外,我不确定上面的代码是否就是您正在运行的代码,但您有一个输入错误;这两个
detectAndCompute()
方法都在
img1
上运行。那么我可以将所有20个图像都传递给stitch函数吗?如果失败了该怎么办?我从来没有在OpenCV中使用过stitcher类,所以我没有太多的建议,不幸的是,Python没有太多的资源。然而,有一个来自OpenCV的C++例子,你可以从中获取一些光。此外,本教程可能有帮助,也可能没有帮助: