【opencv】图像拼接实验

【opencv】图像拼接实验

码农世界 2024-05-15 前端 66 次浏览 0个评论

实验环境:anaconda、jupyter notebook

实验用到的包:opencv、matplotlib、numpy

注:opencv在3.4.2之后sift就不是免费的了

我用的是3.4.1.15版本

实验使用到的图片

一、sift函数获取特征值

读入图片

book = cv2.imread('book.png', cv2.IMREAD_GRAYSCALE)
pile = cv2.imread('pile.png', cv2.IMREAD_GRAYSCALE)
plt.imshow(book,'gray')
plt.show()
plt.imshow(pile,'gray')
plt.show()

获取特征点和特征向量

# 计算特征点和特征向量
sift = cv2.xfeatures2d.SIFT_create()
kp1,des1 = sift.detectAndCompute(book, None)
kp2,des2 = sift.detectAndCompute(pile, None)

一对一匹配

# 一对一
bf = cv2.BFMatcher(crossCheck=True)
matches = bf.match(des1,des2)
matches = sorted(matches, key=lambda x : x.distance)
res = cv2.drawMatches(book, kp1, pile, kp2, matches[:10],None, flags=2)
plt.figure(figsize=(12,8))
plt.imshow(res,'gray')
plt.show()

显示前十个匹配

k对最佳匹配

# k对最佳匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
# 把距离小于阈值的记录下来
good = []
for m,n in matches:
    if m.distance < 0.75 * n.distance:
        good.append([m])
res = cv2.drawMatchesKnn(book, kp1, pile, kp2,good,None, flags=2)
plt.figure(figsize=(12,8))
plt.imshow(res,'gray')
plt.show()

二、图像拼接实验

读入图片

ml = cv2.imread('ml.png')
ml_gray = cv2.cvtColor(ml, cv2.COLOR_BGR2GRAY)
mr = cv2.imread('mr.png')
mr_gray = cv2.cvtColor(mr, cv2.COLOR_BGR2GRAY)
plt.imshow(ml_gray, 'gray')
plt.show()
plt.imshow(mr_gray, 'gray')
plt.show()

获取特征点和特征向量

# 获取特征点和特征向量
sift = cv2.xfeatures2d.SIFT_create()
kpl,desl = sift.detectAndCompute(ml_gray, None)
kpl_f = np.float32([kp.pt for kp in kpl])
kpr,desr = sift.detectAndCompute(mr_gray, None)
kpr_f = np.float32([kp.pt for kp in kpr])
# 匹配并显示
bf = cv2.BFMatcher(crossCheck=True)
matches = bf.match(desl,desr)
matches = sorted(matches, key=lambda x : x.distance)
res = cv2.drawMatches(ml_gray, kpl, mr_gray, kpr, matches[:100],None, flags=2)
plt.figure(figsize=(12,8))
plt.imshow(res,'gray')
plt.show()

拼接图片

拼接图片实质上就是把一张图片的一部分变化到匹配另一张图片后,把另一张图片覆盖到变化的部分上

matcher = cv2.BFMatcher()
raw_matches = matcher.knnMatch(desr, desl, 2)
H = None
matches = []
for m in raw_matches:
    # 保留合适的特征值
    if len(m) == 2 and m[0].distance < m[1].distance * 0.75 :
        matches.append([m[0].trainIdx, m[0].queryIdx])
# 配对大于4时,计算时间变换矩阵
if len(matches) > 4:
    # 获取配对的点坐标
    ptsl = np.float32([kpl_f[i] for (i,_) in matches])
    ptsr = np.float32([kpr_f[i] for (_,i) in matches])
    # 计算视角变换矩阵
    (H, status) = cv2.findHomography(ptsr, ptsl, cv2.RANSAC, 4)
#对右图进行变换
result = cv2.warpPerspective(mr,H,(mr.shape[1] + ml.shape[1],mr.shape[0]))
plt.title('before')
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.show() 
# 左图覆盖
result[0:ml.shape[0], 0:ml.shape[1]] = ml
plt.title('after')
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.show() 

转载请注明来自码农世界,本文标题:《【opencv】图像拼接实验》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,66人围观)参与讨论

还没有评论,来说两句吧...

Top