计算机视觉--多视几何初步尝试

基础矩阵的原理

在这里插入图片描述
K和K’分别是两个相机的参数矩阵。p和p’是X在平面π的坐标表示。所以可以得出
在这里插入图片描述
在这里插入图片描述
具体计算过程
在这里插入图片描述
代码:
#!/usr/bin/env python
coding: utf-8

from PIL import Image
from numpy import *
from pylab import *
import numpy as np
from imp import reload

#In[2]:
import importlib
from PCV.geometry import camera
from PCV.geometry import homography
from PCV.geometry import sfm
from PCV.localdescriptors import sift
camera = reload(camera)
homography = reload(homography)
sfm = reload(sfm)
sift = reload(sift)

Read features
im1 = array(Image.open(‘E:/Py_code/photo/ch5_1/t1.jpg’))
sift.process_image(‘E:/Py_code/photo/ch5_1/t1.jpg’, ‘im1.sift’)
l1, d1 = sift.read_features_from_file(‘im1.sift’)

im2 = array(Image.open(‘E:/Py_code/photo/ch5_1/t2.jpg’))
sift.process_image(‘E:/Py_code/photo/ch5_1/t2.jpg’, ‘im2.sift’)
l2, d2 = sift.read_features_from_file(‘im2.sift’)

matches = sift.match_twosided(d1, d2)

ndx = matches.nonzero()[0]
x1 = homography.make_homog(l1[ndx, :2].T)
ndx2 = [int(matches[i]) for i in ndx]
x2 = homography.make_homog(l2[ndx2, :2].T)

x1n = x1.copy()
x2n = x2.copy()

print (len(ndx))

figure(figsize=(16, 16))
sift.plot_matches(im1, im2, l1, l2, matches, True)
show()

Chapter 5 Exercise 1
Don’t use K1, and K2

#def F_from_ransac(x1, x2, model, maxiter=5000, match_threshold=1e-6):
def F_from_ransac(x1, x2, model, maxiter=5000, match_threshold=1e-6):
“”" Robust estimation of a fundamental matrix F from point
correspondences using RANSAC (ransac.py from
http://www.scipy.org/Cookbook/RANSAC).

input: x1, x2 (3*n arrays) points in hom. coordinates. """

from PCV.tools import ransac
data = np.vstack((x1, x2))
d = 20  # 20 is the original
# compute F and return with inlier index
F, ransac_data = ransac.ransac(data.T, model, 8, maxiter, match_threshold, d, return_all=True)
return F, ransac_data['inliers']

find E through RANSAC
model = sfm.RansacModel()
F, inliers = F_from_ransac(x1n, x2n, model, maxiter=5000, match_threshold=1e-2)

print (len(x1n[0]))
print (len(inliers))

P1 = array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]])
P2 = sfm.compute_P_from_fundamental(F)

#triangulate inliers and remove points not in front of both cameras
X = sfm.triangulate(x1n[:, inliers], x2n[:, inliers], P1, P2)

#plot the projection of X
cam1 = camera.Camera(P1)
cam2 = camera.Camera(P2)
x1p = cam1.project(X)
x2p = cam2.project(X)

figure()
imshow(im1)
gray()
plot(x1p[0], x1p[1], ‘o’)
#plot(x1[0], x1[1], ‘r.’)
axis(‘off’)

figure()
imshow(im2)
gray()
plot(x2p[0], x2p[1], ‘o’)
#plot(x2[0], x2[1], ‘r.’)
axis(‘off’)
show()

figure(figsize=(16, 16))
im3 = sift.appendimages(im1, im2)
im3 = vstack((im3, im3))

imshow(im3)

cols1 = im1.shape[1]
rows1 = im1.shape[0]
for i in range(len(x1p[0])):
if (0 <= x1p[0][i] < cols1) and (0 <= x2p[0][i] < cols1) and (0 <= x1p[1][i] < rows1) and (0 <= x2p[1][i] < rows1):
plot([x1p[0][i], x2p[0][i] + cols1], [x1p[1][i], x2p[1][i]], ‘c’)
axis(‘off’)
show()

print (F)

#Chapter 5 Exercise 2

x1e = []
x2e = []
ers = []
for i, m in enumerate(matches):
if m > 0: # plot([locs1[i][0],locs2[m][0]+cols1],[locs1[i][1],locs2[m][1]],‘c’)

    p1 = array([l1[i][0], l1[i][1], 1])
    p2 = array([l2[m][0], l2[m][1], 1])

    # Use Sampson distance as error
    Fx1 = dot(F, p1)
    Fx2 = dot(F, p2)
    denom = Fx1[0] ** 2 + Fx1[1] ** 2 + Fx2[0] ** 2 + Fx2[1] ** 2
    e = (dot(p1.T, dot(F, p2))) ** 2 / denom
    x1e.append([p1[0], p1[1]])
    x2e.append([p2[0], p2[1]])
    ers.append(e)

x1e = array(x1e)
x2e = array(x2e)
ers = array(ers)

indices = np.argsort(ers)
x1s = x1e[indices]
x2s = x2e[indices]
ers = ers[indices]
x1s = x1s[:20]
x2s = x2s[:20]

#In[25]:

figure(figsize=(16, 16))
im3 = sift.appendimages(im1, im2)
im3 = vstack((im3, im3))

imshow(im3)

cols1 = im1.shape[1]
rows1 = im1.shape[0]
for i in range(len(x1s)):
if (0 <= x1s[i][0] < cols1) and (0 <= x2s[i][0] < cols1) and (0 <= x1s[i][1] < rows1) and (0 <= x2s[i][1] < rows1):
plot([x1s[i][0], x2s[i][0] + cols1], [x1s[i][1], x2s[i][1]], ‘c’)
axis(‘off’)
show()

实验结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改算法之后的结果
在这里插入图片描述

版权声明:本文为theblacksummer原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/theblacksummer/article/details/89385190

智能推荐

ActiveMQ学习4-ActiveMQ的安全机制和集群模式

ActiveMQ的安全机制和集群模式 20 ActiveMQ安全机制 20.1 Web 控制台安全 20.2 消息服务器Broker安全 21 ActiveMQ主从集群 21.1 使用集群的重要性 20.2 主从集群的方式 20.2.1 shared filesystem Master-Slave方式主从集群 20.2.2 shared database Master-Slave方式主从集群 20...

说说 Python Django 应用的基础目录结构

通过以下 django-admin 指令创建应用之后,就会生成应用的基础目录结构。 比如,我们建立了一个叫 ‘first’ 的应用,它的目录结构是这样的: 目录或文件 说明 最外层的 first/ 这是新应用的根目录,所有与该应用相关的内容都放在这里。 manage.py 用于管理 Django 项目的命令行工具。 里面一层的 first/ 目录 是一个...

Springboot整合rabbitMQ

依赖: 配置文件application.yml RabbitConfig 消息生产者RabbitProducer 消息消费者RabbitCustomer 通过Controller进行调用 启动项目后调用接口: 结果:...

Thread.join()方法的使用

如果一个线程A执行了thread.join()语句,代表当前线程A等待thread线程终止后才从thread.join()方法返回 并且这个方法具有超时特性,可以添加参数设置 输出结果: jdk中Thread.join()方法的源码(进行了部门调整)   每个线程终止的条件是前驱线程的终止,每个线程等待前驱线程终止后,才从join()方法返回,  当线程终止时,会调用自身的no...

linux服务器部署jenkins笔记

安装jenkins参考文档:https://blog.csdn.net/tomatocc/article/details/83930714 1. 打开jenkins官网:https://jenkins.io/download/ 将war包下载到本地 **ps:**这里要注意的是要下载左边下方的war包,不要下载右边下面的war包。左边是稳定版本,右边是最新版本,建议大家使用稳定版本(我刚开始下载的...

猜你喜欢

k8s部署elasticsearch集群

百度营销大学     环境准备 我们使用的k8s和ceph环境见: https://blog.51cto.com/leejia/2495558 https://blog.51cto.com/leejia/2499684 ECK简介 Elastic Cloud on Kubernetes,这是一款基于 Kubernetes Operator 模式的新型编排产品,用户可使用该产品在...

saas-export项目-AdminLTE介绍与入门

AdminLTE介绍 (1)AdminLTE是什么? AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具 (2)AdminLTE有什么特点? 提供一系列响应的、可重复使用的组件, 并内置了多个模板页面 自适应多种屏幕分辨率,兼容PC和移动端 快速的创建一个响应式的Html5网站 AdminLTE 不但美观, 而且可以免去写很大CSS与JS的工作量 AdminLTE...

MyBatis中ResultMap结果集映射

用于解决属性名和字段名不一致的情况: resultMap 元素是 MyBatis 中最重要最强大的元素。...

编写一个shell

编写shell的过程: 1.从标准输入中读入一个字符串。 2.解析字符串 3.创建一个子进程的执行程序。 4.子进程程序替换。 5.父进程等待子进程退出。...

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...