• 5행 cv::ml 네임스페이스를 사용하도록 설정합니다.
• 22~23행 kNN 이름의 창에 트랙바를 부착하고, 트랙바가 움직이면 on_k_changed() 함수가 실행되도록 합니다.
• 25~38행 (150, 150) 좌표를 중심으로 하는 0번 클래스 점, (350, 150) 좌표를 중심으로 하는 1번 클래스 점, (250, 400) 좌표를 중심으로 하는 2번 클래스 점을 각각 30개씩 생성하여 훈련 데이터에 추가합니다. 0번과 1번 클래스 점은 각각의 중심을 기준으로 표준 편차 50에 해당하는 가우시안 분포를 따르고, 2번 클래스 점은 중심을 기준으로 표준 편차 70에 해당하는 가우시안 분포를 따릅니다.
• 40행 프로그램이 처음 실행되자마자 kNN 알고리즘으로 분류된 결과를 보여 주도록 trainAndDisplay() 함수를 호출합니다.
• 46~50행 트랙바를 움직여서 k 값이 바뀌면 다시 kNN 알고리즘을 학습시키고 그 결과를 화면에 나타냅니다.
• 52~59행 addPoint() 함수는 특정 좌표 점 pt를 cls 클래스로 등록합니다.
• 63행 StatModel::train() 함수를 이용하여 kNN 알고리즘을 학습합니다.
• 65~80행 img 영상 전체 좌표에 대해 kNN 분류기 응답을 조사하여 빨간색, 녹색, 파란색으로 표시합니다.
• 82~94행 25~38행에서 추가한 훈련 데이터 점 좌표에 반지름 5인 원을 각각 빨간색, 녹색, 파란색으로 표시합니다.
코드 15-1에서 main() 함수는 주로 훈련 데이터를 만드는 작업을 수행합니다. 25~38행 코드가 실행되면 train 행렬은 90×2 크기의 행렬이 되고, label 행렬은 90×1 크기의 행렬이 됩니다. train 행렬은 2차원 평면에서 정의된 점들의 좌표를 포함하고 있으며, 각 점들이 속한 클래스 정보는 label 행렬에 저장되어 있습니다. 40행에서 호출한 trainAndDisplay() 함수는 kNN 알고리즘에 의한 학습과 img 영상 모든 좌표에서의 클래스 값 예측을 진행하고 그 결과를 knn 창에 표시합니다.