knndigits 예제 프로그램은 필기체 숫자 인식 성능을 확인하기 위해 사용자가 직접 마우스로 영상 위에 글씨를 쓰고, 학습된 kNN 모델로 확인하는 인터페이스를 제공합니다. 그러므로 knndigits 프로그램은 마우스 이벤트를 처리하여 영상에 그림을 그리는 함수를 만들어 사용할 것입니다. 코드 15-3에 나타난 on_mouse() 함수는 마우스 왼쪽 버튼을 누른 상태에서 마우스를 움직이면 해당 위치에 두께 40픽셀로 흰색 글씨를 쓸 수 있습니다.
코드 15-3 마우스로 숫자 그리기 [ch15/knndigits]
01 Point ptPrev(-1, -1); 02 03 void on_mouse(int event, int x, int y, int flags, void* userdata) 04 { 05 Mat img = *(Mat*)userdata; 06 07 if (event = = EVENT_LBUTTONDOWN) { 08 ptPrev = Point(x, y); 09 } else if (event = = EVENT_LBUTTONUP) { 10 ptPrev = Point(-1, -1); 11 } else if (event = = EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) { 12 line(img, ptPrev, Point(x, y), Scalar::all(255), 40, LINE_AA, 0); 13 ptPrev = Point(x, y); 14 15 imshow("img", img); 16 } 17 }
• 7~8행 마우스 왼쪽 버튼을 누른 위치를 ptPrev에 저장합니다.
• 9~10행 마우스 왼쪽 버튼을 떼면 ptPrev 좌표를 (-1, -1)로 초기화합니다.
• 11~13행 마우스 왼쪽 버튼을 누른 상태로 마우스가 움직이면 ptPrev 좌표부터 (x, y) 좌표까지 직선을 그립니다. 그리고 ptPrev 좌표를 (x, y)로 변경합니다.