30.凸包(Convex Hull)

1.主な内容

  • コンセプト紹介
  • APIの説明
  • コードデモ

2.コンセプト紹介

  • 凸包(凸包)とは、複数変形されたエッジまたは内部の任意の2点間の線は、ポリゴン境界または内部に含まれます。
  • 形式的な定義:点集合Sのすべての点を含む最小の凸多角形は、凸包
    ここに画像の説明を挿入
    検出アルゴリズムと呼ばれます-グラハムスキャン法(より一般的に使用されるアルゴリズム)
    ここに画像の説明を挿入

3.グラハムスキャン方式の概要

  • まず、Y方向の最も低い点を開始点p0として選択します
  • p0から極座標スキャンを開始し、p1 ...を順番に追加します(並べ替え順は極座標の角度に基づいて、反時計回り)
  • 各ポイントpiについて、凸包にpiポイントを追加すると左折する(反時計回りの方法)場合は、そのポイントを凸包に追加します。それ以外の場合は、右折(時計回り)する場合は、凸包からポイントを削除します。で

私たちが
知る必要があるの、OpenCVが使用する凸包検出アルゴリズムとAPIを実装していることを理解する必要があることだけです。
アルゴリズムは、次の図に基づいて学習および理解します。
ここに画像の説明を挿入

4. APIの説明cv :: convexHull

convexHull(
InputArray points,// 输入候选点,来自findContours
OutputArray hull,// 凸包
bool clockwise,// default true, 顺时针方向
bool returnPoints)// true 表示返回点个数,如果第二个参数是vector<Point>则自动忽略

5.コードのデモ:

主な手順:
1.まず画像をRGBからグレースケールに
変換します2.次にバイナリ画像に変換し
ます3.輪郭を見つけて候補点を取得し
ます4.凸包API呼び出し
5.描画して表示します。

cvtColor(src,src_gray,CV_BGR2GRAY);
blur(src_gray,src_gray,Size(3,3),Point(-1,-1));

void Threshold_Callback(int ,void*){
    Mat threshold_output;
    vector<vector<Point>>contours;
    vector<Vec4i>hierarchy;
    
     threshold(src_gray,threshold_output,threshold_value,255,THRESH_BINARY)
    findContours(threshold_output,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMOPLE,POint(0,0));
    
    vector<vector<Point>>hull(contours.size());//存放凸包的点集(此处进行初始化)
    for(size_t i=0;i<contours.size();i++){
        convexHull(Mat(contours[i]),hull[i],false)
    }
    
    Mat dst= Mat::zeros(threshold_output,size(),CV_8UC3);
    for(size_t i = 0;i < contours.size();i++){
        Scalar color = Scalar (rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255))       
        drawContours(dst,hull,i,color,1,LINE_8,hierarchy,0,Point(0,0));
        drawContours(dst,contours,i,color,1,LINE_8,hierarchy,0,Point(0,0));
       }
   imshow(output_win,dst);    
}

6.課外拡張

凸船体
lconvexHull()関数
のコンピュータ画面座標系
の閾値()関数

公開された66元の記事 ウォン称賛53 ビュー6812

おすすめ

転載: blog.csdn.net/qq_43367829/article/details/105424816