4

OpenCVでは、Point(x、y)のようなポイント位置を、マウスコールバック関数で画像をクリックしたmain()関数に戻したいと思います。グローバル変数を設定する以外に方法はありますか?

on_mouse()関数内にすべてのコードを書きたくありません。

ありがとう

4

3 に答える 3

6

クラスなどとは別に、そこでSafirsのアイデアを拡張するには、ポイント自体を渡すことができます。

void on_mouse( int e, int x, int y, int d, void *ptr )
{
    Point*p = (Point*)ptr;
    p->x = x;
    p->y = y;
}

Point p;
namedWindow("win");
setMouseCallback("win",on_mouse, (void*)(&p) );

// changed value of p will be accessible here 
于 2013-03-22T13:08:46.823 に答える
3

データへのポインタをパラメータとしてに渡すことで、グローバル変数の使用を回避できますsetMouseCallback()。@berekに同意します。グローバル変数に関する混乱を避けるために、以下に完全な例を示したいと思います。

using namespace cv; 

void on_mouse( int e, int x, int y, int d, void *ptr )
{
    Point*p = (Point*)ptr;
    p->x = x;
    p->y = y;
}

in main() {
    Point p;
    namedWindow("window");
    Mat image = imread("someimage.jpg");
    imshow(image);


    //pass a pointer to `p` as parameter
    setMouseCallback("window",on_mouse, &p ); 

    // p will update with new mouse-click image coordinates 
    // whenever user clicks on the image window 
}
于 2013-03-22T15:25:18.140 に答える
-2

いいえ、これは不可能です。これはon_mouse()コールバック関数であるためです。これがopencvのドキュメントです。

したがって、「グローバル」変数がこの問題を解決する唯一の方法です。または、より適切なソリューションを探している場合は、namedWindowとを含むラッパークラスを作成しMouseCallback、プライベートメンバー変数を作成できます。この変数は、マウスのコールバック関数が呼び出されたときに操作されます。

于 2013-03-22T12:47:53.897 に答える