CvPoint begin, end;
void my_callback_GUI3b(int event, int x, int y, int flags, void* param) { IplImage* img0 = (IplImage*)param; IplImage* img1 = cvCloneImage(img0); switch(event) { case CV_EVENT_LBUTTONDOWN: begin = cvPoint(x, y); break; case CV_EVENT_LBUTTONUP: //end = cvPoint(x, y); if(x < begin.x) { end.x = begin.x; begin.x = x; } else { end.x = x; } if(y < begin.y) { end.y = begin.y; begin.y = y; } else { end.y = y; } cvRectangle(img1, begin, end, cvScalar(0, 255, 0)); /* cvSetImageROI(img1, cvRect(begin.x, begin.y, end.x-begin.x, end.y-begin.y)); cvSetZero(img1); cvResetImageROI(img1); */ //count int rt[3][8]; for(int i=0; i<3; i++) { for(int j=0; j<8; j++) { rt[i][j] = 0; } } int tmp = 0; int row, col; for(row = begin.y; row <= end.y && row < img1->height; row++) { for(col = begin.x; col<= end.x && col < img1->width; col++) { rt[0][*(cvPtr2D(img1, row, col) + 0)/32]++; rt[1][*(cvPtr2D(img1, row, col) + 1)/32]++; rt[2][*(cvPtr2D(img1, row, col) + 2)/32]++; *(cvPtr2D(img1, row, col) + 0) = 255; } } cvShowImage("Left Image", img1); //画条形图 int width = 480 + 8*10; //坐标总宽度,每个条形20像素宽,每组隔开10个像素,用于美观 int height = 200; //坐标高度 IplImage* img2 = cvCreateImage(cvSize(width, height + 30), IPL_DEPTH_8U, 3); //30大小用于画横坐标 cvZero(img2); //画横坐标 cvLine(img2, cvPoint(0, height), cvPoint(width, height), cvScalar(255, 255, 255)); int total[8] = {0, 0, 0, 0, 0, 0, 0, 0}; for(int i=0; i<8; i++) { //各个范围中 for(int j=0; j<3; j++) { //三个通道的像素总和 total[i] += rt[j][i]; //各个范围内,像素总和 } if(total[i] == 0) total[i] = 1; } int row0, col0; for(int i=0; i<8; i++) { //横坐标加文字 char* s = (char*)malloc(50*sizeof(char*)); memset(s, 0, 50); sprintf(s, "[%d,%d]", i*32, (i+1)*32-1); CvFont textfont = cvFont(10.0, 1); cvInitFont(&textfont, CV_FONT_HERSHEY_SIMPLEX, 0.5f, 0.5f, 0, 1);; cvPutText(img2, s, cvPoint(i*70, height + 20), &textfont, cvScalar(255, 255, 255)); for(int j=0; j<3; j++) { row0 = height - height*rt[j][i]/total[i]; //每组中,各通道像素占比;也就是按比例画 col0 = i*60 + j*20 + i*10; for(row=row0; row<height; row++) { for(col=col0; col<col0+20; col++) { *(cvPtr2D(img2, row, col)+j) = 255; //用相应的颜色画柱形图 } } } } cvShowImage("Right", img2); break; } } void myGUI3b() { cvNamedWindow("Left Image"); cvNamedWindow("Right"); IplImage* src = cvLoadImage("lena.jpg"); cvShowImage("Left Image", src); cvSetMouseCallback("Left Image", my_callback_GUI3b, src); cvWaitKey(0); }