OpenCVでは、Point(x、y)のようなポイント位置を、マウスコールバック関数で画像をクリックしたmain()関数に戻したいと思います。グローバル変数を設定する以外に方法はありますか?
on_mouse()関数内にすべてのコードを書きたくありません。
ありがとう
OpenCVでは、Point(x、y)のようなポイント位置を、マウスコールバック関数で画像をクリックしたmain()関数に戻したいと思います。グローバル変数を設定する以外に方法はありますか?
on_mouse()関数内にすべてのコードを書きたくありません。
ありがとう
クラスなどとは別に、そこで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
データへのポインタをパラメータとしてに渡すことで、グローバル変数の使用を回避できます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
}
いいえ、これは不可能です。これはon_mouse()
コールバック関数であるためです。これがopencvのドキュメントです。
したがって、「グローバル」変数がこの問題を解決する唯一の方法です。または、より適切なソリューションを探している場合は、namedWindow
とを含むラッパークラスを作成しMouseCallback
、プライベートメンバー変数を作成できます。この変数は、マウスのコールバック関数が呼び出されたときに操作されます。