0

注: StackOverflow では自分の質問に答えられないため、ここで回答します。一番下までスクロールして私の答えを見てください。

質問 バイナリ イメージが与えられた場合、どの領域が最大の y 座標を持つか、つまり、どの領域が一番下に近いかを識別できるようにしたいと考えています。以下の関数では、輪郭と外接する四角形を使用して、必要な答えを得ようとしています。ただし、関数 cvContourBoundingRect を使用すると、コンパイル中に次のエラー メッセージが表示されます。

"_cvContourBoundingRectemphasized", referenced from: 
GetLowestContourBoundingRectangle(_IplImage * img, bool) 
in main.o. Symbol(s) not found. Collect2: Id returned 1 exit status. 
Build Failed.

cvFindContours や cvContourArea などの他の輪郭関数を問題なく使用できたため、これは非常に奇妙です。Google でいくつか検索してみましたが、何もヒットしませんでした。誰かが私を正しい方向に向けることができれば、私はそれを感謝します.

前もって感謝します。

CvRect GetLowestContourBoundingRectangle(IplImage *img, bool invertFlag) {
    // NOTE: CONTOURS ARE DRAWN AROUND WHITE AREAS
    IplImage *output = invertFlag ? cvCloneImage(InvertImage(img)) : cvCloneImage(img); // this goes into find contours and is consequently modified

    // find contours
    CvMemStorage *contourstorage = cvCreateMemStorage(0);
    CvSeq* contours = NULL;
    cvFindContours(output, contourstorage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

    // analyze each contour
    int lowestRectangleCoordinate = 0;
    CvRect currentBoundingRectangle;
    CvRect lowestBoundingRectangle;

    while (contours) {
        currentBoundingRectangle = cvContourBoundingRect(contours);
        if (currentBoundingRectangle.y + currentBoundingRectangle.height > lowestRectangleCoordinate) {
            lowestRectangleCoordinate = currentBoundingRectangle.y + currentBoundingRectangle.height;
            lowestBoundingRectangle = currentBoundingRectangle;
        }

        contours = contours->h_next;
    }

    cvReleaseMemStorage(&contourstorage);
    return lowestBoundingRectangle;
}

回答: 皮肉なことに、最初の質問の下書きを作成した直後に、問題が発生する理由がわかりました (ただし、公平を期すために、この時点で数時間この問題に取り組んできました)。

次の 3 つの関数がそれぞれ定義されているヘッダー ファイルを調べました。

  1. cvFindContours -- imgproc_c.h
  2. cvContourArea -- imgproc_c.h
  3. cvContourBoundingRect -- compat.hpp

compat.hpp は、下位互換性のために保持されている非推奨の関数用です。ヘッダーに書かれている内容は次のとおりです。

/*
   A few macros and definitions for backward compatibility
   with the previous versions of OpenCV. They are obsolete and
   are likely to be removed in future. To check whether your code
   uses any of these, define CV_NO_BACKWARD_COMPATIBILITY before
   including cv.h.
*/

そうは言っても、廃止されていない定義を使用してこの関数を実際に作成する方法を知っている人はいますか?

4

1 に答える 1

1

元の質問「OpenCV: cvContourBoundingRect で "Symbol Not Found" が返される」について。

その(非推奨の)メソッドとリンクするために使用するライブラリは次のとおりです。

libopencv_legacy.so

于 2013-03-06T09:08:12.513 に答える