2. Kinh nghiệ m:
1.6 Phân nhóm và Tìm kiếm trong không gian đa chiều
cvKMeans2
Chia tách tập các vectơ bởi một số lượng nhất định các cụm. int cvKMeans2(const CvArr* samples, int nclusters,
CvArr* labels, CvTermCriteria termcrit, int attempts=1, CvRNG* rng=0,
int flags=0, CvArr* centers=0, double* compactness=0);
samples nổi ma trận điểm của mẫu đầu vào, một hàng cho mỗi mẫu nclusters Số cụm để phân chia các thiết lập bởi
labels đầu ra vector số nguyên chỉ số lưu trữ cluster cho tất cả các mẫu
termcrit Chỉ định số lượng tối đa của lặp đi lặp lại và / hoặc tính chính xác (khoảng cách trung tâm có thể di chuyển bằng giữa lặp đi lặp lại sau này)
attempts cố gắng bao nhiêu lần các thuật toán được thực hiện bằng cách sử dụng labelings khác nhau ban đầu. Các thuật toán- trả về rithm nhãn mang lại nhỏ gọn tốt nhất (xem các thông số Hàm cuối cùng)
rng Tùy chọn ngẫu nhiên số máy phát điện bên ngoài, có thểđược sử dụng để hoàn toàn kiểm soát được Hàm haviour
flags có thể là 0 hoặc CV_KMEANS_USE_INITIAL_LABELS. Các giá trị này có nghĩa là trong nỗ lực đầu tiên (và có thể là duy nhất), Hàm sử dụng người dùng cung cấp nhãn như ban
đầu xấp xỉ thay vì tạo ra các nhãn ngẫu nhiên. Đối với những nỗ lực thứ hai và tiếp tục, Hàm sẽ sử dụng các nhãn được tạo ra ngẫu nhiên trong bất kỳ trường hợp nào
centers tùy chọn mảng đầu ra của các trung tâm cụm compactness tham sốđầu ra tùy chọn, được tính như
∑i || samplesi - centerslabelsi ||2
sau khi mọi nỗ lực, giá trị tốt nhất (tối thiểu) được chọn và các nhãn tương ứng được tái quay bằng Hàm. Về cơ bản, người sử dụng chỉ có thể sử dụng cốt lõi của Hàm, thiết lập số lượng các nỗ lực đến 1, khởi tạo nhãn mỗi thời gian sử dụng một thuật toán tùy chỉnh (flags=CV_KMEAN_USE_INITIAL_L) và, dựa trên chặt đầu ra hoặc bất kỳ tiêu chuẩn khác, chọn phân nhóm tốt nhất.
CvKMeans2 Hàm thực hiện một thuật toán k-có nghĩa là tìm thấy các trung tâm của nclusters cụm, nhóm các mẫu đầu vào xung quanh các cụm. Đầu ra, labels(i) chứa một cụm chỉ số cho các mẫu được lưu trữở hàng thứ i của samples ma trận.
#include "cxcore.h" #include "highgui.h"
void main( int argc, char** argv ) {
#define MAX_CLUSTERS 5
CvScalar color_tab[MAX_CLUSTERS];
IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 ); CvRNG rng = cvRNG(0xffffffff); color_tab[0] = CV_RGB(255,0,0); color_tab[1] = CV_RGB(0,255,0); color_tab[2] = CV_RGB(100,100,255); color_tab[3] = CV_RGB(255,0,255); color_tab[4] = CV_RGB(255,255,0); cvNamedWindow( "clusters", 1 );for(;;) {
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 ); /* generate random sample from multigaussian distribution */ 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) ); }
/* shuffle samples */
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_tab[cluster_idx], CV_FILLED ); } cvReleaseMat( &points ); cvReleaseMat( &clusters ); cvShowImage( "clusters", img ); int key = cvWaitKey(0);
if( key == 27 ) break;
} }
Chương 2: cv. Xử lý hình ảnh và thị giác máy tính