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(可以獲得深度,彩色相機內參外參)相關推薦
opencv中3D點根據相機引數投影成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
OpenCV中feature2D學習——SURF和SIFT運算元實現特徵點檢測
概述 在opencv的features2d中實現了SIFT和SURF演算法,可以用於影象特徵點的自動檢測。具體實現是採用SurfFeatureDetector/SiftFeatureDetector類的detect函式檢測SURF/SIFT特徵的關鍵點,並儲存
OpenCV中feature2D學習——SIFT和SURF運算元實現特徵點提取與匹配
概述 之前的文章SURF和SIFT運算元實現特徵點檢測簡單地講了利用SIFT和SURF運算元檢測特徵點,在檢測的基礎上可以使用SIFT和SURF運算元對特徵點進行特徵提取並使用匹配函式進行特徵點的匹配。具體實現是首先採用SurfFeatureDetector檢測
C語言:根據以下公式計算s,s=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引數的區別
使用OpenCv中Mat進行水平投影與垂直投影並實現字元切分
因為要做影象處理方面的工作,所以最近在學習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("顯示影