approxPolyDP

久しぶりにOpenCVネタ。「久しぶり」といっても触るのが本当に久しい訳ではなく、実際には色々と試しては壊しているのだが。
OpenCVは根っこの部分になると線型代数学等の私が全くからきしな分野になるし、その逆にプログラミングに降るとAPIの粒度が非常に細かいため日記では紹介するのが難しいネタなのだ。

findContourが2値化を施した画像の輪郭を抽出するAPIならばapproxPolyDPは、findContourで抽出した輪郭データを「ポリゴン近似」という手法でリサンプリングしてコンピュータがより理解しやすいデータに簡素化するAPIと考えると分かりやすい。(実際のところ、私はその用途以外でapproxPolyDPを使っているのを見たことが無い)

approxPolyDPの例
    cv::findContours(tmp, contours ,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    for (size_t i = 0; i < contours.size(); i++)
    {
        cv::Mat contour = cv::Mat(contours[i]);
        cv::vector<cv::Point> approx;
        cv::approxPolyDP(contour, approx, epsilon, true); 
        for( int i = 0 ; i < approx.size(); i++ )
        {
            //抽出した頂点座標を処理
        }
    }

実行結果

2値化後の画像

findcontour -> approxPolyDPによるポリゴン近似結果描画(epsilon:500)

本当は「ビックロ」の外縁だけを抽出したいのだが、輪郭に近接している「い」が干渉してしまっている。

個人的にapproxPolyDP(cvApproxPoly)はfindContourと共にOpenCVで最も役に立つAPIの一つだと考えている。(たまたま私のやりたいことに合致しているからかもしれないが)