2014-12-24 6 views
2

OpenCV kmeans를 사용하여 10 개의 2 차원 점을 클러스터하려고합니다. 코드는 다음과 같습니다opencv kmeans가 잘못된 결과를 반환합니다.

vector<Point2f>data(10); 
data[0] = {118.90323, 1088.7419}; 
data[1] = {143.5, 1064.5}; 
data[2] = {110, 1054}; 
data[3] = {662, 645}; 
data[4] = {650, 625.5}; 
data[5] = {94, 363}; 
data[6] = {60, 360}; 
data[7] = {103.97369, 315.71054}; 
data[8] = {70.5, 313}; 
data[9] = {1466, 278.55554}; 
cout << "data:" << data << endl; 
Mat labels; 
int cluster_number = 4; 
TermCriteria criteria = TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 40, 0.1); 
Mat centers; 
kmeans(data, cluster_number, labels, criteria, 1, KMEANS_RANDOM_CENTERS, centers); 
cout << "centers:" << centers << endl; 
cout << "labels:" << labels << endl; 

출력은 : 이것은 분명히 잘못된 것입니다

data: 
[118.90323, 1088.7419; 143.5, 1064.5; 110, 1054; 662, 645; 650, 625.5; 94, 363; 60, 360; 103.97369, 315.71054; 70.5, 313; 1466, 278.55554] 

centers: 
[1.9113665e-38, 2.4802983e-43; 0, 0; 118.90323, 1088.7419; 0, 0] 

labels: 
[2; 0; 0; 0; 0; 0; 0; 0; 3; 1] 

. 나는 레이블

을하고 싶은

[0,0,0,1,1,2,2,2,2,3]

이 도와 주셔서 대단히 감사합니다!

+0

어떻게 데이터를 설정 했습니까? 그것은 귀하의 코드에 표시되지 않습니다. –

+0

안녕하세요 Andrey! 댓글 주셔서 대단히 감사합니다! 이제 초기화 작업을 추가했습니다. 벡터 을 kmeans와 함께 사용하는 다른 형식으로 변환 할 수 없었습니다 ... 잘못된 배열 형식이 이상한 결과의 원인이라고 생각하십니까? –

답변

0

이 테스트는 나를 위해 작동 :

void main() 
{ 
    float data[10][2]= 
    {{118.90323, 1088.7419}, 
    {143.5, 1064.5}, 
    {110, 1054}, 
    {662, 645}, 
    {650, 625.5}, 
    {94, 363}, 
    {60, 360}, 
    {103.97369, 315.71054}, 
    {70.5, 313}, 
    {1466, 278.55554}}; 


    Mat points(10,2, CV_32FC1,*data); 
    cout << points << endl; 
    Mat labels, centers; 
    int k =4; 
    cv::kmeans(points,k, labels,TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),3, KMEANS_PP_CENTERS, centers); 
    std::cout << "labels: " << labels << endl; 
    std::cout << "centers " << centers << endl; 
    cv::waitKey(0); 
    getchar(); 
} 
+0

대단히 고마워요, 작동합니다! –

관련 문제