OpenCv

2012-04-06 3 views
0

을 사용하여 이미지 기능 분류를위한 SVM 내 프로젝트 범위는 샘플 이미지 기능 세트를 비교하여 통화 메모입니다. 샘플 이미지의 피쳐 추출 부분을 완료했습니다. 또한 나는 텍스트 파일이나 XML 파일과 그 분류에 샘플 이미지 기능을 저장할 필요가있다. OpenCv에서 SVM 분류자를 사용하여 이미지 분류 부분을 도와주세요.OpenCv

이것은 내가 완료 한 피쳐 추출 코드입니다.

INT 본체 (intargc, 숯 ** ARGV) {계조로 화상을로드 //

//declaring Mat object.This will holds an image(like iplimage in old opencv versions). 

Mat gray_scale_img; 


//imread is used to load an image. in here i have load the image as a grayscale image. 

gray_scale_img=imread("100.jpg",CV_LOAD_IMAGE_GRAYSCALE); 


/*surf detector settings*/ 

//setting the threshold value.high value will result low number of keypoints. 
int hessian=100; 

//initializing the surf keypoint detector 
SurfFeatureDetectordetector(hessian); 


/*detect surf key points*/ 


//creating vector to store detected keypoints 
std::vector<KeyPoint>keypoints; 

//detect keypoints 
detector.detect(gray_scale_img,keypoints); 


/*extract descriptor vectors/feature vectors from each and every keypoints */ 

SurfDescriptorExtractor extractor; 


//this mat object will goinf to hold the extracted descriptors. 
Mat descriptors; 

//extracting descriptors/features 
extractor.compute(gray_scale_img,keypoints,descriptors); 

}

을 OpenCV에서

답변

1

SVM은 CvSVM 클래스에서 구현되고

매트릭스 형태 (행 방향)의 특징 벡터가 있어야합니다.

다음과 같이 매트가 될 것입니다, 당신은 당신의 특징 벡터로 폭 높이를 사용하는 가정 (당신이 20 특징 벡터를 가정) : 나는 믿고있어

Mat FV(20,2, CV_32F); 
Mat flagmat(20,1,CV_8U); 

/* 
code to populate the matrix FV. 

Fill the matrix with values so that it will look something as follows: 

20 30 
30 40 
.. 
.. 
code to populate the matrix flagmat. 
Fill the matrix with labels of each corresponding feature vector in matrix FV. It will look something as follows: 
1 
-1 
1 
1 
-1 
1 
1 
1 
.. 
*/ 

CvSVM svm; 

svm.train(datamat, flagmat,Mat(),Mat(),CvSVMParams()); 

Mat testFV(20,2,CV_32F); 
Mat sample(1,2,CV_32F); 

/* similarly as described above fill testFV matrix*/ 
float res;// to store result 
for(int i =0;i<testFV.rows;i++) 
{ 

    sample.at<float>(0,0)=testFV.at<float>(i,0); 
    sample.at<float>(0,1)=testFV.at<float>(i,1); 
    float res = svm.predict(sample); 
    cout<<"predicted label: "<<res<<endl; 
} 

당신이 할 수있는 기능에서 숫자 값을 추출 descriptors/vectors를 만들고 위의 코드에서 샘플 행렬에 넣으십시오. 기능 벡터를 사용중인 모든 기능 설명 자로 바꿀 수 있습니다.

+0

일부 소스 코드를 얻을 수 있습니까? –