《学习OpenCV》第四章 第二题

这个题目纠结了一下下,有几点原因,慢慢说。

先贴代码:

 

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

void my_call_back(int event, int x, int y, int flags, void* param);

int main(int argc, char* argv[]){
    IplImage* img = cvLoadImage("D:\\picture\\rena0.jpg");
    cvNamedWindow("demo",CV_WINDOW_AUTOSIZE);
    cvShowImage("demo", img);
    cvSetMouseCallback("demo", my_call_back, (void*)img);
    while (1){
        cvShowImage("demo", img);
        char c = cvWaitKey(15);
        if (c == 27)break;
    }
    cvReleaseImage(&img);
    cvDestroyWindow("demo");
    return 0;
}

void my_call_back(int event, int x, int y, int flags, void* param){
    CvScalar s;
    IplImage* img = (IplImage*)param;
    CvFont font = cvFont(10);
    char text[20];
    cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.0, 1.0);
    switch (event){
    case CV_EVENT_LBUTTONUP:
        s = cvGet2D(img, y, x);
        sprintf(text, "B:%d G:%d R:%d", (int)s.val[0], (int)s.val[1], (int)s.val[2]);
        cvPutText(img, text, cvPoint(x, y), &font, cvScalar(255 - s.val[0], 255 - s.val[1], 255 - s.val[2]));
        break;
    }
}

 

细心的话应该会注意到这一句s = cvGet2D(img, y, x);为什么要把xy反过来写呢?可以参照上一篇随笔,有详细的解释,这和矩阵的下标关系有关,学习过矩阵的话应该很容易理解这中间的原因。

还有一个问题就是,如果选择的图片超过屏幕的显示范围的话,点选的位置和文本显示的位置会有差异,有兴趣可以试试看。之前我以为是代码的BUG,但是用200x200的全零矩阵试一下发现不是代码的问题,如果图片小的话完全不会出现这种问题。

运行结果如下图:

话说,能年玲奈真是太可爱了,('jjj')

posted @ 2013-12-07 00:04  sixfancy  阅读(175)  评论(0)    收藏  举报