1

私はこれまで、あるポイント(cvPoint)が別のホールと同じ穴にあるかどうかを知る方法を見つけようとしました。私の解決策は、cvFindContours()の適用から得られたCvSeqを取得し、それらの穴を適切な色で塗りつぶして、ブロブのマトリックスを作成することでした。それが行われるとき、あるポイントが別のポイントと同じ輪郭に属しているかどうかを知ることは、ピクセル値を比較することだけですが、なぜそれが機能しないのか理解できません。

残念ながら、それは答えられていない質問であり、私はグーグルとStackOverflowで多くの時間を過ごしました(または多分私はキーワードを見つけるのが本当に悪いです)。誰かが手がかりを持っていることを願っています;)

IplImage *imgTemp = cvCreateImage(cvGetSize(getMorph()), (getMorph())->depth, 1);
    CvMemStorage *mem = cvCreateMemStorage();
    cvConvertImage(getMorph(), imgTemp);
    CvSeq *contours = NULL;
    cvFindContours(imgTemp, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);

    int colIt=255;
    for (CvSeq *ptr = contours; ptr != NULL; ptr = ptr->h_next) {
        if(ptr->v_next != NULL)
        {
            CvScalar color = CV_RGB( colIt,colIt,colIt);
            cvDrawContours(imgTemp, ptr->v_next, color, color, -1, CV_FILLED, 100);
            --colIt;
        }
    }
4

2 に答える 2

0

これを行う最良の方法は、C++APIを利用することです。C ++ APIを使用すると、輪郭の階層を出力して、それらが同じ輪郭に属しているかどうかをはるかに簡単に判断できるようになります。findContoursのc++バリアントの説明はここにあります。

トップレベルの等高線のみを通過する例:

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(contourImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
int idx = 0;
for (; idx >= 0; idx = hierarchy[idx][0]) {
 drawContours(image, contours, idx, Scalar(255), CV_FILLED);
}
于 2013-03-26T13:39:11.903 に答える
0

diip_thomasの答えに基づいて、おそらくpointPolygonTestを使用しPoint2f、内部にあるかどうかをテストできますcontour[i](ここcontourで、vector<vector<Point> >iこのベクトルのi:番目の要素です)。例については、この回答を参照してください。

于 2013-04-26T09:29:34.990 に答える