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()関数
のコンピュータ画面座標系
の閾値()関数