2012-05-30 3 views
-1

Я работал с kmeans и хотел бы использовать адаптивные методы. Вы знаете какую-либо библиотеку или способ сделать это в OpenCV?Реализация адаптивных алгоритмов в OpenCV

+0

адаптивные методы что? кластеризация? что-то другое? как k-означает значение для всего этого? уточните свой вопрос, есть адаптивные алгоритмы для широкого спектра применений. чего вы пытаетесь достичь? не ожидайте хороших ответов, если вы не напишите хороший вопрос – penelope

ответ

0

Возможно, вы захотите попробовать функцию k-ближайшего соседа в OpenCV. Вот пример того, как использовать его:

#include "ml.h" 
#include "highgui.h" 

int main(int argc, char** argv) 
{ 
    const int K = 10; 
    int i, j, k, accuracy; 
    float response; 
    int train_sample_count = 100; 
    CvRNG rng_state = cvRNG(-1); 
    CvMat* trainData = cvCreateMat(train_sample_count, 2, CV_32FC1); 
    CvMat* trainClasses = cvCreateMat(train_sample_count, 1, CV_32FC1); 
    IplImage* img = cvCreateImage(cvSize(500, 500), 8, 3); 
    float _sample[2]; 
    CvMat sample = cvMat(1, 2, CV_32FC1, _sample); 
    cvZero(img); 

    CvMat trainData1, trainData2, trainClasses1, trainClasses2; 

    // form the training samples 
    cvGetRows(trainData, &trainData1, 0, train_sample_count/2); 
    cvRandArr(&rng_state, &trainData1, CV_RAND_NORMAL, cvScalar(200,200), cvScalar(50,50)); 

    cvGetRows(trainData, &trainData2, train_sample_count/2, train_sample_count); 
    cvRandArr(&rng_state, &trainData2, CV_RAND_NORMAL, cvScalar(300,300), cvScalar(50,50)); 

    cvGetRows(trainClasses, &trainClasses1, 0, train_sample_count/2); 
    cvSet(&trainClasses1, cvScalar(1)); 

    cvGetRows(trainClasses, &trainClasses2, train_sample_count/2, train_sample_count); 
    cvSet(&trainClasses2, cvScalar(2)); 

    // learn classifier 
    CvKNearest knn(trainData, trainClasses, 0, false, K); 
    CvMat* nearests = cvCreateMat(1, K, CV_32FC1); 

    for(i = 0; i < img->height; i++) 
    { 
     for(j = 0; j < img->width; j++) 
     { 
      sample.data.fl[0] = (float)j; 
      sample.data.fl[1] = (float)i; 

      // estimates the response and get the neighbors' labels 
      response = knn.find_nearest(&sample,K,0,0,nearests,0); 

      // compute the number of neighbors representing the majority 
      for(k = 0, accuracy = 0; k < K; k++) 
      { 
       if(nearests->data.fl[k] == response) 
        accuracy++; 
      } 
      // highlight the pixel depending on the accuracy (or confidence) 
      cvSet2D(img, i, j, response == 1 ? 
       (accuracy > 5 ? CV_RGB(180,0,0) : CV_RGB(180,120,0)) : 
       (accuracy > 5 ? CV_RGB(0,180,0) : CV_RGB(120,120,0))); 
     } 
    } 

    // display the original training samples 
    for(i = 0; i < train_sample_count/2; i++) 
    { 
     CvPoint pt; 
     pt.x = cvRound(trainData1.data.fl[i*2]); 
     pt.y = cvRound(trainData1.data.fl[i*2+1]); 
     cvCircle(img, pt, 2, CV_RGB(255,0,0), CV_FILLED); 
     pt.x = cvRound(trainData2.data.fl[i*2]); 
     pt.y = cvRound(trainData2.data.fl[i*2+1]); 
     cvCircle(img, pt, 2, CV_RGB(0,255,0), CV_FILLED); 
    } 

    cvNamedWindow("classifier result", 1); 
    cvShowImage("classifier result", img); 
    cvWaitKey(0); 

    cvReleaseMat(&trainClasses); 
    cvReleaseMat(&trainData); 
    return 0; 
} 

http://opencv.willowgarage.com/documentation/cpp/k_nearest_neighbors.html

Если вы хотите использовать это в C++ есть большой учебник на этом сайте:

http://aishack.in/tutorials/knearest-neighbors-in-opencv/

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