【无标题】

极线纠正 python

极线纠正源码详解


前言

极线纠正源码详解网上理论中理论知识
—推荐李迎松的的系列文章[https://blog.csdn.net/rs_lys/article/details/113248118]

为了得到基础矩阵我们应该在两幅图像中找到尽量多的匹配点。我们可以使用 SIFT 描述符,FLANN 匹配器和比值检测。

import cv2
import numpy as np
from matplotlib import pyplot as plt
#导入图片
img1 = cv2.imread('im2.png', 0)  # queryimage # 左侧图片
img2 = cv2.imread('im6.png', 0)  # trainimage # 右侧图片
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

#比较每个像素点和它周围所有的相邻点,是否是最大或者最小
#对极值点进行过滤,设置对比度阈值,用于去除小于该阈值的极值点设置边阈值
#对极值点使用Hessian矩阵计算主曲率,如果大于边阈值,那么舍弃该极值点
#图像的关键点已检测完毕,每个关键点有三个信息:位置、尺度、方向;同时也就使关键点具备平移、缩放、和旋转不变性 用SIFT查找关键点和描述子

FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=3)
search_params = dict(checks=50)

flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
#queryIdx:测试图像的特征点描述符的下标(第几个特征点描述符),同时也是描述符对应特征点的下标。
#trainIdx:样本图像的特征点描述符下标,同时也是描述符对应特征点的下标。
#distance:代表这怡翠匹配的特征点描述符的欧式距离,数值越小也就说明俩个特征点越相近
good = []
pts1 = []
pts2 = []

# 按照Lowe的论文进行比率测试
for i, (m, n) in enumerate(matches):
    #print(m.distance)
    #print(n.distance)
    if m.distance < 0.8 * n.distance:#这个距离不只是距离,还有方向和尺度综合的信息
        good.append(m)
        pts2.append(kp2[m.trainIdx].pt)
        pts1.append(kp1[m.queryIdx].pt)

#怎样计算distance的
#采用k临近算法比较使用过的kNN匹配的k值为2(在训练集中找两个点),
#一图的点在二图中找两个匹配近似点
#第一个匹配的是最近邻,第二个匹配的是次近邻。
#因此,我们可以通过查看二者距离的不同来评判距匹配程度的好坏。
#比值检测认为第一个匹配和第二个匹配的比值小于一个给定的值(一般是0.5)

代码如下(示例):

pts1 = np.int32(pts1)#(2433, 2)

pts2 = np.int32(pts2)

print("2", pts2.shape)
F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_LMEDS)    # 基本矩阵f  3*3
print(F.shape)
# 我们只使用inlier点
pts1 = pts1[mask.ravel() == 1]#ravel拉成一维  (14252)
pts2 = pts2[mask.ravel() == 1]

def drawlines(img1, img2, lines, pts1, pts2):
    ''' img1 - 我们要绘制到的图像
        lines - 相应的极线 '''
    r, c = img1.shape
    dian = 1
    se = 0

    img1 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
    img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
    for r, pt1, pt2 in zip(lines, pts1, pts2):
        if se >= 235:
            se = 0
        color = tuple((se, se+10, se+20))
        #color = tuple( np.random.randint(0, 255, 3).tolist())
        x0, y0 = map(int, [0, -r[2]/r[1]])
        x1, y1 = map(int, [c, -(r[2]+r[0]*c)/r[1]])
        se += 10
        dian += 1
        if dian%15 == 0:
            img1 = cv2.line(img1, (x0, y0), (x1, y1), color, 1)
            img1 = cv2.circle(img1,tuple(pt1), 8, color, -1)  #画点
            img2 = cv2.circle(img2,tuple(pt2), 8, color, -1)
    return img1, img2


lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, F) # lines1 (1425, 1, 3)
print("lines1", lines1.shape)
lines1 = lines1.reshape(-1, 3)#极线的输出相向量,三维,ax + by + c = 0  lines1 (1425, 3)
print("lines1", lines1.shape)
img5, img6 = drawlines(img1, img2, lines1, pts1, pts2)

# 找到左边图像(第一张图像)中的点对应的极线
# 在右边图像上画出来
lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1, 1, 2), 1, F)
lines2 = lines2.reshape(-1, 3)
img3, img4 = drawlines(img2, img1, lines2, pts2, pts1)

plt.subplot(121), plt.imshow(img5)
plt.subplot(122), plt.imshow(img3)
plt.savefig('sift_left_right.png')

plt.show()




总结

提示:时间有限,记录下方便回看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值