OpenCV第四章p126_2
/* 第四章2 * 读入并显示一副图像,但用户鼠标点击图像时,获取图像对应像素的颜色值, * 并在图像上点击鼠标处用文本将颜色值显示出来 */ #include <opencv/cv.h> #include <opencv/highgui.h> bool g_draw = 0; double g_blu, g_grn, g_red; //char *g_rgb = (char *)malloc(30*sizeof(char *)); //char g_rgb[30]; char *g_rgb = (char *)malloc(sizeof(char *)); CvPoint g_point; CvFont g_font; void my_mouse_callback(int event, int x, int y, int flags, void *param){ IplImage *img = (IplImage *)param; switch(event){ case CV_EVENT_LBUTTONDOWN: case CV_EVENT_RBUTTONDOWN:{ g_draw = 1; // CvScalar pt = cvGet2D(img, y, x); // blu = pt.val[0]; // grn = pt.val[1]; // red = pt.val[2]; g_blu = *((uchar *)img->imageData+y*img->widthStep+x*img->nChannels+0); g_grn = *((uchar *)img->imageData+y*img->widthStep+x*img->nChannels+1); g_red = *((uchar *)img->imageData+y*img->widthStep+x*img->nChannels+2); // memset(g_rgb, 0, 30); sprintf(g_rgb, "(%.0f,%.0f,%.0f)", g_blu, g_grn, g_red); g_point = cvPoint(x, y); cvInitFont(&g_font, 3, 1.0, 1.0, 0, 2, CV_AA); break; } default: g_draw = 0; break; } } int main(int argc, char **argv) { IplImage *img, *temp; char src[] = "F:\\test\\p126_2\\p126_2\\fruits.jpg"; img = cvLoadImage(src, CV_LOAD_IMAGE_COLOR); if(!img){ cvNamedWindow("ERROR",CV_WINDOW_AUTOSIZE); cvWaitKey(0); return 0; } cvNamedWindow("p126_2",CV_WINDOW_AUTOSIZE); cvShowImage("p126_2", img); // 先在窗口展示图片 temp = cvCloneImage(img); // 生成一个临时图片,用于显示带有文字的图像 cvSetMouseCallback("p126_2", my_mouse_callback, (void *)img); while(1){ cvCopyImage(img, temp); // 将img复制给temp,刷掉文字 if(g_draw){ cvPutText(temp, g_rgb, g_point, &g_font, cvScalar(g_blu,g_grn,g_red)); // 文字颜色设置,验证数据的正确性 cvShowImage("p126_2", temp); // 在这里显示图片,文字会一直显示,直到下一次鼠标点击 } // cvShowImage("p126_2", temp); // 在这里显示图片,文字只会在按下鼠标时出现。 if(cvWaitKey(33) == 27) break; } cvReleaseImage(&temp); cvReleaseImage(&img); cvDestroyWindow("p126_2"); return 1; }
显示结果: