OpenCV+KMeans算法

来源:互联网 发布:淘宝店培训哪家比较好 编辑:程序博客网 时间:2024/05/21 19:25
<span style="font-size:18px;">#include <opencv2/opencv.hpp>#include <iostream> using namespace std;using namespace cv; int main(int argc, char** argv){    #define  MAX_CLUSTERS 5    CvScalar color_table[MAX_CLUSTERS];    IplImage* img = cvCreateImage(cvSize(500,500),8,3);    cvNamedWindow("source", 1);    cvShowImage("source", img);    cvWaitKey(0);    CvRNG rng = cvRNG(0xffffffff);    color_table[0] = CV_RGB(255,0,0);    color_table[1] = CV_RGB(0,255,0);    color_table[2] = CV_RGB(0,0,255);    color_table[3] = CV_RGB(255,0,255);    color_table[4] = CV_RGB(255,255,0);    cvNamedWindow("clusters", 1);    while(true)    {        int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1;        int i, sample_count = cvRandInt(&rng)%1000 + 1;        CvMat* points = cvCreateMat(sample_count,1,CV_32FC2);        CvMat* clusters  = cvCreateMat(sample_count,1,CV_32SC1);        //高斯分布产生随机点        for (k = 0; k < cluster_count; k++)        {            CvPoint center;            CvMat point_chunk;            center.x = cvRandInt(&rng)%img->width;            center.y = cvRandInt(&rng)%img->height;            cvGetRows(points, &point_chunk, k*sample_count/cluster_count,                k == cluster_count - 1 ? sample_count:(k+1)*sample_count/cluster_count);            cvRandArr(&rng,&point_chunk,CV_RAND_NORMAL,cvScalar(center.x,center.y,0,0),                cvScalar(img->width/6, img->height/6,0,0));        }        for(i = 0; i < sample_count/2; i++)        {            CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;            CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;            CvPoint2D32f temp;            CV_SWAP(*pt1,*pt2, temp);        }        cvKMeans2(points,cluster_count,clusters,cvTermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER,10, 1.0));        cvZero(img);        for(i = 0; i < sample_count; i++ )        {            CvPoint2D32f pt = ((CvPoint2D32f*)points->data.fl)[i];            int cluster_idx = clusters->data.i[i];            cvCircle(img, cvPointFrom32f(pt), 2, color_table[cluster_idx], CV_FILLED);        }        cvReleaseMat(&points);        cvReleaseMat(&clusters);        cvShowImage("clusters", img);        if(cvWaitKey(0) == 27)   //'ESC'            break;    }    return 0;}</span>






1 0