OpenCV 4.2习题解答
2013-09-07 16:16
218 查看
chap 4. 2 在图上显示鼠标点击处的B G R分量值
本程序的简化为,鼠标点击之处的 b g r 分量在 cmd窗口显示
图片上显示 固定语句 "hello"
1,由于响应鼠标事件需要回调函数,所以在回调函数 mymouse_callback 中,判定 鼠标左键是否按下。
如果按下,则全局变量 key_down = true ; 否则, key_down = false;
2,将 img 定义为全局变量,可以在 回调函数中的 void* param直接使用 img 而非 param , 实际上没什么区别。
3, 左键抬起,将 img 清零,并重新加载原始的图像 one.jpg 。
这样做的目的是单击后,显示BGR分量和“hello”,抬起后恢复图片;下次单击,则是原始的图片。
如果没有该部分,则每单击一次,图片上多出一处“hello” 语句。
4,src 的作用也是相似的。
如果将 src = cvLoadImage("D:\\lxlx\\one.jpg") ;
直接改成 img=cvLoadImage("D:\\lxlx\\one.jpg");
那么每单击一次,多一处 “hello” 语句。
5,全局变量 CvPoint point 是为了标记单击坐标。
6,key_down 内部前几行代码是取该坐标点处的 B G R 分量。
之前我写的代码和这个有所不同,才用的是 cvPtr2D( ) 。
由于取分量的BGR值时,相应的偏移量没有计算正确,导致单击若干点后,会出现错误。
错误提示: 。。。。out of range .....之类的。
如果你有更简洁的代码或思路,欢迎共享与讨论。
本程序的简化为,鼠标点击之处的 b g r 分量在 cmd窗口显示
图片上显示 固定语句 "hello"
#include<opencv2/opencv.hpp> #include<iostream> // chap 4.2 IplImage* img=NULL; bool key_down=false; CvPoint point=cvPoint(0,0); void mymouse_callback(int event, int x, int y, int flags, void* param) { point.x=x; point.y=y; switch(event) { case CV_EVENT_LBUTTONDOWN: { key_down=true; } break; case CV_EVENT_LBUTTONUP: { cvZero(img); img=cvLoadImage("d:\\lxlx\\one.jpg");// refresh img } break; default: { } break; } } void main() { using namespace std; cvNamedWindow("one"); IplImage* src=cvLoadImage("D:\\lxlx\\one.jpg"); img=cvCreateImage(cvGetSize(src),8,3); cvCopy(src,img); while(1) { cvSetMouseCallback("one",mymouse_callback,(void*)img); if(key_down) { uchar* ptr=(uchar*)(img->imageData+point.y*img->widthStep); int b=ptr[3*point.x+0]; int g=ptr[3*point.x+1]; int r=ptr[3*point.x+2]; cout<<b<<" "<<g<<" "<<r<<endl; CvFont font=cvFont(5,1); cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,1,1,0,1,8); cvPutText(img,"hello",point,&font,cvScalar(0,0,255)); cvShowImage("one",img); key_down=false; if(cvWaitKey(50)>0) break; } else { cvShowImage("one",img); if(cvWaitKey(50)>0) break; } } cvReleaseImage(&src); cvReleaseImage(&img); cvDestroyWindow("one"); }
1,由于响应鼠标事件需要回调函数,所以在回调函数 mymouse_callback 中,判定 鼠标左键是否按下。
如果按下,则全局变量 key_down = true ; 否则, key_down = false;
2,将 img 定义为全局变量,可以在 回调函数中的 void* param直接使用 img 而非 param , 实际上没什么区别。
3, 左键抬起,将 img 清零,并重新加载原始的图像 one.jpg 。
这样做的目的是单击后,显示BGR分量和“hello”,抬起后恢复图片;下次单击,则是原始的图片。
如果没有该部分,则每单击一次,图片上多出一处“hello” 语句。
4,src 的作用也是相似的。
如果将 src = cvLoadImage("D:\\lxlx\\one.jpg") ;
直接改成 img=cvLoadImage("D:\\lxlx\\one.jpg");
那么每单击一次,多一处 “hello” 语句。
5,全局变量 CvPoint point 是为了标记单击坐标。
6,key_down 内部前几行代码是取该坐标点处的 B G R 分量。
之前我写的代码和这个有所不同,才用的是 cvPtr2D( ) 。
由于取分量的BGR值时,相应的偏移量没有计算正确,导致单击若干点后,会出现错误。
错误提示: 。。。。out of range .....之类的。
如果你有更简洁的代码或思路,欢迎共享与讨论。
相关文章推荐
- OpenCV 3.3 习题解答
- OpenCV 3.5 习题解答
- OpenCV 4.4 习题解答
- OpenCV 3.6 习题解答
- OpenCV 3.1.b习题解答
- OpenCV 4.1习题解答
- OpenCV 3.1.c and 3.1.d 习题解答
- [詹兴致矩阵论习题参考解答]习题4.2
- [詹兴致矩阵论习题参考解答]习题6.13
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.8
- [詹兴致矩阵论习题参考解答]习题7.2
- 深入理解计算机系统第二版习题解答CSAPP 2.3
- 《算法导论》第二章习题解答
- c++ primer 课后习题个人解答 part1 3.3
- 周志华《机器学习》课后习题解答系列(一):目录
- 现代控制理论习题解答与Matlab程序示例
- 周志华《机器学习》课后习题解答系列(四):Ch3.5 - 编程实现线性判别分析
- 快学Scala习题解答第十三章---------集合
- TCP/IP详解卷1:协议第四章课后习题解答
- [偏微分方程教程习题参考解答]2.1基本概念