コンセプト
内部エッジまたは任意の2点の変形例における複数の接続がポリゴンエッジまたは内部に含まれる、凸包(凸包)は何です。
正式な定義:凸包ポリゴン内のすべての点を含む最小の凸点集合Sが呼び出され
グラハム走査アルゴリズムは、
最初の出発点P0とY方向の最下点選択
P1 ... .pn(極角の大きさ、反時計回りの方向に基づいてソート順)を添加順次スキャンを開始極座標P0からの
PIは、各点のために、点PIの凸包に追加した場合右折リード(時計回り)凸包からポイントを削除する場合に対し、凸包ポイントに追加され、左回転(反時計方法)を引き起こします。
凸包( InputArrayポイント、 // findContoursから入力候補点、 outputArrayハル、 // 凸包 BOOLの時計回り、 // 真、時計回りにデフォルト BOOLの returnPoints // 2番目のパラメータがベクトルである場合はtrueには、リターン・ポイントの数を示します<ポイント>自動的に無視されます )
まず、グレースケールにRGBから画像
次いで、及び二値画像に変換
することによって見出さ得られた輪郭候補点に
API呼び出しの凸包
プロットを示します
マットSRC、src_gray、DST。 int型 threshold_valueに= 100 ; int型 threshold_max = 255 ; 無効 Threshold_Callback(int型、無効 * ); RNGのRNG(12345 )。 INTメイン(int型 ARGC、チャー ** ARGV){ SRC = 関数imread(STRPAHT)。 もし(!src.data){ のprintf(" 画像... \ nを読み込むことができませんでした" ); 戻る - 1 。 } cvtColor(SRC、src_gray、CV_BGR2GRAY)。 ぼかし(src_gray、src_gray、サイズ(3、3)、ポイント( - 1、 - 1 )、BORDER_DEFAULT)。 関数imshow(" input_win " 、src_gray)。 createTrackbar(" trackbar_label "、" output_win "、&threshold_valueに、threshold_max、Threshold_Callback)。 Threshold_Callback(0、0 ); waitKey(0 )。 リターン 0 ; } 無効 Threshold_Callback(int型、無効 * ){ マットbin_output。 ベクトル <ベクトル<ポイント>> 輪郭。 ベクトル <Vec4i> hierachy。 閾値(src_gray、bin_output、threshold_valueに、threshold_max、THRESH_BINARY)。 findContours(bin_output、輪郭、hierachy、RETR_TREE、CHAIN_APPROX_SIMPLE、点(0、0 )); ベクトル <ベクトル<ポイント>> convexs(contours.size()); 以下のためには(size_t i = 0 ; iは(contours.sizeを<)私は++ ){ 凸包(輪郭[I]、convexs [i]は、偽、真の); } DST = マット::ゼロ(src.size()、CV_8UC3)。 ベクター <Vec4i>空(0 )。 用(size_tのK = 0 ; K <contours.size(); kは++ ){ スカラー色 =スカラー(rng.uniform(0、255)、rng.uniform(0、255)、rng.uniform(0、255 )) ; drawContours(DST、輪郭、K、色、2、LINE_8、hierachy、0、点(0、0 )); drawContours(DST、convexs、K、色、2、LINE_8、空、0、点(0、0 )); } 関数imshow(" output_win " 、DST)。 返します。 }