OpenCV-Python系列之对极几何

点击查看代码
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 img2lines - corresponding epilines '''r, c = img1.shapeimg1 = 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都在右侧图像的一点处收敛。那个汇合点就是极点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783930.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7使用RPM包安装Oracle21c数据库(EE)

Centos7使用RPM包安装Oracle21c数据库(EE) 官方下载链接21c标准版 安装包信息: 文件名:LINUX.X64_213000_db_home.zip (64-bit) (3,109,225,519 bytes) (sha256sum - c05d5c32a72b9bf84ab6babb49aee99cbb403930406aabe3cf2f94f1d35e0916)21c xe版 安装包信息: 文件名:ora…

相交两圆

这篇写的太早了,我自己也看不懂,现在找不到啥基础题适合放了。反正把构型掌握了就好。 Reim引理如图,两圆交于 \(A,B\) 两点,若 \(CD,EF\) 是两圆的弦,满足 \(CAE,DBF\) 分别共线,则 \(CD//EF\) 逆定理:若 \(ABCD\) 共圆,\(E,F\) 分别在 \(CA,DB\) 的延长线上,并满足 …

Centos7使用RPM包安装Oracle21c数据库(XE)

Centos7使用RPM包安装Oracle21c数据库(XE) 官方下载链接21c标准版 安装包信息: 文件名:LINUX.X64_213000_db_home.zip (64-bit) (3,109,225,519 bytes) (sha256sum - c05d5c32a72b9bf84ab6babb49aee99cbb403930406aabe3cf2f94f1d35e0916)21c xe版 安装包信息: 文件名:ora…

工厂模式

工厂模式 核心本质: 实例化对象不使用new,用工厂方法创建对象 使用工厂统一管理对象的创建,将调用者跟实现类解耦 三种模式:简单工厂模式建立一个工厂类,对实现了同一接口的一些类进行实例的创建。优点是比较好理解,简单易操作。 缺点是类的创建依赖工厂类,如果想要拓展…

【OpenCV教程】滤波和边缘检测的过程

@目录1.均值滤波1.1 卷积核形状1.2 API1.3 效果2.高斯滤波2.1 卷积核形状2.2 API2.3 效果3.中值滤波3.1 原理3.2 API3.3 效果4.高斯双边滤波4.1 原理4.2 API4.3 效果5.获取用来形态学操作的滤波器6.腐蚀和膨胀(对二值图)6.1 原理6.2 腐蚀API6.3 效果6.4 膨胀API6.5 效果7.形态…

Excel公式和基本函数

输入完公式,点击回车,即可显示出值,<>是不等号

03-Matlab数组与矩阵

数组的建立和操作数组算术运算数组信息获取矩阵的建立矩阵的扩展矩阵的块操作矩阵中元素的删除赋值为一对方括号 矩阵的转置加点不转置为共轭复数 没点的转置为共轭复数 矩阵的旋转矩阵的翻转矩阵尺寸的改变矩阵加减法矩阵乘法矩阵除法矩阵中元素查找矩阵元素排序矩阵元素求和矩…

云音乐贵州机房迁移总体方案回顾

一、背景 2023年确定要将云音乐整体服务搬迁至贵州机房,项目需要在各种限制条件下,保障2000+应用、100w+QPS的服务稳定迁移,是云音乐历史上规模最大、人员最多、难度最高的技术项目。在此过程中,解决了大量历史技术债务,同时化解了大量新增系统性风险。以下为总体方案回顾…

湿式复合机剥离涂布机切纸机高静电横切机PLC数据采集系统车间联网方案

序号 设备名称 品牌/厂家 型号 数量 "系统类型" 品牌/厂家 "其他型号补充说明" "可用通讯接 口" 数采需求内容1 "复合机组(1#)" "松德机械股份有限公司" FTB1600 1 PLC "西门子PLC(SIEMENS)" S7-300 R…

关于SEGGER Embedded Studio的一些设置,自己摸索的

1. 删除Embedded Studio最近的项目 如下图所示,File->Recent Projects->Manage Recent Projects,就可以打开 Recent Projects 视图窗口,在此窗口中右键点击项目,进行删除,或者其他操作。2. Embedded Studio的启动文件问题 我原来的疑惑是Embedded Studio有自己的启动…

[开源分享]一个用于单片机IAP自动发送的串口助手,上位机,使用Python+tkinter制作

使用Python + tkinter制作。 这是个给单片机通过串口进行IAP的上位机,与单片机中的BOOT程序配合使用,完成对单片机APP程序的升级。可以完成bin文件的切片,CRC校验(使用Crc32Mpeg2),打包自动发送。使用Python + tkinter制作。 功能: 这是个给单片机通过串口进行IAP的上位…