[opencv] setMouseCallBack

spring·2020년 11월 9일
0

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);
}
profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글