1

使いたいのですpointPolygonTestが、問題があります。私の OpenCV のバージョンは 2.2 です。

このチュートリアルのコードを使用しようとしました。

findContours画像の輪郭を検出するために使用します。OpenCV 2.2 では、 を返しますvector<vector<Point> >

問題は、エントリとしてpointPolygonTesta を受け入れることです。cv::Matしたがって、コードは OpenCV 2.2 でコンパイルされません。

error: invalid initialization of reference of type ‘const cv::Mat&’ from expression of type ‘std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >’

最近の OpenCV バージョンでは、findContours関数が返さvector<Mat>れるため、簡単に渡すことができますpointPolygonTest(例を参照)。

vector< vector<Point> >に変換できると思いvector<Mat>ます。残念ながら、ドキュメントは形式についてあまり明確ではありません。

誰かアドバイスはありますか?

4

1 に答える 1

4

問題は、pointPolygonTest が cv::Mat をエントリとして受け入れることです。

では、なぜ古いバージョンの OpenCV を使用するのでしょうか。OpenCV版でのこのメソッドの宣言は次のとおりです。2.4.1:

C++: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)

ご覧のとおり、最初のパラメーターはマトリックスではなくInputArrayです。その記事から:

InputArray/OutputArray の代わりに、いつでも Mat、std::vector<>、Matx<>、Vec<>、または Scalar を使用できると想定できます。

したがって、これは、関数への入力std::vector<vector<Point> >として as InputArrayand so を使用できることを意味しますpointPolygonTest

これを使用する簡単な例を次に示しますpointPolygonTest(もちろん新しいバージョンで):

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Mat src;

findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);

for(size_t i = 0; i<contours.size(); i++)
{
    if (pointPolygonTest(contours[i], point, false) > 0)
    {
        //point is inside polygon
        ...
        break;
    }
}

したがって、新しいバージョンに更新するだけです。

または、古いバージョンで使用する場合は、次のキャストを試してください。

    (Mat)contours[i]

またはコンストラクタを使用:

    Mat(contours[i])

それが役に立てば幸い。

于 2012-06-26T15:12:04.453 に答える