在三維空間中,可通過標記角點的精確位置來估計攝像機與標記之間的變換。此操作稱為二維到三維的姿態估計。該估計過程會在物體與攝像機之間找到乙個歐氏空間的變換(該變換僅由旋轉和座標平移構成)。
先來觀察右圖:
圖中的c表示攝像機中心,點p1-p4是現實座標系中的三維點,而p1-p4是將點p1-p4投影到攝像機的影象平面而得到的。標記位置估計的目的就是在已知三維世界的標記位置(p1-p4)、有內部引數矩陣的攝像機c以及已知影象平面的投影點(p1-p4)的情況下,找到標記與攝像機之間相對變換關係。但在哪兒能得到三維空間中標記位置的座標呢?可以想象一下,標記總是方形且所有頂點都在乙個平面上,因此可按如右方式定義標記的角點:
可將標記放在xy平面上(z分量為零),其標記的中心為點(0.0, 0.0, 0.0)。這是乙個很好的提示,因為在這種情形下,座標系統的起始處就是標記的中心(z軸是與標記平面垂直)。
為了用已知2d-3d的對應關係來找到攝像機位置,可用cv::solvepnp函式:
其中,引數objectpoints是輸入陣列,它包含著物件所在空間的點,這裡可將std::vector型別所定義的變數傳遞給該引數。只要是3×n或n×3的opencv矩陣也都作為該引數的輸入,其中n是點的數量。本專案將三維空間中標記座標的列表傳遞給該引數。
陣列imagepoints是相應影象點(或投影)陣列。該引數的型別也是std::vector 或cv::mat,其大小為2×n或n×2的矩陣, n表示點的數量。本專案將找到的標記頂點列表傳遞給該引數。
cameramatrix是3×3的攝像機內部引數矩陣;
distcoeffs是4×1、1×4、5×1或1×5的畸變向量;
rvec是輸出的旋轉向量,該向量將點由模型座標系統轉換為攝像機座標系統;
tvec是輸出的平移向量;
變數useextrinsicguess的值為true,函式將使用所提供的rvec和tvec向量作為旋轉和平移的初始值,然後會不斷優化它們。
函式按最小化重投影誤差來計算攝像機的變換,即讓所得的投影向量imagepoints與被投影向量之間的距離平方和最小。
被估計的變換由旋轉向量(rvec)和平移向量(tvec)來定義,這也稱為歐氏變換或剛性變換。
剛性變換的正式定義為:對任意向量v,會得到乙個變換向量t(v),其具體形式為
t(v) = rv + t
其中,rt=r-1(即r為正交變換),t是乙個平移向量,它給出了整個變換的起始點。另外,剛性變換還有乙個性質:
det(r)=1
這意味著r只是旋轉(乙個保持方向的正交變換)並不會產生反射。
可使用函式cv::rodrigues將旋轉向量轉換為3×3的旋轉矩陣。該函式將旋轉向量轉變為與之等價的旋轉矩陣。
注意:cv::solvepnp將在三維空間找到與標記姿態的攝像機位置,因此需要反轉所得到的變換。所得變換將用攝像機的座標系統來描繪標記變換,該座標系統對渲染過程更方便。
下面給出了函式estimateposition的實現過程,它會找到給定標記的位置。
人臉姿態估計
由於需要在採集的集中選擇與待識別人臉姿態最接近的與之進行對比,因此考慮使用人臉姿態估計計算人臉在三維空間的角度,然後找出與之最接近的角度。在網上查閱資料發現大多都是演算法介紹,缺少原始碼,最終在github上找到乙個基於dlib68點檢測和opencv計算角度的專案 head pose estima...
頭部姿態估計
通常認為人體頭部可以建模為乙個無實體的剛體物件。根據這種假設,在姿勢上人類的頭部被限制為3個自由度,其特徵分別是俯仰,坡度和偏航角在下圖中體現。人臉姿態估計,顧名思義,給定一張人臉影象,確定其姿態,姿態由什麼構成呢?很簡單 pitch,yaw,roll 三種角度,分別代表上下翻轉,左右翻轉,平面內旋...
姿態估計 Hourglass 網路
本文是 eccv2016 的工作,主要是介紹了乙個在當時是新的姿態估計的網路結構。這裡主要是對整個網路的結構和思想進行乙個梳理,可以進一步明白後序一些基於此網路結構的工作 例如eccv2018 cornernet 不涉及到 姿態估計領域 的一些見解和討論,所以本文主要就是分為兩節,引出課題和介紹 h...