
时间为友,记录点滴。
聊了这么多的图片运算,忽然有个想法,为什么非要用静态的图片来展示运算呢?我们可以用自己做的图片来经过运算后显示出来。说干就干。
先想一下需求:
- 整体环境非黑即白。
- 可以用鼠标在背景上画出矩形,矩形内容要填充成反色。
- 可以通过鼠标画的矩形展示图片的逻辑操作。
好就这吧,怎么而实现呢?老规矩,大象放冰箱的三步走:
OpenCV中的矩形类实现
rect
创建一个矩形:rect(X0, Y0, width, height), X0/Y0代表矩形的起点,width, height代表矩形的宽和高。这四个变量就把矩形的位置和大小限定了。
- area(): 面积
- size(): 尺寸,及[width, height]
- tl(): 左上顶点坐标
- br(): 右下顶点坐标
- width(): 宽度
- heigth(): 高度
- contains(Point(x, y)): 是否包含Point点
- &: rect = rect1 & rect2; 求两个矩形的交集
- | : rect = rect1 | rect2; 求两个矩形的并集
- ==: rect1 == rect2; 判断两个矩形是否相等
- 平移:rect = rect + Point(x, y); 其实就是对左上顶点坐标做加法
- 缩放:rect = rect + Size(x, y);其实就是对width和height做加法。
rectangle
void
- img: 可以认为是Mat 类型的Image.
- pt1: 矩形的一个顶点,比如:rect.tl
- pt2:矩形的pt1的对立顶点,比如:rect.br
- color: 矩形的颜色值或者灰度值。
- thickness: 是否需要填充 thickness>0?不填充:填充
- lineType: 线的类型,参考LineTypes
- shift Number of fractional bits in the point coordinates.
OpenCV中的鼠标实现画矩形
鼠标先知道一个函数就够了
void
- winname:窗口的名字
- onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
- userdate:传给回调函数的参数
void
- event: CV_EVENT_*变量之一
常见的event:
cv2_EVENT_MOUSEMOVE 鼠标滑动
cv2_EVENT_LBUTTONDOWN 左键点击
cv2_EVENT_RBUTTONDOWN 右键点击
cv2_EVENT_MBUTTONDOWN 中间点击
cv2_EVENT_LBUTTONUP 左键释放
cv2_EVENT_RBUTTONUP 右键释放
cv2_EVENT_MBUTTONUP 中间释放
cv2_EVENT_LBUTTONDBLCLK 左键双击
cv2_EVENT_RBUTTONDBLCLK 右键双击
cv2_EVENT_MBUTTONDBLCLK 中间双击
- x/y: 鼠标指针在图像坐标系的坐标(不是窗口坐标系)
- flags: CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。
cv2_EVENT_FLAG_LBUTTON 左键拖拽
cv2_EVENT_FLAG_RBUTTON 右键拖拽
OpenCV中的图片逻辑操作
//逻辑运算:
好了,完成了构思,和基本的概念,coding。。。
第一步:先实现一个矩形类,并且把它画出来,看看基本的&|操作是否有用。
static
打印输出:


第二步:构造鼠标操作
注意点:
- 为了实现实时更新矩形,需要在while(1)的线程和callback函数中对矩形做动态调整。
- Not/And/Or的操作分别在“EVENT_LBUTTONUP” “EVENT_LBUTTONDOWN”时有操作的不同。
#include
运行结果:
