2011-06-27 9 views
3

私のクラス名はHandMotionRecognitionで、私はマウスコールバックでgetColorPixelメソッドを呼び出しています。これはOpenCVでVisual Studio 2010を使用しており、プロジェクトタイプはC++ - > cliです。OpenCV 2.1 Managed C++(CLI/C++)のcvSetMouseCallback

標準コードは(私は誤解だ場合を除き)マウスイベントを処理するために

cvSetMouseCallback("CameraIn", getColorPixel, (void*) frameHSV); 

である。しかし、私はコンパイル時に

error C3867: 'HandMotionRecognition::getColorPixel': function call missing argument list; use '&HandMotionRecognition::getColorPixel' to create a pointer to member

そして、コンパイル時にエラーを与える私は私が話したとしますと私はコンパイルエラーを取得

cvSetMouseCallback("CameraIn", &HandMotionRecognition::getColorPixel, (void*) frameHSV); 

しかし、再び...このようなコードを置く。..

error C3374: can't take address of 'HandMotionRecognition::getColorPixel' unless creating delegate instance

だから私はこのようなデリゲートを作成...私はHandMotionRecognition.hでdelegate void MouseCallbackDelegate(int event, int x, int y, int flags, void *param);を入れ

  1. I [作成delegate..Iが、これは100%正しいことを知りません] cvSetMouseCallback("CameraIn", &HandMotionRecognition::getColorPixel, (void*) frameHSV);

    MouseCallbackDelegate ^StaticDelInst = gcnew MouseCallbackDelegate(this, &HandMotionRecognition::getColorPixel); 
    

    cvSetMouseCalの代わりにHandMotionRecognition.cppにこのコードを置きますlback( "CameraIn"、StaticDelInst、(void *)frameHSV);

しかし、それは、コンパイルエラーを与える:(これは私が得る唯一のエラーである)

error C2664: 'cvSetMouseCallback' : cannot convert parameter 2 from 'HandMotionRecognition::MouseCallbackDelegate ^' to 'CvMouseCallback'

を(私ができるようsee..thisについては代わりのWin32のCLIを使用したためです)

ここで回避策がありますか、ここで何か間違っていますか?

助けてください...

+0

エラーメッセージのかなり完全なセットです。 :-)残念ながら、CVは関数ポインタ(ネイティブ)をパラメータとして望んでいるようです。その関数は決してメンバ関数、管理された、またはネイティブではありません。 –

+0

感謝の気持ち... メンバー機能ではうまくいかないことは分かっていましたが...もう一度opencvを調べるべきです... これで修正されました。 クラスから「getColorPixel()」を削除し、同じファイル(クラスの外にある)に追加しました。それは今すぐに動作します – Sachira

答えて

4

コールバックメソッドは、あなたが発見したとして(または非メンバ関数)静的である必要があります。この場合の標準的なイディオムは、void* paramパラメータにクラスインスタンスポインタを渡し、static関数を使用してメンバ関数を呼び出すことです。現在paramを使用してframeHSVを保存しているため、他の方法で転送する必要があります(クラスインスタンスに保存するなど)。

例:

class HandMotionRecognition { 
/* your code */ 
private: 
    void getPixelColor(int event, int x, int y, int flags, void* param) { 
    } 
public: 
    static void mouseCallback(int event, int x, int y, int flags, void* param) { 
    static_cast<HandMotionRecognition*>(param)->getPixelColor(event, x, y, flags);  
    } 
} 

し、登録する:

HandMotionRecognition* hmr = /* ... */ 
hmr->setFrameHSV(frameHSV); 
cvSetMouseCallback("CameraIn", &HandMotionRecognition::mouseCallback, hmr); 
+1

@Sachiraもしそれが十分にはっきりしていない場合でも、 *と** public **。 – karlphillip

関連する問題