7.6是什么日子| 信指什么生肖| 吃什么可以变胖| 反流性食管炎b级是什么意思| 鱼翅配什么煲汤最好| 捧杀是什么意思| tvb是什么| 什么蘑菇有毒| 结肠炎吃什么药治疗效果好| 神经纤维瘤挂什么科| 生完孩子可以吃什么水果| 甲沟炎看什么科室| 五联什么时候打| 双开是什么意思| 昆仑雪菊有什么作用| 鼻窦炎都有什么症状| 例假推迟是什么原因引起的| 木堂念什么| 黄芪配升麻有什么作用| dm表示什么单位| 洁颜油是干什么用的| 移徒什么意思| 一般什么原因做宫腔镜| 疱疹是什么病啊| 脚腕酸是什么原因| 疱疹在什么情况下传染| 总蛋白偏低是什么原因| 电压mv是什么意思| 螃蟹用什么呼吸| 蚊虫叮咬用什么药| 牛男和什么属相最配| 便秘吃什么药效果好| 什么的态度| 生活补贴是什么意思| 去离子水是什么水| 胃黏膜病变是什么意思| sle是什么病| 核载是什么意思| 什么酒不能喝打一生肖| 红花泡水喝有什么功效| 主动脉钙化什么意思| 芸豆长什么样子| 骨折补钙吃什么钙片好| 糖链抗原是什么意思| wpw综合症是什么意思| 泻盐是什么东西| 网球肘用什么方法能彻底治好呢| 水饮是什么意思| 松鼠咬人后为什么会死| 水压低用什么花洒| 沙参长什么样子图片| 33周岁属什么生肖| 用什么泡脚减肥最快| 葛根和粉葛有什么区别| 为什么睡觉| 69是什么姿势| 女性肝阳上亢吃什么药| 三点水弘读什么| 吃什么东西会误测怀孕| 猫咪有泪痕是什么原因| 杂合突变型是什么意思| 大雄宝殿供奉的是什么佛| 血糖有点高吃什么食物好| 双子是什么意思| 多吃黄瓜有什么好处和坏处| 乳腺结节不能吃什么食物| 血糖能吃什么水果| 12月2日什么星座| 九月29号是什么星座| 黄瓜有什么功效| 胡子长的快是什么原因| 丁毒豆泡酒能治什么病| 耳鸣吃什么| 儿童心肌酶高有什么症状| 壮字五行属什么| 脖子里面有结节是什么病| y是什么意思| 角质是什么意思| 什么情况下需要做宫腔镜| 晨僵是什么症状| 女生肾虚是什么原因| 胃不好吃什么最养胃| 儿童经常流鼻血什么原因造成的| 嗓子干疼是什么原因| 眼角发黄是什么原因| 戒断是什么意思| 走路带风是什么意思| 红艳煞什么意思| 舌吻有什么好处| 10.5是什么星座| 什么情况下月经推迟| 孙悟空的真名叫什么| 吃山药有什么好处| 膝盖骨质增生用什么药效果好| 小鱼缸适合养什么鱼| 梦见换房子是什么预兆| 手足口病喝什么汤| bl什么意思| 无畏布施是什么意思| 长痘吃什么水果| 吃什么瘦肚子| 磨玻璃结节影是什么意思| 丹毒不能吃什么| 硬化萎缩性苔藓是什么病| 肉桂和桂皮有什么区别| 画蛇添足的寓意是什么| 臭鳜鱼是什么菜系| 精梳棉是什么面料| 长口腔溃疡是什么原因| 吃什么有利于排便| 什么是麻疹| 闻字五行属什么| 青鱼和草鱼有什么区别| 脾虚吃什么好| 血糖降不下来是什么原因导致| 吃什么能降甘油三酯| 三个火念什么| 失足妇女是什么意思| 食物中毒呕吐吃什么药| 42天产后检查挂什么科| 红虫是什么的幼虫| 什么的花纹| 一键挪车什么意思| 排骨用什么炖好吃| 公积金缴存基数是什么| 吃什么可以降血压| 黑色水笔是什么笔| 1969年属什么生肖| 天线宝宝都叫什么名字| 男人蛋疼是什么原因| 什么样的女孩容易招鬼| 往事不堪回首是什么意思| 查血糖血脂挂什么科| 湿热体质吃什么中成药| 低钾血症是什么病| 西瓜像什么比喻句| 这个梗是什么意思| 蛤蚧是什么| 月经老是推后是什么原因| 有品味什么意思| 都有什么职业| 露水夫妻是什么意思| 活字印刷术是什么时候发明的| 撒丫子是什么意思| 心什么神什么| 长白毛是什么原因| 金字旁加者念什么| 公务员是干什么的| mcm中文叫什么牌子| 肺肿了是什么病严重吗| 眼睛出现飞蚊症什么原因怎么办| palace是什么牌子| 既什么又什么| 什么茶降血压效果最好| 高锰酸钾治疗男性什么病| 姜字五行属什么| 喝什么利尿| 前列腺增生有什么症状| 鳞状上皮乳头状瘤是什么| 女人梦见蜈蚣预兆什么| 男人性功能不好吃什么药| 什么病不能吃牛肉| 孕妇多吃什么食物好| 脸上长藓用什么药| 黄山四绝是什么| 乙脑是什么病| 莫名心慌是什么原因| art是什么| 府绸是什么面料| 泳帽的作用是什么| 三公经费指什么| 第一颗原子弹叫什么| 吃什么水果对胃好| 乌唇是什么原因| 为什么一吃完饭就肚子疼| erdos是什么牌子| 奶油小生什么意思| 人棍是什么意思| 咳痰带血是什么原因| 什么是处女| 猪古代叫什么| 朱代表什么生肖| 什么是原发性高血压| 克汀病是什么病| 减肥吃什么肉类| 湿疹不能吃什么| 慢性肾炎是什么原因引起的| 脚水肿是什么原因引起的| 手指起水泡是什么原因| 3月12日什么星座| 黄体可能是什么意思啊| 早孕试纸和验孕棒有什么区别| 信阳毛尖属于什么茶| 电镀对人体有什么危害| 梦见杀猪是什么意思| 黑胡桃色是什么颜色| 山地自行车什么牌子好| 鹿茸和什么泡酒壮阳| 运钞车押运员是什么人| 环比是什么意思| 社保指的是什么| 人的胆量由什么决定| 孕酮起什么作用| 保税区是什么意思| 人彘为什么还能活着| 淋巴结肿大吃什么食物好| 今年男宝宝取什么名字好| 什么花不能浇硫酸亚铁| 奕五行属什么| 盲约大结局是什么| pro是什么意思| 25度天气穿什么衣服| 黄体中期是什么意思| 上当是什么意思| autumn什么意思| 网球ad是什么意思| 12.24是什么星座| 经期血量少是什么原因| 渣男之首是什么星座| 结局be是什么意思| 黄金桂是什么茶| 悠悠什么意思| 龙虾不能和什么一起吃| mds是什么病的简称| 全身无力吃什么药| 什么山什么水| 扁桃体切除对身体有什么影响| 相是什么意思| lala是什么意思| 尿毒症是什么引起的| 继承衣钵是什么意思| 吃芒果对身体有什么好处| 市政协秘书长是什么级别| 茄子不能和什么一起吃| 取模是什么意思| 承蒙不弃什么意思| 胸部爱出汗是什么原因| 凌驾是什么意思| 广西属于什么气候| 打嗝医学术语是什么| 女孩的英文是什么| 聚乙二醇是什么| 康复是什么意思| 天井是什么| joy是什么意思| 1950年属虎的是什么命| 胃溃疡有什么症状| 发情什么意思| 汗疱疹是什么原因引起| tsh是什么| 珊瑚红是什么颜色| 墓库是什么意思| 冰丝是什么材料| 吃什么减肥最好最快| 右眼皮上长痣代表什么| 窝在沙发里是什么歌| 什么的树林| 什么情况下才做冠脉cta| 龟头是什么意思| 包皮是什么| 植树节是什么时候| 6月18日是什么节| 对方忙线中什么意思| 杜甫被后人称为什么| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 企业专区 ? OpenVINO生态社区 ? OpenCV-Python系列之对极几何实践(六十五)

共1条 1/1 1 跳转至

OpenCV-Python系列之对极几何实践(六十五)

高工
2025-08-04 09:18:45     打赏
百度 另一方面,根据一份报告,墨尔本的楼价被严重高估。

OpenCV-Python系列之对极几何实践

OpenCV中的对极几何

在上个教程中我们已经简述了对极几何的一些理论知识,本次我们来使用OpenCV中的一些函数来进行实战,为了得到基础矩阵我们应该在两幅图像中找到尽量多的匹配点。我们可以使用 SIFT 描述符,FLANN 匹配器和比值检测。

我们使用示例图片:

image.png

image.png

先看代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
 
 
img1 = cv.imread('myleft.jpg', 0)  # queryimage # left image
img2 = cv.imread('myright.jpg', 0)  # trainimage # right image
sift = cv.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with SIFT
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 an 8-point algorithm. N8

·           cv2.FM_RANSAC (默认) for the RANSAC algorithm. N8

·           cv2.FM_LMEDS for the LMedS algorithm. N8

·           ransacReprojThreshold仅用于RANSAC方法的参数,默认3。它是一个点到极线的最大距离(以像素为单位),超过这个点就被认为是一个离群点,不用于计算最终的基本矩阵。根据点定位、图像分辨率和图像噪声的准确性,可以将其设置为1-3左右。

·           confidence仅用于RANSACLMedS方法的参数,默认0.99。它指定了一个理想的置信水平(概率),即估计矩阵是正确的。

·           mask输出

pts1 = np.int32(pts1)

pts2 = np.int32(pts2)

F, mask = cv.findFundamentalMat(pts1, pts2, cv.FM_LMEDS)

# 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.computeCorrespondEpilines(points, whichImage, F, lines)

·           points输入点。类型为CV_32FC2N×11×N矩阵。

·           whichImage包含点的图像(12)的索引。

·           F基本矩阵,可使用findFundamentalMatstereoRectify 进行估计。

·           lines对应于另一幅图像中点的极线的输出向量(abc)表示直线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(121), plt.imshow(img5)
plt.subplot(122), plt.imshow(img3)
plt.show()

最终整个程序:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
 
 
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
 
 
img1 = cv.imread('myleft.jpg', 0)  # queryimage # left image
img2 = cv.imread('myright.jpg', 0)  # trainimage # right image
sift = cv.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with SIFT
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)
 
pts1 = np.int32(pts1)
pts2 = np.int32(pts2)
F, mask = cv.findFundamentalMat(pts1, pts2, cv.FM_LMEDS)
# We select only inlier points
pts1 = pts1[mask.ravel() == 1]
pts2 = pts2[mask.ravel() == 1]
 
# 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(121), plt.imshow(img5)
plt.subplot(122), plt.imshow(img3)
plt.show()

结果:

image.png

我们可以在左侧图像中看到所有Epilines都在右侧图像的一点处收敛。那个汇合点就是极点。

 


对计算机视觉感兴趣?这个社区推荐给你~

>>点击了解OpenVINO生态开发社区



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
klf是什么意思 豚是什么动物 唇炎看什么科最好 色令智昏是什么意思 依西美坦最佳服用时间是什么时间
上户口需要什么资料 甘油三酯偏高说明什么问题 颈椎痛挂什么科 三四月份是什么星座 嗓子疼吃什么消炎药
8月12号是什么星座 燕子每年从什么方飞往什么方过冬 正的五行属性是什么 一月来两次月经是什么原因 眼屎多什么原因
阴离子是什么 风湿性关节炎挂什么科 月经少吃什么好排血多 喝酒手掌发红是什么原因 夏天吃什么水果最好
什么鱼清蒸好吃hcv7jop6ns7r.cn 酉时右眼跳是什么预兆jasonfriends.com 小孩晚上睡觉流口水是什么原因hcv8jop0ns0r.cn 复方氨酚苯海拉明片是什么药hcv7jop9ns4r.cn 高压氧是什么hcv9jop8ns0r.cn
泛指是什么意思hcv9jop1ns1r.cn 竖小拇指什么意思gangsutong.com 心脏五行属什么hcv8jop8ns3r.cn 维字五行属什么hcv8jop7ns4r.cn 肠粉是用什么粉做的hcv9jop3ns6r.cn
甘草是什么hcv8jop4ns9r.cn 绿草如茵是什么生肖hcv8jop5ns9r.cn 什么酒适合女生喝hcv8jop4ns9r.cn 憨憨是什么意思hcv9jop0ns0r.cn 嗷嗷待哺是什么意思hcv8jop3ns8r.cn
死了妻子的男人叫什么cl108k.com 吃大虾不能吃什么hcv9jop1ns7r.cn jewelry什么意思zhiyanzhang.com 见血封喉什么意思hcv9jop0ns4r.cn 9月份什么星座inbungee.com
百度