一.问题出现:
博文: opencv鼠标响应处理点击打开链接中提到模板选取画框,以及错误时撤销画框。这部分怎么实现呢?
我想到了两种方法:第一种是自己建立双向链表来处理,这种方式也不错。
第二种使用VC自有的list 模板类。
二.点击打开链接查看list类的相关信息:
STL 列表类是序列容器的一个模板类,用于将它们的元素保持为线性排列,并允许在序列的任何位置高效插入和删除。 序列存储为双向链接的元素列表,每个包含 一些 Type 类型的成员。
里面有相关函数都讲解比较详细,遇到问题可以实时去查询。
三.实际应用
我这边直接针对我上面提到的实际应用做些归纳。
1.头文件
#include <list>
2.结构体
typedef struct
{
Rect Mobanbox; //绘制上去的矩形框
int Id; //序号
}moban;
3.定义list
list<moban> mylist; //强大之处在于任何数据格式都可以加入< >,以适合我们需要,我们这里加入的是结构体
list<moban>::iterator it;
4.过程
*增加框
每画个框,坐标赋给Mobanbox。
mylist.pushback(moban); //并加入到mylist
for(it=mylist.begin();it!=mylist.end();it++) ///每次都将所有的框在原图上画一次。
{
Curmoban=*it; //取出当前框
drawBox(frame,Curmoban.Mobanbox, Scalar(0, 255, 255),1); //画框函数
}
*撤销绘制的框
mylist.erase(it); //从列表中撤销绘制的框。
5. 再结合鼠标事件,便可实现左键画框,右键撤销绘制的框了。
6.扩展性
这个模板的用途还是相当广的,可以用于多目标追踪,绘图存储删除.......。暂时只用到这些。虽然简单,意义蛮大。
7.看下效果:截图位置和比例不同,两张图会有差异。
左图绘制六个框 右图撤销一个框