書式#include <opencv2 \ opencv.hpp> 使用して 名前空間の品種; 使用して 名前空間はstdを、 二重 calcPCAorientation(ベクトル<ポイント>・PTS、マット&画像)。 INTメイン(int型アーク、チャー ** ARGV) { マットSRC =関数imread(" 3.JPG " )。 namedWindow(" 入力" 、WINDOW_AUTOSIZE)。 関数imshow(" 入力" 、SRC); バイナリ、グレイマット。 cvtColor(SRC、灰色、COLOR_BGR2GRAY)。 閾値(灰色、バイナリ、0、255、THRESH_BINARY | THRESH_OTSU); // 関数imshow( "バイナリ"、バイナリ); ベクトル <ベクトル<ポイント>> 輪郭。 findContours(バイナリ、輪郭、RETR_LIST、CHAIN_APPROX_NONE)。 マット結果 = src.clone()。 以下のために(INT iが= 0 ; I <contours.size(); I ++ ){ 二重面積= contourArea(輪郭[I])。 もし(エリア> 1E5 ||エリア<1E2)続けます。 drawContours(その結果、輪郭、I、スカラー(0、0、255)、1 )。 calcPCAorientation(輪郭[i]は、結果)。 } 関数imshow(" 結果" 、結果)。 waitKey(0 )。 リターン 0 ; } 二重 calcPCAorientation(ベクトル<ポイント>・PTS、マット&画像) { int型のサイズ= pts.size()。 マットdata_pts =マット(サイズ、2 、CV_64FC1)。 以下のために(INT iが= 0 ; I <サイズ; I ++ ){ data_pts.at < ダブル >(I、0)= < PTS [I] .X。 data_pts.at二重 >(I、1)= PTS [I] .Y。 } // PCA PCAのpca_analysis(data_pts、マット()、PCA :: DATA_AS_ROW)。 点CNT =点(pca_analysis.mean.at < ダブル >(0、0)、pca_analysis.mean.at < ダブル >(0、1))。// 平均值 円(画像、CNT、2、スカラー(0、255、0)、2 )。 ベクター <たPoint2D> vecSの(2)。// 特征向量 ベクトル<ダブル >ヴァルス(2)。// 特征值 ため(INT iは= 0 ; I < 2 ; I ++ ) { ヴァルス[I] = pca_analysis.eigenvalues.at < ダブル >(I、0 ); vecSの[I] =たPoint2D(pca_analysis.eigenvectors.at < ダブル >(I、0)、pca_analysis.eigenvectors.at < ダブル >(I、1 ))。 } ポイントP1 = CNT +ポイント(static_castを< 整数 >(vecSの[ 0 ] .X * 320)、static_castを< INT>(vecSの[ 0 ]・Y * 315)); // 元々 300 ポイントP2 = CNT -ポイント(static_castを< INT [>(vecSの1 ] .X * 100)、static_castを< 整数 >(vecSの[ 1 ]。 * Y 100)); // 50の // データは、次の元の今後の新しいセットグループ内のデカルト座標系を表し、データは、最大にすることを特徴とする (ラインイメージ、CNT、P1、スカラー(255、0、0) 、1); // 主方向請求 ライン(イメージ、CNT、P2、スカラー(0、255、0)、1); //前記メイン垂直 ダブル ATAN2 =の角度(vecSの[ 0 ] .Y、vecSの[ 0 ] .X); のprintf(" 角度:%2F \ N- "、180 *角度/ CV_PI); のprintf(" %のD、 D%\ N- "、ヴァルス[ 0 ]、ヴァルス[ 1 ]); 戻り角度を、 }