首页 > 编程语言 >OpenCV-Python系列之对极几何

OpenCV-Python系列之对极几何

时间:2024-08-19 19:28:20浏览次数:13  
标签:pts1 Python image pts2 OpenCV 几何 img2 img1 cv

点击查看代码
import numpy as np
import cv2 as cv
img1=cv.imread("data1/1.png",0) # queryimage  left image
img2=cv.imread("data1/2.png",0) # trainimage right image
sift=cv.SIFT_create()
# sift1=cv.xfeatures2d.SIFT_create()

kp1,des1=sift.detectAndCompute(img1,None)
kp2,des2=sift.detectAndCompute(img2,None)

# FLANN parameters
FLANN_INDEX_KDTREE=1
index_params=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)
search_params=dict(checks=50)
flann=cv.FlannBasedMatcher(index_params,search_params)
matches=flann.knnMatch(des1,des2,k=2)
good=[]
pts1=[]
pts2=[]
# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
    if m.distance<0.8*n.distance:
        good.append(m)
        pts2.append(kp2[m.trainIdx].pt)
        pts1.append(kp1[m.queryIdx].pt)

现在得到了一个匹配点列表,我们就可以使用它来计算基础矩阵了。 retval,mask=cv.findFundamentalMat(points1,points2,method,ransacReprojThreshold,confidence,mask) points1: 从第一张图片开始的N个点的数组,点坐标应该是浮点数(单精度或双精度). points2: 与点1大小和格式相同的第二图像点的数组。 method: 计算基本矩阵的方法。 cv2.FM_7POINT for a 7-point algorithm.N=7 cv2.FM_8POINT for a 8-point algorithm.N>=8 cv2.FM_LMEDS for the LMedS algorithm.N>=8 ransacReprojThreshold:仅用于RANSAC方法的参数,默认3.它是一个点到极线的最大距离(以像素为单位),超过这个点就被认为是一个离群点, 不用于计算最终的基本矩阵。根据点定位、图像分辨率和图像噪声的准确性,可以将其设置为1-3左右。 confidence:仅用于RANSAC和LMedS方法的参数,默认0.99。它指定了一个理想的置信水平(概率),即估计矩阵是正确的
点击查看代码
pts1=np.int32(pts1)
pts2=np.int32(pts2)
F,mask=cv.findFundamentalMat(pts1,pts2,cv.FM_LMEDS)
print("F矩阵")
print(F)
# we select only inlier points
pts1=pts1[mask.ravel()==1]
pts2=pts2[mask.ravel()==1]
下一步我们要找到极线。我们会得到一个包含很多线的数组。 所以我们要定义一个新的函数将这些线绘制到图像中
点击查看代码
def drawlines(img1, img2, lines, pts1, pts2):
    ''' img1 - image on which we draw the epilines for the points in img2
        lines - corresponding epilines '''
    r, c = img1.shape
    img1 = cv.cvtColor(img1, cv.COLOR_GRAY2BGR)
    img2 = cv.cvtColor(img2, cv.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 = cv.line(img1, (x0, y0), (x1, y1), color, 1)
        img1 = cv.circle(img1, tuple(pt1), 5, color, -1)
        img2 = cv.circle(img2, tuple(pt2), 5, color, -1)
    return img1, img2
现在我们两幅图像中计算并绘制极线. lines=cv.computeCorrespondEpiline(points,whichImage,F,lines) points:输入点。类型为CV_32FC2NX1或1XN矩阵。 whichImage:包含点的图像(1或2)的索引 F:基本矩阵,可使用findFundamentalMat或StereoRectify进行估计。 lines:对应于另一幅图像中的极线的输出向量(a,b,c)表示ax+by+c=0 Find epilines corresponding to points in right image(second image) and drawing its lines on left image
点击查看代码
lines1=cv.computeCorrespondEpilines(pts2.reshape(-1,1,2),2,F)
lines1=lines1.reshape(-1,3)
img5,img6=drawlines(img1,img2,lines1,pts1,pts2)
# Find epilines corresponding to points in left image(first image) and  drawing its lines on right image
lines2=cv.computeCorrespondEpilines(pts1.reshape(-1,1,2),1,F)
lines2=lines2.reshape((-1,3))
img3,img4=drawlines(img2,img1,lines2,pts2,pts1)
# plt.subplot(1,2,1), plt.imshow(img5)
# plt.subplot(1,2,2), plt.imshow(img3)
cv.imshow("img5",img5)
cv.imshow("img3",img3)
cv.waitKey(0)
我们可以在左侧图像中看到所有Epilines都在右侧图像的一点处收敛。那个汇合点就是极点。

标签:pts1,Python,image,pts2,OpenCV,几何,img2,img1,cv
From: https://www.cnblogs.com/SunshineWeather/p/18367932

相关文章

  • 【OpenCV_python】凸包检测 轮廓特征 直方图均衡化 模板匹配 霍夫变换
    凸包特征检测凸包就是图像的最小外接多边形,通过图像的轮廓点,找到距离最远的两个点的直线,根据直线找到距离最远的下一个点,直到所有的点被包围在多边形内读取图像二值化找图像的轮廓获取凸包点的坐标绘制凸包点convexHull获得图像的凸包点cv2.convexHull(points,hu......
  • 【OpenCV教程】滤波和边缘检测的过程
    @目录1.均值滤波1.1卷积核形状1.2API1.3效果2.高斯滤波2.1卷积核形状2.2API2.3效果3.中值滤波3.1原理3.2API3.3效果4.高斯双边滤波4.1原理4.2API4.3效果5.获取用来形态学操作的滤波器6.腐蚀和膨胀(对二值图)6.1原理6.2腐蚀API6.3效果6.4膨胀API6.5效果7.形态学操作......
  • [oeasy]python0030_动态控制断点_breakpoints_debug_调试
     030_动态控制断点_breakpoints_debug_调试290播放·0赞同视频​设置断点_break_point_continue_运行到断点......
  • ubuntu(linux): 编译安装使用python3.12.5
    一,python官网:https://www.python.org/下载页面:https://www.python.org/downloads/source/如图:二,安装1,下载:wget从命令行下载:liuhongdi@lhdpc:/usr/local/source/python$wgethttps://www.python.org/ftp/python/3.12.5/Python-3.12.5.tgz2,解压:liuhongdi@lhdpc:/......
  • [开源&分享]一个用于单片机IAP自动发送的串口助手,上位机,使用Python+tkinter制作
    使用Python+tkinter制作。功能:这是个给单片机通过串口进行IAP的上位机,与单片机中的BOOT程序配合使用,完成对单片机APP程序的升级。可以完成bin文件的切片,CRC校验(使用Crc32Mpeg2),打包自动发送。界面如下图所示:接收区是显示信息的区域,接收和发送的信息都在这显示串口配置区域......
  • [Python学习日记-9] Python中的运算符
    简介        计算机可以进行的运算有很多种,但可不只加减乘除这么简单,运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算,而本篇我们暂只介绍算数运算、比较运算、逻辑运算、赋值运算算数运算一、运算符描述        以下......
  • python基础语法 010 类和对象-6-1 继承定义
    前提:    在真实世界中,类型之间可能存在范围包含关系,比如:人这个类型和亚洲人这个类型。        人是包括了亚洲人的,如果某人是员工亚洲人,那么它必定是一个人        这种关系,在编程语言中称为继承关系        比如上面例子:亚洲人这个类就继......
  • Python 实现Word和TXT文本相互转换
    Word文档(.doc或.docx)和纯文本文件(.txt)是两种常用的文件格式。Word文档通常用于复杂的文档处理和排版,而纯文本文件则用于存储和传输纯文本信息。了解如何在这两种格式之间进行转换能提高工作效率,并便于文件管理。本文将详细介绍如何使用Python实现Word和TXT文件格式之间的相互转换......
  • Python一些简单基础的模板化语法
    字符串的格式化%s:可以接收任何类型的传值(%d只可以接收整型int)单个值"myageis%s"%"18.56"按照值对应res="mynameis%s,myageis%s"%("xj",18)按照字典传值res="mynameis%(name)s,mynameis%(age)s"%{"age":"......
  • 【Python实现禁用任务管理器】
    效果展示:代码及解析:提示:使用pyinstaller打包可以避免弹窗,食用更佳哦提示(2):运行后要等待一段时间再关机哦禁用代码:要禁止任务管理器关闭Python程序,可以通过修改注册表来实现。以下是示例代码:importwinregimportctypesimportsys#以管理员身份运行此程序ct......