2014-12-24 5 views
2

Я пытаюсь скопировать десять двумерных точек с помощью kmeans OpenCV. Код выглядит следующим образом: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

Привет, Андрей! Большое спасибо за ваш комментарий! Теперь я добавил инициализацию. Мне не удалось преобразовать данные вектора в другой формат, который работал с 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

Спасибо, он работает! –

Смежные вопросы