Lnton羚通视频分析算法平台【OpenCV-Python】教程: Epipolar Geometry 对极几何
  bhI5HKfMRQFj 2023年11月02日 27 0

极几何(Epipolar Geometry)是计算机视觉和三维重建领域中的重要概念,用于描述两个相机之间的关系以及它们在图像上的几何约束。

当使用两个相机同时拍摄同一场景时,两个相机的成像平面之间存在一对对极线。极线是指在一幅图像上与相机光心连接起来的直线,在另一幅图像上的对应线被称为对极线。这对对极线的交点被称为对极点。极线和对极点是由两个相机的内外参数共同决定的。

极几何的主要作用有:

1.约束匹配:在立体视觉中,通过极线约束可以加速特征点匹配的过程。对于给定图像中的一个点,只需要在其对应的极线上搜索匹配点,而不需要在整个图像上进行搜索。这大大减少了计算量。

2.三角测量:通过极线几何,可以通过已知的两幅图像上的对应点以及相机的内外参数,进行三角测量,得到目标物体在三维空间中的坐标。

3.相机姿态估计:通过对极几何关系,可以推导出两个相机的相对旋转和平移关系,从而估计出相机的相对姿态。

4.求解基础矩阵:基础矩阵是描述两个图像之间的极线几何关系的重要矩阵。通过已知的对应点,可以计算出两个图像之间的基础矩阵,从而推导出极线、对极线和对极点。

import numpy as np 
import cv2 
from matplotlib import pyplot as plt

# 读入图片
img1 = cv2.imread("assets/left.jpg", 0)
img2 = cv2.imread("assets/right.jpg", 0)

# 定义SIFT算子
sift = cv2.SIFT_create()

# 找到特征点和计算特征
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

# FLANN 参数
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)

# 选择匹配点中匹配度比较好的点
pts1 = []
pts2 = []
for i, (m,n) in enumerate(matches):
    if m.distance < 0.76*n.distance:
        pts2.append(kp2[m.trainIdx].pt)
        pts1.append(kp1[m.queryIdx].pt)

# 类型转换
pts1 = np.int32(pts1)
pts2 = np.int32(pts2)

# 找到基本矩阵
F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)

# 选择内部的点
pts1 = pts1[mask.ravel()==1]
pts2 = pts2[mask.ravel()==1]

## 画极线
def drawepilines(img1, img2, lines, pts1, pts2):
    r,c = img1.shape 
    img1_temp = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
    img2_temp = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
    for r, pt1,pt2 in zip(lines,pts1,pts2):
        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]])
        img1_temp = cv2.line(img1_temp,(x0,y0),(x1,y1),color,1)
        img1_temp = cv2.circle(img1_temp, tuple(pt1), 5, color, -1)
        img2_temp = cv2.circle(img2_temp, tuple(pt2), 5, color, -1)
    return img1_temp, img2_temp


# 根据右图的点找到左图的极线
lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1,1,2),2,F)
lines1 = lines1.reshape(-1,3)
img5, img6 = drawepilines(img1,img2,lines1,pts1,pts2)

# 根据左图的点找到右图的极线
lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1,1,2),1,F)
lines2 = lines2.reshape(-1,3)
img3, img4 = drawepilines(img2,img1,lines2,pts2,pts1)

res = np.hstack((img5, img3))
cv2.imshow("res", res)


# res1 = np.hstack((img5,img6))
# res2 = np.hstack((img4,img3))

# cv2.imshow("res1", res1)
# cv2.imshow("res2", res2)


cv2.waitKey(0)
cv2.destroyAllWindows()

在计算机视觉中,常用的方法如RANSAC(Random Sample Consensus)可以用于从匹配点对中估计基础矩阵。基础矩阵的计算可以通过使用8点法(Eight-Point Algorithm)或其他更精确的方法来实现。

极几何是三维重建、立体视觉等领域中的重要理论基础,深入理解极几何可以帮助我们理解相机几何关系、优化匹配算法以及实现精确的三维场景重建。

Lnton 羚通专注于音视频算法、算力、云平台的高科技人工智能, 基于视频分析技术、视频智能传输技术、远程监测技术以及智能语音融合技术等, 拥有多款可支持 ONVIF、RTSP、GB/T28181 等多协议、多路数的音视频智能分析服务器。

Lnton羚通视频分析算法平台【OpenCV-Python】教程: Epipolar Geometry 对极几何_ci


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
bhI5HKfMRQFj