如何獲得物體的主要方向?

2021-09-20 01:12:13 字數 2528 閱讀 1901

問題描述:

對於這樣的影象(2副,採用了背投光),如何獲得上面工件的主要方向

主要思路:

1、分別獲得每個工件的輪廓;

2、處理每個輪廓,採用pca(主成分分析)方法,獲得所有輪廓點的集合的中點,主要方向等資訊;

3、繪圖並返回結果。

**略解:

1、讀入,尋找輪廓;

//讀入影象,轉換為灰度

//閾值處理

threshold(bw, bw, 

150, 

255, cv_thresh_binary);

//尋找輪廓

vector

>

> contours;

vector

> hierarchy;

2、首先以大小篩選輪廓;

//輪廓分析,找到工件

for(size_t i 

=0; i 

++i)

3、單獨處理每個輪廓,分析其主要方向,繪製結果

//獲得構建的主要方向

doublegetorientation(vector

>

&pts, mat 

&img)

//執行pca分析

pca pca_analysis(data_pts, mat(), cv_pca_data_as_row);

//獲得最主要分量,在本例中,對應的就是輪廓中點,也是影象中點

point pos 

= point(pca_analysis.mean.at

<

double

>(

0, 0),pca_analysis.mean.at

<

double

>(

0, 1));

//儲存特徵向量和特徵值

vector

> eigen_vecs(

2);vector

<

double

> eigen_val(

2);for(

int

=0; i 

<

2;  ++i)

//在輪廓/影象中點繪製小圓

circle(img, pos, 

3, cv_rgb(

255, 

0, 255), 

2);//計算出直線,在主要方向上繪製直線

line(img, pos, pos 

+0. 02

* point(eigen_vecs[

0].x 

* eigen_val[

0], eigen_vecs[

0].y 

* eigen_val[

0]) , cv_rgb(

255, 

255, 

0));

line(img, pos, pos 

+0. 02

* point(eigen_vecs[

1].x 

* eigen_val[

1], eigen_vecs[

1].y 

* eigen_val[

1]) , cv_rgb(

0, 255, 

255));

//返回角度結果

returnatan2(eigen_vecs[

0].y, eigen_vecs[

0].x);

}

結果展示:

感謝關注,希望有所幫助。

此外,特別感謝:

提供的這個gif錄屏軟體,非常好用。

目前方向:影象拼接融合、影象識別 ****:[email protected]

雜談(如何獲得物體的尺寸)(11)

獲得物體的尺寸有幾種,可以通過render元件 meshfiter元件或者是通過給物體新增碰撞器來獲取到物體的尺寸,具體方法是 一 gameobject.renderer.bound.x 這個方法的具體返回值是meshrenderer這個組建的模型尺寸 二 gameobject.getcompone...

U3D子物體和父物體的獲得及建立子物體

獲得父物體的方法是,通過transform類中的乙個函式parent獲得該父物體的transform資訊 因為該函式的返回值是transform型別 再通過transform類的gameobject函式獲得該物體,從而可以控制物體了。如果是建立子物體的話,只需要建立後設定物體的父物體就好了,獲取子物...

平面物體檢測的主要演算法流程

主要用於使用 features2d 和 calib3d 模組來檢測場景中的已知平面物體。步驟 1 讀入兩幅影象 mat img1 imread argv 1 cv load image grayscale mat img2 imread argv 2 cv load image grayscale ...