立體標定

  • 立體標定
  • 應用標定數據
  • 轉換成深度圖

標定

由于攝像頭目前是我們手動進行定位的,我們現在還不知道兩張圖像與世界坐標之間的耦合關系,所以下一步要進行的是標定,用來確定分別獲取兩個攝像頭的內部參數,并且根據兩個攝像頭在同一個世界坐標下的標定參數來獲取立體參數。注:不要使用OpenCV自帶的自動calbration,其對棋盤的識別率極低,使用Matlab的Camera Calibration Toolbox更為有效,具體細節請看:攝像機標定和立體標定

同時從兩個攝像頭獲取圖片

import cv2
import timeAUTO = True  # 自動拍照,或手動按s鍵拍照
INTERVAL = 2 # 自動拍照間隔cv2.namedWindow("left")
cv2.namedWindow("right")
cv2.moveWindow("left", 0, 0)
cv2.moveWindow("right", 400, 0)
left_camera = cv2.VideoCapture(0)
right_camera = cv2.VideoCapture(1)counter = 0
utc = time.time()
pattern = (12, 8) # 棋盤格尺寸
folder = "./snapshot/" # 拍照文件目錄def shot(pos, frame):global counterpath = folder + pos + "_" + str(counter) + ".jpg"cv2.imwrite(path, frame)print("snapshot saved into: " + path)while True:ret, left_frame = left_camera.read()ret, right_frame = right_camera.read()cv2.imshow("left", left_frame)cv2.imshow("right", right_frame)now = time.time()if AUTO and now - utc >= INTERVAL:shot("left", left_frame)shot("right", right_frame)counter += 1utc = nowkey = cv2.waitKey(1)if key == ord("q"):breakelif key == ord("s"):shot("left", left_frame)shot("right", right_frame)counter += 1left_camera.release()
right_camera.release()
cv2.destroyWindow("left")
cv2.destroyWindow("right")

?

在進行標定的過程中,要注意的是在上面標定方法中沒有提到的是,單個標定后,要對標定的數據進行錯誤分析(Analyse Error),如左圖,是我對左攝像頭的標定結果分析。圖中天藍色點明顯與大部分點不聚斂,所以有可能是標定時對這個圖片標定出現的錯誤,要重新標定,在該點上點擊并獲取其圖片名稱索引,對其重新標定后,右圖的結果看起來還是比較滿意的

?

在進行完立體標定后,我們將得到如下的數據:

Stereo calibration parameters after optimization:Intrinsic parameters of left camera:Focal Length:          fc_left = [ 824.93564   825.93598 ]  [ 8.21112   8.53492 ]
Principal point:       cc_left = [ 251.64723   286.58058 ]  [ 13.92642   9.11583 ]
Skew:             alpha_c_left = [ 0.00000 ]  [ 0.00000  ]   => angle of pixel axes = 90.00000  0.00000 degrees
Distortion:            kc_left = [ 0.23233   -0.99375   0.00160   0.00145  0.00000 ]  [ 0.05659   0.30408   0.00472   0.00925  0.00000 ]Intrinsic parameters of right camera:Focal Length:          fc_right = [ 853.66485   852.95574 ]  [ 8.76773   9.19051 ]
Principal point:       cc_right = [ 217.00856   269.37140 ]  [ 10.40940   9.47786 ]
Skew:             alpha_c_right = [ 0.00000 ]  [ 0.00000  ]   => angle of pixel axes = 90.00000  0.00000 degrees
Distortion:            kc_right = [ 0.30829   -1.61541   0.01495   -0.00758  0.00000 ]  [ 0.06567   0.55294   0.00547   0.00641  0.00000 ]Extrinsic parameters (position of right camera wrt left camera):Rotation vector:             om = [ 0.01911   0.03125  -0.00960 ]  [ 0.01261   0.01739  0.00112 ]
Translation vector:           T = [ -70.59612   -2.60704  18.87635 ]  [ 0.95533   0.79030  5.25024 ]

應用標定數據

我們使用如下的代碼來將其配置到python中,上面的參數都是手動填寫至下面的內容中的,這樣免去保存成文件再去讀取,在托運填寫的時候要注意數據的對應位置

# filename: camera_configs.py
import cv2
import numpy as npleft_camera_matrix = np.array([[824.93564, 0., 251.64723],[0., 825.93598, 286.58058],[0., 0., 1.]])
left_distortion = np.array([[0.23233, -0.99375, 0.00160, 0.00145, 0.00000]])right_camera_matrix = np.array([[853.66485, 0., 217.00856],[0., 852.95574, 269.37140],[0., 0., 1.]])
right_distortion = np.array([[0.30829, -1.61541, 0.01495, -0.00758, 0.00000]])om = np.array([0.01911, 0.03125, -0.00960]) # 旋轉關系向量
R = cv2.Rodrigues(om)[0]  # 使用Rodrigues變換將om變換為R
T = np.array([-70.59612, -2.60704, 18.87635]) # 平移關系向量size = (640, 480) # 圖像尺寸# 進行立體更正
R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(left_camera_matrix, left_distortion,right_camera_matrix, right_distortion, size, R,T)
# 計算更正map
left_map1, left_map2 = cv2.initUndistortRectifyMap(left_camera_matrix, left_distortion, R1, P1, size, cv2.CV_16SC2)
right_map1, right_map2 = cv2.initUndistortRectifyMap(right_camera_matrix, right_distortion, R2, P2, size, cv2.CV_16SC2)

這樣,我們得到了左右攝像頭的兩個map,并得到了立體的Q,這些參數都將應用于下面的轉換成深度圖中

轉換成深度圖

import numpy as np
import cv2
import camera_configscv2.namedWindow("left")
cv2.namedWindow("right")
cv2.namedWindow("depth")
cv2.moveWindow("left", 0, 0)
cv2.moveWindow("right", 600, 0)
cv2.createTrackbar("num", "depth", 0, 10, lambda x: None)
cv2.createTrackbar("blockSize", "depth", 5, 255, lambda x: None)
camera1 = cv2.VideoCapture(0)
camera2 = cv2.VideoCapture(1)# 添加點擊事件,打印當前點的距離
def callbackFunc(e, x, y, f, p):if e == cv2.EVENT_LBUTTONDOWN:        print threeD[y][x]cv2.setMouseCallback("depth", callbackFunc, None)while True:ret1, frame1 = camera1.read()ret2, frame2 = camera2.read()if not ret1 or not ret2:break# 根據更正map對圖片進行重構img1_rectified = cv2.remap(frame1, camera_configs.left_map1, camera_configs.left_map2, cv2.INTER_LINEAR)img2_rectified = cv2.remap(frame2, camera_configs.right_map1, camera_configs.right_map2, cv2.INTER_LINEAR)# 將圖片置為灰度圖,為StereoBM作準備imgL = cv2.cvtColor(img1_rectified, cv2.COLOR_BGR2GRAY)imgR = cv2.cvtColor(img2_rectified, cv2.COLOR_BGR2GRAY)# 兩個trackbar用來調節不同的參數查看效果num = cv2.getTrackbarPos("num", "depth")blockSize = cv2.getTrackbarPos("blockSize", "depth")if blockSize % 2 == 0:blockSize += 1if blockSize < 5:blockSize = 5# 根據Block Maching方法生成差異圖(opencv里也提供了SGBM/Semi-Global Block Matching算法,有興趣可以試試)stereo = cv2.StereoBM_create(numDisparities=16*num, blockSize=blockSize)disparity = stereo.compute(imgL, imgR)disp = cv2.normalize(disparity, disparity, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)# 將圖片擴展至3d空間中,其z方向的值則為當前的距離threeD = cv2.reprojectImageTo3D(disparity.astype(np.float32)/16., camera_configs.Q)cv2.imshow("left", img1_rectified)cv2.imshow("right", img2_rectified)cv2.imshow("depth", disp)key = cv2.waitKey(1)if key == ord("q"):breakelif key == ord("s"):cv2.imwrite("./snapshot/BM_left.jpg", imgL)cv2.imwrite("./snapshot/BM_right.jpg", imgR)cv2.imwrite("./snapshot/BM_depth.jpg", disp)camera1.release()
camera2.release()
cv2.destroyAllWindows()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251952.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251952.shtml

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

相關文章

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; 在右側消息頭處…

C#中Request.ServerVariables詳細說明及代理

Request.ServerVariables("Url") 返回服務器地址Request.ServerVariables("Path_Info") 客戶端提供的路徑信息Request.ServerVariables("Appl_Physical_Path") 與應用程序元數據庫路徑相應的物理路徑Request.ServerVariables("Path_Transla…

coco與voc相互轉化

把LabelImg標注的YOLO格式標簽轉化為VOC格式標簽 和 把VOC格式標簽轉化為YOLO格式標簽 點亮&#xff5e;黑夜 2020-07-07 11:08:24 3537 已收藏 90 分類專欄&#xff1a; 19—目標檢測 文章標簽&#xff1a; voc yolo 版權 把LabelImg標注的YOLO格式標簽轉化為VOC格式標簽 和…

angular中封裝fancyBox(圖片預覽)

首先在官網下載最新版的fancyBox(一定要去最新網站&#xff0c;以前依賴的jquery版本偏低)&#xff0c;附上鏈接&#xff1a;http://fancyapps.com/fancybox/3/ 然后在項目中引用jquery&#xff0c;然后在引用jquery.fancybox.min.css和jquery.fancybox.min.js。 如果需要動畫和…

十二省聯考題解 - JLOI2019 題解

十二省聯考題解 - JLOI2019 題解 兩個T3的難度較大 平均代碼量遠大于去年省選 套路題考查居多 A 難度等級 1 $n^2$暴力可以拿到$60$分的優秀成績 然后可以想到把區間異或轉化為前綴兩點異或 可以想到使用二分答案的方法可持久化Trie解決&#xff0c;但是時間復雜度為$n\log^2 (…

前端vue的get和post請求

vue的get和post需要兩個文件vue.js和vue-resource.js 以下是實現的代碼&#xff0c;可以參考一下&#xff0c;需要注意的接口的請求需要考慮跨域的問題&#xff0c;其次就是訪問頁面需要在tomcat下訪問&#xff0c;否則也會報跨域的問題 <!DOCTYPE html> <html lang&q…

[Vijos 1143]三取方格數

Description 設有N*N的方格圖&#xff0c;我們將其中的某些方格填入正整數&#xff0c; 而其他的方格中放入0。 某人從圖得左上角出發&#xff0c;可以向下走&#xff0c;也可以向右走&#xff0c;直到到達右下角。 在走過的路上&#xff0c;他取走了方格中的數。&#xff08;取…

線掃相機相關規格說明

工業線陣相機與面陣相機特點分析 點滴成海~ 2018-06-29 13:50:38 12184 收藏 29 分類專欄&#xff1a; intership 文章標簽&#xff1a; 視覺元件分析 版權 最近在公司實習&#xff0c;實習中的項目是使用的是微視的一款線陣相機&#xff08;Microview MVC1024DLM-GE35&…

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…

3.單例模式

public class Singleton {//定義私有的靜態變量 private static Singleton singleton;//私有化構造函數private Singleton(){}//獲取實例public static Singleton getInstance(){//同步前判斷避免同步的性能損耗if(nullsingleton){//預防多線程問題synchronized(Singleton.clas…

docker與mmdetection

這里不再介紹 mmdetection 的安裝和配置&#xff0c;使用 mmdetection 較簡單的方法是使用已安裝 mmdetection 的 docker 容器。這樣直接省去了安裝 mmdetection 的過程&#xff0c;讓重心放在模型訓練上&#xff01; 如果你對 docker 和 mmdetection 還不是很熟悉&#xff0c…

互聯網平臺掘金三四五線城市,你需要知道的9.9個真相

互聯網上半場結束&#xff0c;一二線城市流量紅利消失&#xff0c;許多互聯網平臺、投資機構一度經歷至黑之夜。融資失敗、公司倒閉、大裁員迭出。對比鮮明的是&#xff0c;深耕三四五線城市的互聯網平臺正在迅猛崛起。春節期間&#xff0c;小部分敏銳的業者注意到互聯網產品在…

平滑重啟更新(GR機制)

平滑重啟更新&#xff08;GR機制&#xff09; 什么是平滑啟動機制 是一種在協議重啟時保證轉發業務不中斷的機制。什么時候用到平滑重啟 平滑重啟一般應用于業務更新或者版本發布過程中&#xff0c;能夠避免因為代碼發布重啟服務導致的暫時性服務不可用的影響。ngnix 平滑重啟和…