畫極線

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.pswp.cn/news/251965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251965.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251965.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Win10開啟Administrator超級管理員賬戶

方法1 1、在系統的開始菜單上&#xff0c;我們單擊鼠標右鍵&#xff0c;然后選擇計算機管理打開進入 2、打開的計算機管理窗口&#xff0c;點擊本地用戶和組中的用戶打開&#xff0c;然后點擊右側的Administrator賬戶&#xff0c;雙擊鼠標打開進入 3、打開的屬性窗口中&#xf…

Mysql異常問題排查與處理——mysql的DNS反向解析和客戶端網卡重啟

中午剛想趴一會&#xff0c;不料鍋從天降&#xff01;&#xff01;&#xff01;Mysql連不上了。。。。。。。 現象如下&#xff1a; 現象1&#xff1a;登錄mysql所在服務器&#xff0c;連接MySQL 成功&#xff1b; 現象2&#xff1a;通過客戶端遠程連接MySQL&#xff0c;返回失…

最近很火的MySQL:拋開復雜的架構設計,MySQL優化思想基本都在這

優化一覽圖 優化 筆者將優化分為了兩大類&#xff1a;軟優化和硬優化。軟優化一般是操作數據庫即可&#xff1b;而硬優化則是操作服務器硬件及參數設置。 1、軟優化 1&#xff09;查詢語句優化 首先我們可以用EXPLAIN或DESCRIBE(簡寫:DESC)命令分析一條查詢語句的執行信息。 例…

【讀書筆記】《深入淺出Webpack》

Webpack版本 分析版本為3.6.0 4.0為最近升級的版本&#xff0c;與之前版本變化較大&#xff0c;編譯輸出的文件與3.0版本會不一致&#xff0c;目前項目中使用的版本3.0版本&#xff0c;所以基于3.0版本進行分析學習。 Webpack構建流程 初始化&#xff1a;啟動構建&#xff0c;讀…

《JAVA與模式》之橋梁模式

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述橋梁&#xff08;Bridge&#xff09;模式的&#xff1a; 橋梁模式是對象的結構模式。又稱為柄體(Handle and Body)模式或接口(Interface)模式。橋梁模式的用意是“將抽象化(Abstraction)與實現化(Implementation)脫耦&#xff0…

LABLEME UPDATE DAMOD

Labelme的改進——海量圖片的自動標注 深度學習一般需要對大量的圖片進行標注&#xff0c;但是手動標注耗時耗力&#xff0c;所以模仿labelme軟件的功能&#xff0c;使用程序對大批量的圖片進行自動標注&#xff0c;大大減少手動操作。下面介紹如何實現對大批量的圖片進行標…

Java基礎教程:面向對象編程[2]

Java基礎教程&#xff1a;面向對象編程[2] 內容大綱 訪問修飾符 四種訪問修飾符 Java中&#xff0c;可以使用訪問控制符來保護對類、變量、方法和構造方法的訪問。Java 支持 4 種不同的訪問權限。 default (即缺省&#xff0c;什么也不寫&#xff09;: 在同一包內可見&#xff…

【javascript】異步編年史,從“純回調”到Promise

異步和分塊——程序的分塊執行 一開始學習javascript的時候&#xff0c; 我對異步的概念一臉懵逼&#xff0c; 因為當時百度了很多文章&#xff0c;但很多各種文章不負責任的把籠統的描述混雜在一起&#xff0c;讓我對這個 JS中的重要概念難以理解&#xff0c; “異步是非阻塞的…

Shell編程之if語法練習(LNMP)全過程

大家好&#xff0c;我是延凱&#xff0c;本人原來在CSDN寫作已經快一年了 都是相關Linux運維這方面的技術知識&#xff0c;現在搬到博客園也是我一直想的&#xff0c;本博客主要寫Python&#xff0c;docker&#xff0c;shell等偏向開發云計算等知識點&#xff0c;謝謝各位&…

基于UNet和camvid數據集的道路分割

基于UNet和camvid數據集的道路分割h(1.3.0)&#xff1a; 背景 語義分割是深度學習中的一個非常重要的研究方向&#xff0c;并且UNet是語義分割中一個非常經典的模型。在本次博客中&#xff0c;我嘗試用UNet對camvid dataset數據集進行道路分割&#xff0c;大致期望的效果如下&…

二分法查找和普通查找

一、普通查找 對于數組和一個需要查找的元素來說&#xff0c;普通查找的原理很簡單&#xff0c;即為從數組的第一個元素到最后一個元素進行遍歷&#xff0c;如果第i個元素的值等于我們需要查找的值&#xff0c;那么返回找到的角標i&#xff0c;否則返回-1表示沒有查找到。這里以…

Linux下安裝zookeeper集群(奇數個)

1、 解壓zookeeper壓縮包 2、 data里創建“myid”文件&#xff08;命令touch myid&#xff09;&#xff0c;內容是1&#xff08;命令 echo 1 >> myid&#xff09; 3、 zoo.cnf里配置dataDir、clientport、server.nIP:端口1&#xff08;2881&#xff09;&#xff1a;端…

立體標定

立體標定應用標定數據轉換成深度圖標定 由于攝像頭目前是我們手動進行定位的&#xff0c;我們現在還不知道兩張圖像與世界坐標之間的耦合關系&#xff0c;所以下一步要進行的是標定&#xff0c;用來確定分別獲取兩個攝像頭的內部參數&#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; 在右側消息頭處…