1. 程式人生 > >opencv中3D點根據相機引數投影成2D點+solvePnP函式計算相機姿態+2D座標到3D+相機引數calibration(標定與配準,求得深度彩色相機的內參與外參,再進行配準)

opencv中3D點根據相機引數投影成2D點+solvePnP函式計算相機姿態+2D座標到3D+相機引數calibration(標定與配準,求得深度彩色相機的內參與外參,再進行配準)

1.opencv中3D點根據相機引數投影成2D點,直接上程式碼:

輸入:3D座標+旋轉,平移矩陣(所謂的相機姿態)+相機內參(包括畸變矩陣)

輸出:2D座標

(1.投影函式:根據相機引數(包括畸變矩陣),把3D點投影成2D點

2.搞清楚R和t的具體含義。

R的第i行 表示攝像機座標系中的第i個座標軸方向的單位向量在世界座標系裡的座標;
R的第i列 表示世界座標系中的第i個座標軸方向的單位向量在攝像機座標系裡的座標;
t 表示世界座標系的原點在攝像機座標系的座標;
-R的轉置 * t 表示攝像機座標系的原點在世界座標系的座標

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <string>
std::vector<cv::Point3d> Generate3DPoints();

int main(int argc, char* argv[])
{
// Read 3D points
std::vector<cv::Point3d> objectPoints = Generate3DPoints();
std::vector<cv::Point2d> imagePoints;
cv::Mat intrisicMat(3, 3, cv::DataType<double>::type); // Intrisic matrix
intrisicMat.at<double>(0, 0) = 1.6415318549788924e+003;
intrisicMat.at<double>(1, 0) = 0;
intrisicMat.at<double>(2, 0) = 0;
intrisicMat.at<double>(0, 1) = 0;
intrisicMat.at<double>(1, 1) = 1.7067753507885654e+003;
intrisicMat.at<double>(2, 1) = 0;
intrisicMat.at<double>(0, 2) = 5.3262822453148601e+002;
intrisicMat.at<double>(1, 2) = 3.8095355839052968e+002;
intrisicMat.at<double>(2, 2) = 1;
cv::Mat rVec(3, 1, cv::DataType<double>::type); // Rotation vector
rVec.at<double>(0) = -3.9277902400761393e-002;
rVec.at<double>(1) = 3.7803824407602084e-002;
rVec.at<double>(2) = 2.6445674487856268e-002;
cv::Mat tVec(3, 1, cv::DataType<double>::type); // Translation vector
tVec.at<double>(0) = 2.1158489381208221e+000;
tVec.at<double>(1) = -7.6847683212704716e+000;
tVec.at<double>(2) = 2.6169795190294256e+001;
cv::Mat distCoeffs(5, 1, cv::DataType<double>::type);   // Distortion vector
distCoeffs.at<double>(0) = -7.9134632415085826e-001;
distCoeffs.at<double>(1) = 1.5623584435644169e+000;
distCoeffs.at<double>(2) = -3.3916502741726508e-002;
distCoeffs.at<double>(3) = -1.3921577146136694e-002;
distCoeffs.at<double>(4) = 1.1430734623697941e+002;
std::cout << "Intrisic matrix: " << intrisicMat << std::endl << std::endl;
std::cout << "Rotation vector: " << rVec << std::endl << std::endl;
std::cout << "Translation vector: " << tVec << std::endl << std::endl;
std::cout << "Distortion coef: " << distCoeffs << std::endl << std::endl;
cv::projectPoints(objectPoints, rVec, tVec, intrisicMat, distCoeffs, imagePoints);
std::cout << "Press any key to exit.";
std::cin.ignore();
std::cin.get();
return 0;
}
std::vector<cv::Point3d> Generate3DPoints()
{
std::vector<cv::Point3d> points;
double x, y, z;
x = .5; y = .5; z = -.5;
points.push_back(cv::Point3d(x, y, z));
x = .5; y = .5; z = .5;
points.push_back(cv::Point3d(x, y, z));
x = -.5; y = .5; z = .5;
points.push_back(cv::Point3d(x, y, z));
x = -.5; y = .5; z = -.5;
points.push_back(cv::Point3d(x, y, z));
x = .5; y = -.5; z = -.5;
points.push_back(cv::Point3d(x, y, z));
x = -.5; y = -.5; z = -.5;
points.push_back(cv::Point3d(x, y, z));
x = -.5; y = -.5; z = .5;
points.push_back(cv::Point3d(x, y, z));
for (unsigned int i = 0; i < points.size(); ++i)
{
std::cout << points[i] << std::endl << std::endl;
}
return points;
}

2.opencv中solvePnP函式計算相機姿態:http://blog.csdn.net/aptx704610875/article/details/48915149

或者http://www.cnblogs.com/gaoxiang12/p/4659805.html

輸入:3D座標,2D座標+相機內參(包括畸變矩陣)

輸出:相機姿態(旋轉平移矩陣)

3.超級好的一個部落格!:http://www.cnblogs.com/gaoxiang12/p/4652478.html(這個部落格還包括根據RGB-D影象,點雲拼接(三維重建),很詳細!)

(涉及到了三維點雲,除了opencv,還用到PCL)

原理+程式碼實現從(2D->3D)

輸入:2D座標,相機內參(包括畸變矩陣),相機姿態

輸出:3D座標

(1,2,3其實就是3D,2D座標,相機姿態(在已經知道相機引數情況下),知道其中兩個可以求得另外一個!)

4.用kinect1來拍攝三維模型,很重要的一步就是先要標定相機(因為深度相機與彩色相機不是一個位置,存在偏差):

http://blog.csdn.net/aichipmunk/article/details/9264703

(補充:

①儲存拍攝的深度彩色圖,可以用openni的程式碼,也可以更改pcl kinfu程式碼,openni可以看我pcl配置那一篇部落格 ②拍好深度,彩色圖後也可以用matlab工具箱來標定:http://blog.csdn.net/wangxiaokun671903/article/details/38925553(可以獲得深度,彩色相機內參外參)
③獲得內外引數後,利用本文的1,2,3來配準深度彩色圖片)

相關推薦

opencv3D根據相機引數投影2D+solvePnP函式計算相機姿態+2D座標3D+相機引數calibration(標定求得深度彩色相機內參進行)

1.opencv中3D點根據相機引數投影成2D點,直接上程式碼: 輸入:3D座標+旋轉,平移矩陣(所謂的相機姿態)+相機內參(包括畸變矩陣) 輸出:2D座標 (1.投影函式:根據相機引數(包括畸變矩陣),把3D點投影成2D點 2.搞清楚R和t的具體含義。 R的第i行 表示

內參、畸變數三種相機標定方法相機坐標系的理解

整體 沒有 建立 csdn ext 位置 nbsp ons 包含 博客轉載自:http://blog.csdn.net/yangdashi888/article/details/51356385 相機的內參數是六個分別為:1/dx、1/dy、r、u0、v0、f opencv

關於用OpenCV的CalibrateCamera標定相機內參的一些問題的探討

最近嘗試用OpenCV來標定工業相機,先下載了OpenCV自帶的的標定的例程camera_calibration.cpp,建立了一個同名的win32空專案,把程式碼拷進去,然後設定專案的include屬性,lib庫,反正是專案編譯成功了!借鑑博文https://blog.cs

OpenCVfeature2D學習——SURF和SIFT運算元實現特徵檢測

概述        在opencv的features2d中實現了SIFT和SURF演算法,可以用於影象特徵點的自動檢測。具體實現是採用SurfFeatureDetector/SiftFeatureDetector類的detect函式檢測SURF/SIFT特徵的關鍵點,並儲存

OpenCVfeature2D學習——SIFT和SURF運算元實現特徵提取匹配

概述       之前的文章SURF和SIFT運算元實現特徵點檢測簡單地講了利用SIFT和SURF運算元檢測特徵點,在檢測的基礎上可以使用SIFT和SURF運算元對特徵點進行特徵提取並使用匹配函式進行特徵點的匹配。具體實現是首先採用SurfFeatureDetector檢測

C語言:根據以下公式計算ss=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) -在形s所指字符串尋找數c相同的字符並在其後插入一個之相同的字符

根據 str res oid oat please 一位 aac string //根據一下公式計算s,並將計算結果作為函數返回值,n通過形參傳入。s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) 1 #include <st

Qt事件機制(是動作發生後一種通知對象的消息是被動主動的總和。先處理自己隊列的消息然後處理系統消息隊列的消息)

str 發送 filter 簡化 後者 nts 類型 min() 鼠標滾輪 Qt事件機制 Qt程序是事件驅動的, 程序的每個動作都是由幕後某個事件所觸發.。 Qt事件的發生和處理成為程序運行的主線,存在於程序整個生命周期。 Qt事件的類型很多, 常見的qt的事件如下:

在arcgis如何進行

在選單欄中右鍵找到工具條 在柵格圖中刺點(點選下圖中紅色框內),並在天地圖中找到相應點的座標(wgs-84),記錄在txt文件中。此時注意點的左邊應該和刺點的順序想對應。 刺點完成後,點選關聯表。下圖中藍色框 4.開啟關聯表以後將2中儲

Dstream[Row] 資料批量匯入Mysql 並去重(大致為如果資料庫有某行資料了本次執行若有一行資料庫的那行相同則不會插入進去)

def Save2Mysql(stateDStream: DStream[Row]): Unit = { stateDStream.foreachRDD { rdd => { rdd.foreachPartition(partitionRecord

a標籤跳頁傳以及擷取URL引數 js 編碼(encode)和解碼(decode)的三種方法

<a href="dd.index?aa=1&&bb=2"></a> //擷取URL引數 // console.log(window.location.search); function GetQueryString(name) { var reg = new Re

c++函式引數傳遞行內函數和預設實的理解

1.引數傳遞   1)函式呼叫時,c++中有三種傳遞方法:值傳遞、指標傳遞、引用傳遞。 給函式傳遞引數,遵循變數初始化規則。非引用型別的形參一相應的實參的副本初始化。對(非引用)形參的任何修改僅作用域區域性副本,並不影響實參本身。 為了避免傳遞副本的開銷,可將形參指定為引用型別。對引用形參的

layui進行分頁處理後端返回資料沒有count欄位需要單獨獲取新增到資料進行項渲染另有layui表格資料增刪改查前後端互動

整體效果圖如下: (1)分頁前端介面處理 (2)分頁後端的資料處理 具體程式碼如下: 前端介面程式碼:包括分頁,增刪改查,重新整理(搜尋功能還沒做,後端是java程式碼) <!DOCTYPE html> <html> <hea

springmvc在處理請求過程出現異常資訊交由異常處理器進行處理自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常型別自定義異常類這裡我們建立一個自定義系統異常如果controller、service、dao丟擲此類異常說明是系統預期處理的異常資訊。

springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執

opencv對影象畫素訪問的三種方法利用程式進行解讀

程式碼放到自己的工程中,執行就可以的 #include <opencv2\opencv.hpp> #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #includ

標籤 href 和 onclick 的區別以及href="javascript:xxx(this);"onclick="xxx(this);" 傳遞this引數的區別

<a>標籤中href屬性動作和onclick事件的區別,以及href="javascript:xxx(this);"與onclick="xxx(this);" 傳遞this引數的區別

使用OpenCvMat進行水平投影垂直投影並實現字元切分

因為要做影象處理方面的工作,所以最近在學習OpenCv的使用,學習了OpenCv中Mat物件的相關使用之後,實現了使用Mat物件來進行影象的水平投影和垂直投影,並且在投影之後,對字元進行相對應的切分。現在將相關程式碼貼出,一來可以供大家參考並指正錯誤,而來也為的是防止忘記了

java構造方法的理解super()構造方法構造方法this()構造方法。

一、為什麼要引入構造方法。 當建立物件的時候需要對屬性值初始化,構造方法,即物件建立時要執行的方法。 要求在例項化的同時,就指定好name,和age的值。這就要用到構造方法。又叫做構造器Constructor. 二、構造方法的定義格式 構造方法在new的時候自動執行。且只執

在 Android studio 配置Gradle 根據不同引數打包並在程式碼使用

筆記 使用案例 app/gradle 配置 我們在 thinker中不難看出 他們也是使用了這個方式 android { defaultConfig {

OpenCV二維求取進行仿射和透視變換之後的座標點方法

我使用的是OpenCV 2.2版本。得到了一個透視矩陣,想把螢幕上的一個二維點經過這個透視矩陣進行變換,本身很簡單的一個事情,卻頗費了一番周折。原因是剛接觸OpenCV,而且使用了OpenCV新新增的C++部分的矩陣類Mat,使用起來還真有點不順手,因為OpenCV中沒有向

opencv遍歷每一個畫素進行處理

轉載:http://blog.csdn.net/wwwsssZheRen/article/details/743155911.用動態地址操作畫素:Mat srcImage(100, 100, CV_8UC3, Scalar(200,20,100));  imshow("顯示影