Library/opencv

openCV SVM

퓨림노 2013. 1. 25. 16:45

SVM C/C++ code


>> 주의사항

 - svm 에 초기값을 제대로 넣어주어야 결과가 제대로 나온다. 

   dataclass 의 type 수를 2개만 줄건지 그 이상 줄건지 확실히 하도록 하자.  그렇지 않으면 svm 의 predict() 함수의 return 값이 원하는 값이 아닐 거다!


>> 코드 


- 초기화

// Set up training data
float labels[4] = {1.0, 2.0, 2.0, 1.0};
Mat labelsMat(4, 1, CV_32FC1, labels);
float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };
Mat trainingDataMat(4, 2, CV_32FC1, trainingData);

-  train & predict



SVM svm;
	svm.train(trainingDataMat, labelsMat, Mat(), Mat(), params);

	Vec3b green(0,255,0), blue (255,0,0);
	// Show the decision regions given by the SVM
	for (int i = 0; i < image.rows; ++i)
		for (int j = 0; j < image.cols; ++j)
		{
			Mat sampleMat = (Mat_(1,2) << i,j);
			float response = svm.predict(sampleMat);
			//cout << "response =" << response << endl;
			
			if ( response == 1)
				image.at(j, i)  = green;
			else if (response == -1)
				image.at(j, i)  = blue;
		}
	}

... 

predict() 함수


float response = svm.predict(sampleMat, true);

위의 함수에서 2번째 parameter 로 true 값을 줄 경우 distance 값이 출력. ( distance 값을 출력하기 위해서는 class type=2 이어야 함)



>> 추가 설명

 - 이미지를 training 하고 SVM 을 이용하여 classification 을 하고 싶을 때에는 HOG, sift 등 feature 정보를 담자. 

 - 하는 방법은 찾아보기!


전체 소스코드 - 열어보자