Matlab 攝像機標定+畸變校正(新版本MATLAB)
本文目的在於記錄如何使用MATLAB做攝像機標定,並通過opencv進行校正後的顯示。
首先關於校正的基本知識通過OpenCV官網的介紹即可簡單瞭解:
對於攝像機我們所關心的主要引數為攝像機內參,以及幾個畸變係數。上面的連線中後半部分也給瞭如何標定,然而OpenCV自帶的標定程式稍顯繁瑣。因而在本文中我主推使用MATLAB的工具箱。下面讓我們開始標定過程。
標定板
方法二:逼格滿滿(MATLAB)
J = (checkerboard(300,4,5)>0.5); figure, imshow(J);
採集資料
那麼有了棋盤格之後自然是需要進行照片了。不多說,直接上程式。按q鍵即可儲存影象,儘量把鏡頭的各個角度都覆蓋好。
#include "opencv2/opencv.hpp" #include <string> #include <iostream> using namespace cv; using namespace std; int main() { VideoCapture inputVideo(0); //inputVideo.set(CV_CAP_PROP_FRAME_WIDTH, 320); //inputVideo.set(CV_CAP_PROP_FRAME_HEIGHT, 240); if (!inputVideo.isOpened()) { cout<< "Could not open the input video " << endl; return -1; } Mat frame; string imgname; int f = 1; while (1) //Show the image captured in the window and repeat { inputVideo >> frame; // read if (frame.empty()) break; // check if at endimshow("Camera", frame); char key = waitKey(1); if (key == 27)break; if (key == 'q' || key == 'Q') { imgname = to_string(f++) + ".jpg"; imwrite(imgname, frame); } } cout << "Finished writing" << endl; return 0; }
儲存大約15到20張即可。大家可以看到我的方法,直接對著實驗室的螢幕拍攝的。這個階段有個注意事項就是測量好螢幕上每個方格的大小,這個標定的時候會用到。
進行標定
直接而在MATLAB的Command Window裡面輸入cameraCalibrator即可呼叫標定應用。
首先先把之前照好的影象新增進去,這是出現:
這就是之前讓你記錄的標定板中每個方格的大小。 輸入無誤後就涉及到最關鍵的一步了(MATLAB的這個實在太方便了,都是傻瓜式操作),選擇引數。
為什麼說他關鍵呢,因為如果你仔細閱讀了OpenCV的說明之後你會大概明白畸變引數,總共有五個,徑向畸變3個(k1,k2,k3)和切向畸變2個(p1,p2)。
徑向畸變
切向畸變
以及在OpenCV中的畸變係數的排列(這點一定要注意k1,k2,p1,p2,k3),千萬不要以為k是連著的。
並且通過實驗表明,三個引數的時候由於k3所對應的非線性較為劇烈。估計的不好,容易產生極大的扭曲,所以我們在MATLAB中選擇使用兩引數,並且選擇錯切和桶形畸變。
點選開始後等待一段時間即可完成標定。並且MATLAB給出的視覺化還是很不錯的,可以對比校正前後的樣子
點選show Undistorted即可看到無畸變的影象
到這為止,你已經完成了標定過程。選擇匯出引數,即可把引數進行儲存。
儲存後可以退出標定應用,在MATLAB主介面中將儲存的Mat檔案開啟
第二行就是引數
裡面的RadialDistortion對應k1,k2,k3設定為0了。
TangentialDistortion對應p1,p2。
IntrinsicMatrix對應內參,注意這個和OpenCV中是轉置的關係,注意不要搞錯。
對應
OpenCV中檢視標定的結果
#include "opencv2/opencv.hpp" #include <iostream> using namespace cv; using namespace std; int main() { VideoCapture inputVideo(0); if (!inputVideo.isOpened()) { cout << "Could not open the input video: " << endl; return -1; } Mat frame; Mat frameCalibration; inputVideo >> frame; Mat cameraMatrix = Mat::eye(3, 3, CV_64F); cameraMatrix.at<double>(0, 0) = 4.450537506243416e+02; cameraMatrix.at<double>(0, 1) = 0.192095145445498; cameraMatrix.at<double>(0, 2) = 3.271489590204837e+02; cameraMatrix.at<double>(1, 1) = 4.473690628394497e+02; cameraMatrix.at<double>(1, 2) = 2.442734958206504e+02; Mat distCoeffs = Mat::zeros(5, 1, CV_64F); distCoeffs.at<double>(0, 0) = -0.320311439187776; distCoeffs.at<double>(1, 0) = 0.117708464407889; distCoeffs.at<double>(2, 0) = -0.00548954846049678; distCoeffs.at<double>(3, 0) = 0.00141925006352090; distCoeffs.at<double>(4, 0) = 0; Mat view, rview, map1, map2; Size imageSize; imageSize = frame.size(); initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(), getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0), imageSize, CV_16SC2, map1, map2); while (1) //Show the image captured in the window and repeat { inputVideo >> frame; // read if (frame.empty()) break; // check if at end remap(frame, frameCalibration, map1, map2, INTER_LINEAR); imshow("Origianl", frame); imshow("Calibration", frameCalibration); char key = waitKey(1); if (key == 27 || key == 'q' || key == 'Q')break; } return 0; }
修復之前和之後的結果對比
還有就是之前討論的為什麼選2係數而不是3係數。因為。。。。。。。 下面是三係數的修正結果,慘不忍睹啊
相關推薦
Matlab 攝像機標定+畸變校正(新版本MATLAB)
本文目的在於記錄如何使用MATLAB做攝像機標定,並通過opencv進行校正後的顯示。首先關於校正的基本知識通過OpenCV官網的介紹即可簡單瞭解:對於攝像機我們所關心的主要引數為攝像機內參,以及幾個畸變係數。上面的連線中後半部分也給瞭如何標定,然而OpenCV自帶的標定程式
Matlab 攝像機標定+畸變校正
ram str div spa 自然 show inpu log mman 博客轉載自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在於記錄如何使用MATLAB做攝像機標定,並通過opencv進
【OpenCV】攝像機標定+畸變校正
攝像機標定 本文目的在於記錄如何使用MATLAB做攝像機標定,並通過opencv進行校正後的顯示。 對於攝像機我們所關心的主要引數為攝像機內參,以及幾個畸變係數。上面的連線中後半部分也給瞭如何標定,然而OpenCV自帶的標定程式稍顯繁瑣。因而在本文中我主
利用matlab攝像機標定
https://www.cnblogs.com/Jessica-jie/p/6081308.html (1)輸入影象 “Image names”鍵 Matlab的圖形視窗顯示出20幅靶標影象 (2) 提取角點 “Extract grid corners”鍵。
iOS應用程式上傳AppStore(新版本上傳)
本篇部落格記錄的是將iOS應用上傳AppStore,具體是把新的版本上傳,與新專案上傳差不多,只不過更新版本的上傳要稍微簡單些,這裡不會介紹證書的配置哦。 1.進入蘋果開發者中心-->進入iTunes Connect-->點選進入我的app-->點選你之前
Hadoop2.6(新版本)----MapReduce工作原理
最近在研究Hadoop,發現網上的一些關於Hadoop的資料都是以前的1.X版本的,包括MapReduce的工作原理,都是以前的一些過時了的東西,所以自己重新整理了一些新2.X版本的MapReduce的工作原理 下面我畫了一張圖,便於理解MapReduce得整個工作原理 下
Java使用JDBC連線Hive(新版本)API封裝
網上找了很多封裝的API,發現都是過時了的,執行報各種錯誤,經過了幾天的調錯,終於可以使用java程式碼操作hive了 首先看看所需的包 所有的分析都在程式碼裡面 注意:網上很多程式碼對於DDL都執行 res = stmt.executeQuery(
Windows遠端桌面實現之六(新版本框架更新,以及網頁HTML5音訊採集通訊)
by fanxiushu 2018-08-21 轉載或引用請註明原始作者。 到
攝像機標定學習筆記(7)關於旋轉矩陣和旋轉向量的關係
攝像機標定中的外部引數矩陣,是由旋轉矩陣和平移矩陣構成的,旋轉矩陣是一個3×3的正交矩陣,有3個自由度。處理旋轉矩陣的問題時,通常採用旋轉矩陣的方式來描述,也可以用旋轉向量來表示,兩者之間可以通過羅德
54 Three.js 使用THREE.PointCloudMaterial(新版本:THREE.PointsMaterial)樣式化粒子
var renderer; function initRender() { renderer = new THREE.WebGLRenderer({antialias: true}); //renderer.setClearColor(new THREE.C
MATLAB:圖形加法運算(imadd函數)
class 當前 背景 src imshow width color -1 修改 close all; %關閉當前所有圖形窗口,清空工作空間變量,清除工作空間所有變量 clear all; clc; I=imread(‘rice.
yum無法安裝軟件(python版本問題)
imp led pos yourself there round org share req 遇到如下問題:[root@sa yum.repos.d]# yum repolistThere was a problem importing one of the Python
字符串處理函數(新函數)
%d clas 復制 put strstr 指向 大寫 需要 TE 由於字符串的應用廣泛,為方便用戶對字符串的處理,C語言函數庫中除了前面用到的庫函數gets()與puts()之外,還提供了另外一些常用的庫函數,其函數原型說明在string中。下面介紹一些最常用的字符串庫函
Eclipse漢化教程(各版本通用)
Eclipse漢化教程 1. 確定Eclipse的版本 方法一:開啟eclipse,在啟動畫面 中可以看到eclipse的版本名稱(我的版本是Photon),記住這個版本的名稱; 方法二:在Eclipse啟動後,點選選單欄中的Help(幫助)>>Abo
LG的nexus5(32GB版本 - 821)-TOT-底包 可用於救磚!
LG的nexus5(32GB版本 - 821)-TOT-底包 底層修復效果完美,通過LGflashTool1.8直接刷進去就行~ 底包下載: https://pan.baidu.com/s/1Z5WDwIsEQDHzVyFvBy5FpA 提取碼: uck1 LGflashTool1.8 下載: ht
Java: 獲取jar包中某個類的serialVersionUID(序列版本id)
2018.11.02 文章目錄 前言 方法 前言 在《序列化及Java Serializable序列化介面》一文,我介紹了一個case:一個已上線的版本中包含了未定義serialVersionUID序
Repo工具小教程(Android版本匯出)
repo 簽出某個Android版本:repo forall -c git checkout android-6.0.1_r17 1:下載android主線分支 repo init -u https://android.googlesource.com/platform/manifest
【 C 】關於相鄰字串常量自動合併的標準(新舊標準)(新舊風格)(陷阱)
如果一個字串太長了,我們需要把它分行來寫,舊式風格是這樣來做的: 1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 printf( "I love yo
mac 下安裝pyspider出現安裝pycurl錯誤(python3版本以上)
mac下安裝pyspider出現錯誤如下: Command “python setup.py egg_info” failed with error code 1 in /private/var/folders/...... 緊接著我用了pip3 安裝pycurl出現錯
基於Anaconda在windows下搭建TensorFlow環境(cpu版本安裝)
安裝TensorFlow CPU版本過程 目錄: 一.定義:TensorFlow是谷歌基於DistBelief進行研發的第二代人工智慧學習系統 一.定義: TensorFlow是谷歌基於DistBelie