5

タイトルが示すように、OpenCV の mouseCallback 関数をクラス ベースの C++ 構造に実装する際に問題が発生しています。説明させてください。BriskMatching という名前のクラスを定義しました。このクラスでは、OpenCV が必要とする正しいパラメーターを使用して mouseCallback という名前のメンバー関数を作成しました (以下のコード スニペットを参照してください)。

**Briskmatching.h**

class BriskMatching
{
public:
    BriskMatching();
    ~BriskMatching();

public:
    void mouseCallback(int event, int x, int y, int flags, void *param);
};

これで問題ありませんが、この関数を OpenCV の関数を介して指定されたマウス コールバック関数として設定しようとすると、問題が発生しcv::setMouseCallbackます。

私のメイン関数では、briskMatcher と呼ばれる BriskMatching クラスのインスタンスを作成し、マウスのコールバックを設定するときが来たら、そのようにしようとします...

cv::setMouseCallback("Matches", BriskMatching::mouseCallback, &matchesImg);

残念ながら、これはエラーをスローします。

Error   3   error C3867: 'BriskMatching::mouseCallback': function call missing argument list; use '&BriskMatching::mouseCallback' to create a pointer to member c:\users\mobilef\documents\visual studio 2010\projects\opencv_objtracking\opencv_briskmatching\main.cpp 54  1   OpenCV_BriskMatching

staticのようにmouseCallback 関数を宣言することでこのエラーを取り除くことができましたが、mouseCallback 関数BriskMatching.hで多くの非静的メンバー変数を参照しているため、他のエラーが大量に発生します。

だから皆さんへの私の質問はこれです。BriskMatching クラス内で宣言された mouseCallback 関数を関数に適切に渡すことができるようにするには、コードをどのように変更すればよいcv::setMouseCallbackですか?

高度なご協力ありがとうございます。

4

2 に答える 2

12

メンバー関数はthisポインターを取るため、静的ラッパー関数が必要になります。通常、paramメンバー関数が属するオブジェクトのアドレスとしてパラメーターを使用するため、最終的には次のようになります。

...
static void mouseCallback(int event, int x, int y, int flags, void *param);

void doMouseCallback(int event, int x, int y, int flags);

そして、内部mouseCallback

void BriskMatching::mouseCallback(int event, int x, int y, int flags, void *param)
{
    BriskMatching *self = static_cast<BriskMatching*>(param);
    self->doMouseCallback(event, x, y, flags);
}
于 2013-07-11T09:36:42.370 に答える