視覺SLAM前端(間接法) 特殊資料結構與用法

2021-10-08 07:54:02 字數 3503 閱讀 5802

目錄

mat類

mat類是opencv中影象儲存矩陣,常常與cv::imread()函式一起使用,注意的是,mat矩陣不能與eigen庫中的矩陣進行任何數**算,需要時必須進行轉換。mat類也存放一些固定的引數,如相機內參等等,對mat類乙個最重要操作便是訪問矩陣內的元素。

1.利用mat.ptr訪問

cv::mat image = cv::

mat(

400,

600, cv_8uc1)

;//建立乙個mat類的image矩陣

double d=image.ptr<

unsigned

short

>

(int

(y))

[int

(x)]

;//訪問(x,y)處的元素

2.利用mat.at訪問

cv::mat image = cv::

mat(

400,

600, cv_8uc1)

;//建立乙個mat類的image矩陣

double d=image.at<

double

>

(y, x)

;//訪問(x,y)處的元素

注意:(x,y)是影象的畫素座標系,與一般的座標系原點不同,在影象的左上角。對於矩陣便是:第x行,第y列的元素

3.mat矩陣的手動輸入元素

cv::mat y=

(mat_<

double

>(1

,3)<<3,

2,1)

;//定義乙個1×3的矩陣,並且輸入資料

point2d/point3d 類

cv::point2d; cv::point3d是opencv中的一種儲存二維/三維點的一種資料結構,常常用與容器配合使用,用於儲存影象的特徵點等等。

1.keypoint轉換為point2d類

for

(dmatch m:matches)

keypoints[i].pt返回的是乙個point類

2.point類訪問元

vector pts_2=

(keypoints[matches[i]

.queryidx]

.pt)

double x= pts_2.x;

double y= pts_2.y;

3.point類的數**算

point類可之間進行加減運算,乘除運算轉換為cv::vec3d類。

//求解特徵點的質心

point3f p1, p2;

//質心座標

int n = pts1.

size()

;//pts1為point3f型別

for(

int i =

0; i < n; i++

) p1 =

point3f

(vec3f

(p1)

/ n)

; p2 =

point3f

(vec3f

(p2)

/ n)

;//向量的乘法運算要轉換為vec3f型別

vector2d/vector3d 類

vector2d/vector3d是eigen庫中的向量,也常常用於影象相關的運算,其靈活性比cv中的point類要高,更加"數學化"。

1.運算性質

vector2d/3本質是eigen庫的矩陣,實際運算過程嚴格按照矩陣運算即可。常常也用於儲存影象的特徵向量,特徵點等,一般與容器配合使用。

2.賦值與遍歷(手寫輸入資料)

eigen::vector3d xyz;

xyz <<1,

2,3;

eigen::vector3d t(1

,2,3

);//建立乙個向量,兩種方式都可以,第一種不能之間賦值

double x =

xyz(0,

0);double y =

xyz(1,

0);double z =

xyz(2,

0);//訪問相應的元素

注意:手寫賦值與mat類不同,遍歷是必須嚴格按照矩陣的行與列進行遍歷。

3.eigen與point類的互相轉換

//point to eigen

//若pts為定義好的 vectorpts_3d l型別並且已經賦值

vector pts3_eigen;

for(

int i =

0; i < pts_3d.

size()

; i++

)

//eigen to point

vector point3;

for(

int i =

0; i < pts3_eigen.

size()

; i++

)

sophus::se3d/so3d類

李群李代數最直接的用法就是表達為位姿,如何對特徵點進行變換,值得注意的是,此時的特徵點必須是eigen的vector型別。

1.變換

eigen::matrix3d r = eigen::

angleaxisd

(m_pi /

2, eigen::

vector3d(0

,1,0

)).torotationmatrix()

;//沿著y軸旋轉90°

eigen::vector3d t(1

,0,0

);//沿著x軸平移乙個單位

sophus::se3d t

(r, t)

; eigen::vector3d v(0

,1,0

);eigen::vector3d v_after = t * v;

cout <<

"變換前的向量:\n"

<< v << endl;

cout <<

"變換後的向量:\n"

<< v_after<< endl;

注:

1.以李群表示的位姿對某個vector點變換後的資料型別還是vector。

2.凡是在影象層次的運算都用cv裡面的結構,凡是涉及其他的數**算都用eigen裡面的結構。

視覺SLAM 視覺里程計解決方案分析(間接法)

目錄 基本問題 視覺里程計是視覺slam技術的起點,其核心問題同slam技術一樣,主要是定位與構圖,但視覺里程計解決的核心是定位問題,也就是相機的位姿。通俗地講就是利用多張影象資訊還原相機的運動。以兩幀影象為例。設空間點p pp為路標點,p1,p2p 1,p 2 p1 p2 為影象上的投影點。其中p...

視覺SLAM筆記(44) RGB D 的直接法

現在演示如何使用稀疏的直接法 為了保持程式簡單,使用 rgb d 資料而非單目資料,這樣可以省略掉單目的深度恢復部分 基於特徵點的深度恢復已經在 視覺slam筆記 34 三角測量 介紹過了 而基於塊匹配的深度恢復將在後面介紹 所以這裡考慮 rgb d 上的稀疏直接法vo visual odometr...

視覺SLAM常用的資料集

常用的資料集有 kitti資料集 euroc資料集 tum資料集 oxford資料集 icl nuim資料集 rgbd object資料集等等。kitti資料集 kitti資料集由德國卡爾斯魯厄理工學院和豐田美國技術研究院聯合創辦,是目前國際上最大的自動駕駛場景下的計算機視覺演算法評測資料集。該資料...