プロジェクトで C++ の opencv ライブラリを使用していますが、MouseCallback の使用に問題があります。
コールバック関数内で使用する必要がある 2 つのデータ メンバーを持つクラス BoardCalibration があります。このクラスを以下に示します。
class BoardCalibration{
private:
Rect _box; <-- data members i need to upadte inside the callback function
bool _drawingBox; <--
public:
BoardCalibration();
static void my_mouse_callback(int event, int x, int y, int flags, void* param);
Rect calibrate(Mat& image);
void drawBox(IplImage* img);
};
calibration() メソッドで、コールバック my_mouse_callback 関数を受け取る関数を呼び出しています。コード:
Rect BoardCalibration::calibrate(Mat& image){
IplImage * img = new IplImage(image);
namedWindow("Calibration");
IplImage *temp = cvCloneImage(img);
cvSetMouseCallback("Calibration", my_mouse_callback, (void *)img);
while (1){
imshow("Calibration", Mat(img));
cvCopyImage(img,temp);
if( _drawingBox ){
drawBox(temp);
}
imshow("Calibration", Mat(temp));
if (waitKey(1)>=0)
break;
}
cout << "calibrated\n";
delete img;
return _box;
}
そして、 my_mouse_callback の実装は次のとおりです。
static void my_mouse_callback(int event, int x, int y, int flags, void* param){
IplImage* image = (IplImage*) param;
switch( event ) {
case CV_EVENT_MOUSEMOVE: {
if( _drawingBox ) {
_box.width = x-_box.x;
_box.height = y-_box.y;
}
}
break;
case CV_EVENT_LBUTTONDOWN: {
_drawingBox = true;
_box = Rect( x, y, 0, 0 );
}
break;
case CV_EVENT_LBUTTONUP: {
_drawingBox = false;
if( _box.width<0 ) {
_box.x+=_box.width;
_box.width *=-1;
}
if( _box.height<0 ) {
_box.y+=_box.height;
_box.height*=-1;
}
//drawBox(image, box); // keep draw on screen
// display rectangle coordinates
cout << "TopLeft: (" << _box.x << "," << _box.y << "), BottomRight: ("
<< _box.x+_box.width << "," << _box.y+_box.height << ")" << endl;
}
break;
}
}
ご覧のとおり、ここで _box および _drawingBox メンバーに到達しようとしていますが、静的メソッドであるため認識されません。どうすればこの問題を解決できますか?? my_mouse_callback のプロトタイプを変更することはできません。そうしないと、cvSetMouseCallback によって受け入れられません。また、それらが既に定義されているというエラーが発生するため、クラスの外部でこれらのデータメンバーを定義することもできません。他に試すことができるものはありますか?ありがとう。