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;
}

显示结果:

posted on 2013-03-22 12:58  suwen  阅读(168)  评论(0编辑  收藏  举报

导航