1

IplImage私のプロジェクトは、特定のウィンドウのクライアント領域のビットマップ スナップショットを取得し、このデータをインスタンスに変換します。次に、グレースケール変換、脱穀などの後、指定された最小サイズ (面積) を超える輪郭の周りにバウンディング ボックスが描画されます。
結果は、cvNamedWindow

ここで行う必要があるのは、ユーザーがこれらの四角形内をクリックしてこの輪郭を効果的に「選択」できるようにすることです。これにより、アプリケーションはサブレクトを新しい画像として抽出し、ディスクに保存できます。

C ++でOpenCVを使用してこれをどのように達成できますか?

4

2 に答える 2

2

境界ボックスを保存すると、マウス イベント ハンドラーの for ループで、ボックスがクリックされた場合と、どのボックスがクリックされたかを確認できます。マウスイベントを作成するコード:

cvNamedWindow("MyWindow", CV_WINDOW_NORMAL);
cvSetMouseCallback("MyWindow", mouseEvent, 0);
imshow("MyWindow", image);

void mouseEvent(int evt, int x, int y, int flags, void *param) {
    if (evt == CV_EVENT_LBUTTONDOWN) {
        printf("%d %d\n", x, y);
    }
}

これらの座標が境界ボックス内にあるかどうかを確認する方法は、おそらく自分で見つけることができます。また、コメントに記載されているように、C++ API を使用することをお勧めします。コツをつかめばはるかに簡単です。

于 2013-05-22T06:36:17.550 に答える
0

選択した画像を実際に抽出する方法に他の誰かが興味を持っている場合は、
次の方法でそれを行うことができました。

inline
IplImage* getSubImage(IplImage *image, CvRect region)
{
    cvSetImageROI(image, region);
    IplImage *imgRet = cvCreateImage( cvSize(region.width, region.height), image->depth, image->nChannels );
    cvCopy(image, imgRet);
    cvResetImageROI(image);
    return imgRet;
}

inline
bool pointInRect(const int x, const int y, const CvRect& r)
{
    return (
        (x > r.x) && (x < (r.x + r.width)) &&
        (y > r.y) && (y < (r.y + r.height))
    );
}

void onMouseEvent(int evt, int x, int y, int flags, void *param)
{
    if (evt == CV_EVENT_LBUTTONDOWN) {
        // boundingBoxes is declared as a vector of CvRects and
        //    filled in the main loop using cvBoundingRect(contour)
        for(UINT i = 0; i < boundingBoxes.size(); i++)
        {
            CvRect rect = boundingBoxes[i].rect;
            if( pointInRect(x, y, rect) )
            {
                IplImage* img = getSubImage(imgSource, rect);
                // Do whatever you want with the sub-image here
                cvNamedWindow("Selection");
                cvShowImage("Selection", img);
                cvReleaseImage(&img);
                break;
            }
        }
    }
}
于 2013-05-23T00:43:15.107 に答える