画极线

OpenCV学习日记5

2017-05-27 10:44:35 1000sprites 阅读数 2339更多

分类专栏: 计算机视觉

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/shengshengwang/article/details/72779289

1. solvePnP,cvPOSIT(过时),solvePnPRansac [1][2]

解析:给定物体3D点集与对应的图像2D点集,以及摄像头内参数的情况下计算物体的3D姿态。solvePnP和cvPOSIT

的输出都是旋转矩阵和位移向量,不过solvePnP是精确解,cvPOSIT是近似解。因为solvePnP调用的是

cvFindExtrinsicCameraParams2,通过已知的内参进行未知外参求解;而cvPOSIT是用仿射投影模型近似透视投影模

型,不断迭代计算出估计值(在物体深度变化相对于物体到摄像机的距离比较大时,该算法可能不收敛)。

solvePnP和solvePnPRansac函数原型,如下所示:

(1)cv2.solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, flags]]]]) 

→ retval, rvec, tvec

(2)cv2.solvePnPRansac(objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, 

iterationsCount[, reprojectionError[, minInliersCount[, inliers[, flags]]]]]]]]) → rvec, tvec, inliers

 

2. 对极几何(Epipolar Geometry)

解析:

在双目立体视觉系统中,有两个摄像机在不同角度拍摄物理空间中的同一实体点,在两副图像上分别有两个成像点。

立体匹配就是已知其中的一个成像点,在另一副图像上找出该成像点的对应点。极线几何约束是一种常用的匹配约束

技术,它是一种点对直线的约束,将对应点匹配从整幅图像寻找压缩到在一条直线上寻找。

 
  1. import cv2

  2. import numpy as np

  3. from matplotlib import pyplot as plt

  4.  
  5. img1 = cv2.imread('myleft.jpg',0) #queryimage # left image

  6. img2 = cv2.imread('myright.jpg',0) #trainimage # right image

  7.  
  8. sift = cv2.SIFT()

  9. # find the keypoints and descriptors with SIFT

  10. kp1, des1 = sift.detectAndCompute(img1,None)

  11. kp2, des2 = sift.detectAndCompute(img2,None)

  12.  
  13. # FLANN parameters

  14. FLANN_INDEX_KDTREE = 0

  15. index_params = dict(algorithm=FLANN_INDEX_KDTREE,trees=5)

  16. search_params = dict(checks=50)

  17. flann = cv2.FlannBasedMatcher(index_params,search_params)

  18. matches = flann.knnMatch(des1,des2,k=2)

  19.  
  20. good = []

  21. pts1 = []

  22. pts2 = []

  23.  
  24. # ratio test as per Lowe's paper

  25. for i,(m,n) in enumerate(matches):

  26. if m.distance < 0.8*n.distance:

  27. good.append(m)

  28. pts2.append(kp2[m.trainIdx].pt)

  29. pts1.append(kp1[m.queryIdx].pt)

  30.  
  31. pts1 = np.float32(pts1)

  32. pts2 = np.float32(pts2)

  33. F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)

  34.  
  35. # we select only inlier points

  36. pts1 = pts1[mask.ravel()==1]

  37. pts2 = pts2[mask.ravel()==1]

  38.  
  39. def drawlines(img1,img2,lines,pts1,pts2):

  40. ''' img1 - image on which we draw the epilines for the points in img2

  41. lines - corresponding epilines

  42. '''

  43. r,c = img1.shape

  44. img1 = cv2.cvtColor(img1,cv2.COLOR_GRAY2BGR)

  45. img2 = cv2.cvtColor(img2,cv2.COLOR_GRAY2BGR)

  46. for r,pt1,pt2 in zip(lines,pts1,pts2):

  47. color = tuple(np.random.randint(0,255,3).tolist())

  48. x0,y0 = map(int, [0,-r[2]/r[1]])

  49. x1,y1 = map(int, [c,-(r[2]+r[0]*c)/r[1]])

  50. img1 = cv2.line(img1, (x0,y0), (x1,y1), color, 1)

  51. img1 = cv2.circle(img1,tuple(pt1),5,color,-1)

  52. img2 = cv2.circle(img2,tuple(pt2),5,color,-1)

  53. return img1,img2

  54.  
  55. # find epilines corresponding to points in right image (second image) and

  56. # drawing its lines on left image

  57. lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1,1,2), 2,F)

  58. lines1 = lines1.reshape(-1,3)

  59. img5,img6 = drawlines(img1,img2,lines1,pts1,pts2)

  60.  
  61. # find epilines corresponding to points in left image (first image) and

  62. # drawing its lines on right image

  63. lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1,1,2), 1,F)

  64. lines2 = lines2.reshape(-1,3)

  65. img3,img4 = drawlines(img2,img1,lines2,pts2,pts1)

  66.  
  67. plt.subplot(121),plt.imshow(img5)

  68. plt.subplot(122),plt.imshow(img3)

  69. plt.show()

结果输出,如下所示:

说明:findFundamentalMat和computeCorrespondEpilines函数原型,如下所示:

(1)cv2.findFundamentalMat(points1, points2[, method[, param1[, param2[, mask]]]]) → retval, mask

(2)cv2.computeCorrespondEpilines(points, whichImage, F[, lines]) → lines

 

3. 立体图像中的深度地图

解析:如果同一场景有两幅图像,那么就可以获得图像的深度信息。如下所示:

构建立体图像中的深度地图过程,如下所示:

 
  1. import cv2

  2. from matplotlib import pyplot as plt

  3.  
  4. imgL = cv2.imread('tsukuba_l.png',0)

  5. imgR = cv2.imread('tsukuba_r.png',0)

  6. stereo = cv2.createStereoBM(numDisparities=16, blockSize=15)

  7. disparity = stereo.compute(imgL,imgR)

  8. plt.imshow(disparity,'gray')

  9. plt.show()

结果输出,如下所示:

说明:左侧为原始图像,右侧为深度图像。结果中的噪音可以通过调整numDisparities和blockSize得到更好的结果。

createStereoBM函数原型为cv2.createStereoBM([numDisparities[, blockSize]]) → retval。

 

4. BRIEF算子详解 [4]

解析:BRIEF(Binary Robust Independent Elementary Features)是一种对特征点描述子计算和匹配的快速方法,

但它不提供查找特征的方法,原始文献推荐使用CenSurE特征检测器。同时它不具备旋转不变性和尺度不变性而且对

噪声敏感。如下所示:

 
  1. import cv2

  2.  
  3. img = cv2.imread('simple.jpg',0)

  4. # initiate STAR detector

  5. star = cv2.FeatureDetector_create("STAR")

  6. # initiate BRIEF extractor

  7. brief = cv2.DescriptorExtractor_create("BRIEF")

  8. # find the keypoints with STAR

  9. kp = star.detect(img,None)

  10. # compute the descriptors with BRIEF

  11. kp, des = brief.compute(img, kp)

  12. print brief.getInt('bytes')

  13. print des.shape

说明:在OpenCV中CenSurE检测器叫做STAR检测器。

 

5.opencv-4.0.0和Windows 7:ImportError: ERROR: recursion is detected during loading of "cv2" binary extensions. Check OpenCV installation

解析:

(1)将D:\opencv-4.0.0\build\python\cv2\python-3.6\cv2.cp36-win_amd64.pyd修改为cv2.pyd,然后拷贝到D:\Anaconda3\Lib\site-packages目录。

(2)将D:\opencv-4.0.0\build\x64\vc15\bin目录下的.dll文件拷贝到D:\Anaconda3\Library\bin目录。

 

参考文献:

[1] Camera Calibration and 3D Reconstruction:

http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

[2] 三维姿态:关于solvePnP与cvPOSIT:http://blog.csdn.net/abc20002929/article/details/8520063

[3] 极线约束(epipolar constraint):http://blog.csdn.net/tianwaifeimao/article/details/19544861

[4] createStereoBM:http://docs.opencv.org/3.0-

beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#cv2.createStereoBM

[5] 特征工程BRIEF:http://dnntool.com/2017/03/27/brief/

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

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

相关文章

最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这

优化一览图 优化 笔者将优化分为了两大类&#xff1a;软优化和硬优化。软优化一般是操作数据库即可&#xff1b;而硬优化则是操作服务器硬件及参数设置。 1、软优化 1&#xff09;查询语句优化 首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息。 例…

《JAVA与模式》之桥梁模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述桥梁&#xff08;Bridge&#xff09;模式的&#xff1a; 桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦&#xff0…

Java基础教程:面向对象编程[2]

Java基础教程&#xff1a;面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中&#xff0c;可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。 default (即缺省&#xff0c;什么也不写&#xff09;: 在同一包内可见&#xff…

【javascript】异步编年史,从“纯回调”到Promise

异步和分块——程序的分块执行 一开始学习javascript的时候&#xff0c; 我对异步的概念一脸懵逼&#xff0c; 因为当时百度了很多文章&#xff0c;但很多各种文章不负责任的把笼统的描述混杂在一起&#xff0c;让我对这个 JS中的重要概念难以理解&#xff0c; “异步是非阻塞的…

if _name_ == _main_

1.作用 py文件有2种使用方法&#xff0c;第1是自己本脚本自己独立执行&#xff1b;第2是被import到其他文件脚本中执行. if _name_ " _main_" 该语句控制其他下一步的脚本是否执行。如果是自己本脚本独立执行&#xff0c;那就运行该if条件下的脚本&#xff1b;如果…

LLVM完整参考安装

文章目录 一、直接下载编译好的,见图片命令二、下载源代码自己编译安装 下面提供下载并mv完全的文件包三、安装LLVM编译器一、直接下载编译好的,见图片命令 这里使用llvm官网编译好的包, 直接解压即可用LLVM下载官网点击这里下载llvm-6.0.1 下载完成后解压tar -vxf clangllv…

微软正式释出基于 Chromium 的 Edge 预览版本

百度智能云域名服务&#xff0c;.com新用户首购仅需25元 微软基于 Chromium 的全新版本 Edge 一直吸引着开发者与用户的目光&#xff0c;当地时间 8 日&#xff0c;官方终于释出了第一个 Dev 和 Canary 频道构建版本。 Dev 与 Canary build 都是开发者预览版&#xff0c;同属…

下载和安装R、RStudio !

现如今&#xff0c;R语言是统计领域广泛使用的工具&#xff0c;是属于GNU系统的一个自由、免费、源代码开放的软件&#xff0c;是用于统计计算和统计绘图的优秀工具。而RStudio是R的集成开发环境&#xff0c;用它进行R编程的学习和实践会更加轻松和方便。下面就教大家如何下载并…

豆瓣首页话题输入框的实现

在做问答的时候&#xff0c;遇到一个需求&#xff0c;用户的问题需要限制字数&#xff0c;不仅显示计算的超出字数&#xff0c;还需在超出的内容上加一些提醒的效果&#xff0c;例如豆瓣首页的话题输入框&#xff0c;抽时间研究了下&#xff0c;需要考虑下面几个问题&#xff1…

pytorch 吸烟检测yolov5s

YOLOV5s 吸烟目标检测 参考学习 文章目录 本原创项目长期更新&#xff0c;旨在完成校园异常行为实时精检测&#xff0c;作到集成N次开发优化&#xff08;不止局限于调包&#xff09;为止&#xff0c;近期将不断更新如下模型数据标注文件教程。关注博主&#xff0c;Star 一下g…

JQuery的ajax函数执行失败,alert函数弹框一闪而过

先查看<form>标签是否有action属性&#xff0c;如果没有&#xff0c;并且最后<button>标签的type属性为submit‘时&#xff0c;默认提交位置就是当前页面 如果在页面右键检查&#xff0c;点击网络&#xff0c;会在开头发现这样的post包&#xff1a; 在右侧消息头处…

postgresql 不同数据库不同模式下的数据迁移

编写不容易,转载请注明出处谢谢, 数据迁移 因为之前爬虫的时候&#xff0c;一部分数据并没有上传到服务器&#xff0c;在本地。本来用的就是postgresql&#xff0c;也没用多久&#xff0c;数据迁移的时候&#xff0c;也遇到了很多问题&#xff0c;第一次使pg_dump xx > file…

Oracle中主键自增长

最近在学习Oracle和MySql&#xff0c;MySql有自动配置主键自增长auto_increment&#xff0c;这样在输入数据的时候可以不考虑主键的添加&#xff0c;方便对数据库的操作。 在Oracle中设置自增长首先用到sequence序列&#xff1b; 以创建学生表为例&#xff1a; create table St…

docker与mmdetection

这里不再介绍 mmdetection 的安装和配置&#xff0c;使用 mmdetection 较简单的方法是使用已安装 mmdetection 的 docker 容器。这样直接省去了安装 mmdetection 的过程&#xff0c;让重心放在模型训练上&#xff01; 如果你对 docker 和 mmdetection 还不是很熟悉&#xff0c…

正斜杠( / )和反斜杠( \ )的区别

反斜杠“\”是电脑出现了之后为了表示程序设计里的特殊含义才发明的专用标点。所以除了程序设计领域外&#xff0c;任何地方都不应该使用反斜杠。 如何区分正反斜杠 英语&#xff1a;"/" 英文是forward slash, “\" 是backward slash形象些比喻的话&#xff0c;…

MMDetectionV2 + Colab

MMDetectionV2 Colab 超详细教程及踩坑实录 文章目录 前言一、环境配置二、准备自己的数据集 Aug.14更新三&#xff1a;修改config文件 3.1 文件结构3.2 &#xff08;本地&#xff09;修改config文件 3.2.1 &#xff08;本地&#xff09;构造自己模型的权重文件3.2.2 &#x…

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

刚刚&#xff0c;OpenStack 第 19 个版本来了&#xff0c;附28项特性详细解读&#xff01; OpenStack Stein版本引入了新的多云编排功能&#xff0c;以及帮助实现边缘计算用例的增强功能。 OpenStack由一系列相互关联的项目组成&#xff0c;这些项目可以以不同的组合方式组合在…

SQL作业:综合练习(二)的返评

一&#xff1a;作业题目&#xff1a;综合练习&#xff08;二&#xff09; 二&#xff1a;题目要求&#xff1a; 1、创建数据库CPXS&#xff0c;保存于E盘根目录下以自己学号姓第一个字母&#xff08;阿拉伯数字大写字母&#xff09;方式创建的文件夹中&#xff0c;初始大小5MB&…

paddlepaddle-VisualDL2.0对项目进行可视化调参

如果需要更好的阅读体验&#xff0c;可以在ai studio上fork该项目&#xff1a;使用VisualDL2.0对项目进行可视化调参 调参是深度学习必须要做的事情。数据和模型处理好后&#xff0c;需要进行模型训练&#xff0c;这个时候就需要进行调参了。一种好的参数配置&#xff0c;可以…

第一、二次实训作业

1.编写程序&#xff1a; 声明一个整型变量a&#xff0c;并赋初值5&#xff0c;在程序中判断a是奇数还是偶数&#xff0c;然后输出判断的结果。 package 判断奇偶; public class liux { public static void main(String[] args){ int x5; if(x%20){ System.out.println("这…