《学习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);为什么要把x和y反过来写呢?可以参照上一篇随笔,有详细的解释,这和矩阵的下标关系有关,学习过矩阵的话应该很容易理解这中间的原因。
还有一个问题就是,如果选择的图片超过屏幕的显示范围的话,点选的位置和文本显示的位置会有差异,有兴趣可以试试看。之前我以为是代码的BUG,但是用200x200的全零矩阵试一下发现不是代码的问题,如果图片小的话完全不会出现这种问题。
运行结果如下图:
话说,能年玲奈真是太可爱了,('jjj')