opencv의 setMouseCallBack 함수는 두번째 인자로 cv::MouseCallBack
이란 함수 포인터를 받는다.
이 함수는 마지막 인자로 void* userdata
를 받는데, 여러개의 데이터를 함수로 passing 하고 싶을땐 아래와 같이 한다.
#include<opencv2/opencv.hpp>
void MouseCallBackFunc(int event, int x, int y, int flags, void* userdata) {
std::vector<int>* labels = static_cast<std::vector<int>*>(((void**)userdata)[0]);
std::vector<cv::Point>* trainingData=static_cast<std::vector<cv::Point>*>(((void**)userdata)[1]);
cv::Mat* image = static_cast<cv::Mat*>(((void**)userdata)[2]);
cv::Point pt(x, y);
if (event == cv::EVENT_LBUTTONDOWN) {
labels->push_back(1);
trainingData->push_back(pt);
cv::circle(*image, pt, 3, cv::Scalar(0, 255, 0), CV_FILLED, CV_AA);
}
if (event == cv::EVENT_RBUTTONDOWN) {
labels->push_back(-1);
trainingData->push_back(pt);
cv::circle(*image, pt, 3, cv::Scalar(0, 0, 255), CV_FILLED, CV_AA);
}
cv::imshow("mouse", *image);
}
int main(int, char**){
//Create palette
int width = 512, height = 512;
cv::Mat image = cv::Mat::zeros(height, width, CV_8UC3);
// Set up training data
std::vector<int> labels;
std::vector<cv::Point> trainingData;
void* userdata[] = { &labels,&trainingData,&image };
cv::imshow("mouse", image);
cv::setMouseCallback("mouse", MouseCallBackFunc, (void*)userdata);
cv::waitKey(0);
}