1. #include <highgui.h>
  2. #include <cv.h>
  3. #include "opencv_libs.h"
  4.  
  5. #pragma comment (lib,"opencv_calib3d231d.lib")
  6. #pragma comment (lib,"opencv_contrib231d.lib")
  7. #pragma comment (lib,"opencv_core231d.lib")
  8. #pragma comment (lib,"opencv_features2d231d.lib")
  9. #pragma comment (lib,"opencv_flann231d.lib")
  10. #pragma comment (lib,"opencv_gpu231d.lib")
  11. #pragma comment (lib,"opencv_haartraining_engined.lib")
  12. #pragma comment (lib,"opencv_highgui231d.lib")
  13. #pragma comment (lib,"opencv_imgproc231d.lib")
  14. #pragma comment (lib,"opencv_legacy231d.lib")
  15. #pragma comment (lib,"opencv_ml231d.lib")
  16. #pragma comment (lib,"opencv_objdetect231d.lib")
  17. #pragma comment (lib,"opencv_ts231d.lib")
  18. #pragma comment (lib,"opencv_video231d.lib")
  19.  
  20. /*
  21. *《学习OpenCV》第四章第三题a
  22. * 完成时间:22:17 3/30 星期六 2013
  23. */
  24.  
  25. /* 矩形框 */
  26. CvRect rect;
  27.  
  28. bool draw = false; // 标记是否在画
  29.  
  30. IplImage* img;
  31. IplImage * temp;
  32. IplImage * original;
  33.  
  34. void draw_rect(IplImage* img, CvRect rect)
  35. {
  36. cvRectangle( img,
  37. cvPoint( rect.x, rect.y ),
  38. cvPoint( rect.x + rect.width, rect.y + rect.height),
  39. cvScalar( 0x00, 0x00, 0xff) );
  40. printf("draw\n");
  41. }
  42.  
  43. // 鼠标回调函数
  44. void my_mouse_callback( int event, int x, int y, int flags, void* param)
  45. {
  46. IplImage* image = (IplImage*) param;
  47.  
  48. switch( event )
  49. {
  50. case CV_EVENT_MOUSEMOVE:
  51. {
  52. if(draw)
  53. {
  54. rect.width = x - rect.x;
  55. rect.height = y - rect.y;
  56. }
  57. }
  58. break;
  59. case CV_EVENT_LBUTTONDOWN:
  60. {
  61. draw = true;
  62. rect = cvRect( x, y, , );
  63. }
  64. break;
  65. case CV_EVENT_LBUTTONUP:
  66. {
  67. draw = false;
  68. if(rect.width < )
  69. {
  70. rect.x += rect.width;
  71. rect.width *= -;
  72. }
  73. if(rect.height < )
  74. {
  75. rect.y += rect.height;
  76. rect.height *= -;
  77. }
  78. // draw
  79. draw_rect(image, rect);
  80. }
  81. break;
  82. // 在右键按下时清除
  83. case CV_EVENT_RBUTTONDOWN:
  84. cvCopyImage(original, img);
  85. printf("clear.\n");
  86. break;
  87. }
  88. }
  89.  
  90. int main()
  91. {
  92. img = cvLoadImage( "lena.bmp", );
  93.  
  94. rect = cvRect( -, -, , );
  95.  
  96. // 副本
  97. temp = cvCloneImage( img );
  98. original = cvCloneImage(img);
  99.  
  100. cvNamedWindow("draw rect");
  101. cvSetMouseCallback("draw rect", my_mouse_callback, (void*)img);
  102.  
  103. while()
  104. {
  105. cvCopyImage(img, temp);
  106.  
  107. if(draw)
  108. {
  109. draw_rect( temp , rect );
  110. }
  111.  
  112. cvShowImage( "draw rect", temp);
  113.  
  114. if(cvWaitKey() == )
  115. break;
  116. }
  117. cvReleaseImage(&img);
  118. cvReleaseImage(&temp);
  119. cvReleaseImage(&original);
  120. cvDestroyAllWindows();
  121.  
  122. return ;
  123. }

运行结果:

《学习OpenCV》练习题第四章第三题a的更多相关文章

  1. 《学习OpenCV》练习题第四章第三题b

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" /* *<学习OpenCV ...

  2. 《学习OpenCV》练习题第四章第八题ab

    这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合. 说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedet ...

  3. 《学习OpenCV》练习题第四章第七题abc

    题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...

  4. OpenCV实现的高斯滤波探究_1(《学习OpenCV》练习题第五章第三题ab部分)

    首先看下OpenCV 官方文档对于cvSmooth各个参数的解释: Smooths the image in one of several ways. C: void cvSmooth(const C ...

  5. 《学习OpenCV》 第四章 习题六

    实现的是一个图像标签编辑器,其间遇到了些问题还未解决或者可能解决方法上不是最优,若你有更好的思路可以提供给我,大恩不言谢啦!!☆⌒(*^-゜)v. #include "stdafx.h&qu ...

  6. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  7. 《学习OpenCV》练习题第四章第二题

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  8. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  9. 学习opencv中文版教程——第二章

    学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...

随机推荐

  1. 5.cadence原理图上[原创]

    一.库管理 1.打开原理图,,按键盘P键 在目标库下可以直接收索需要的元件,则可直接找到 在原理图中放置器件时,结束放置快捷键:Esc 双击后,可自动将该元件对应的库添加到你的库中,该方法找元件效果好 ...

  2. armeabi,armeabi-v7a ,x86 和mips 都是什么?

    首先要明白ABI的概念:  ABI(Application Binary Interface)实际就是指应用程序基于哪种指令集来进行编译,我们能用到的ABI 也就四种  armeabi,armeabi ...

  3. DbProviderFactories.GetFactoryClasses

    using System.Data.Common; private void Method1() { DataTable table = DbProviderFactories.GetFactoryC ...

  4. openfire源码分析

    启动流程 Socket接口 Socket通信使用Mina框架实现,是XMPP协议的处理入口,具体为: 消息接收后由不同的节处理器处理: StanzaHandler基础消息类型,之后进行消息路由: 最后 ...

  5. Debian 如何更改hdmi接口输出的分辨率

    1. 先删除无用的文件: a) Boot/boot.src b) Boot/script.bin 2. 打开boot/script.fex,找到disp_init节点 a) 将screenX_outp ...

  6. HDU 2084 数塔

    没什么好说的,这是我学DP的第一道题目. //#define LOCAL #include <iostream> #include <cstdio> #include < ...

  7. bzoj2982: combination

    借(cao)鉴(xi)自popoqqq大爷的lucas定理的写法 #include<cstdio> #include<cstring> #include<cctype&g ...

  8. jquery中html()/text()/val()区别

    html就是你可以添加<span></span><li></li>的标记text只能写文本如果写了上面的标记则会以文本形式输出,就是输出标签体的内容va ...

  9. 扩容盘、SD卡扩容

    内存卡的前世今生回想当年,大家都还在用着非智能机,由于功能单一,需要存储的数据也就是通讯录和短信.虽然那时也有手机游戏,但大多都是几十KB,并不需要太大的存储空间.但随着手机功能的多样化,尤其是音乐. ...

  10. Task和BackTask

    一.总结性知识点:     1.Android应用运行时会创建任务Task,用于存放主窗口     2.每一个任务包含一个堆栈数据结构,用于保存当前应用已创建的窗口对象,这个堆栈即回退栈BackSta ...