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

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "stdio.h"
#define LEN sizeof(struct Label)
void callback(int event, int x, int y, int flags, void* param);
void* isCreated(struct Label* head,CvPoint* position); //判断鼠标当前所在位置是否已经创建了标签,若已创建了则返回该标签的指针 struct Label{ //标签结构体
char text[50];
CvPoint point;
CvSize text_size; //标签文字所占区域
struct Label* next;
}*head,*current_label; //标签链表的头结点,插入新结点采用头入式 bool flag=false; //判断鼠标所在位置是否已创建了标签,false表示能创建新标签,true表示已创建只能够编辑原标签
bool isDown=false; //判断是否单击了鼠标
CvPoint position; //鼠标当前位置
CvFont font; /*******************这是一个简单的图像标签编辑器***********************/
/* 还有些细节或不足有待完善 */
/* 1、不能够光标式地逐字编辑已有的标签 */
/* 2、对已创建的标签无法实现准确定位和完全擦除 */
/* 3、当快速或大量地进行标签的编辑和创建会出现性能问题 */
/* 4、当鼠标定位到一个已存在的标签时应当高亮等提示 */
/* 5、编辑已存在标签时无法实现换行输出 */
/**********************************************************************/ /*********************************使用说明*****************************/
/* 1、单击鼠标确定要创建或编辑的标签位置 */
/* 2、在命令行窗口下输入标签的内容(非中文,单行) */
/* 3、输入内容后最后以#字符结束并回车 */
/**********************************************************************/ int main()
{
IplImage* img=cvCreateImage(cvSize(500,500),8,3);
cvZero(img);
cvNamedWindow("标签编辑器");
cvSetMouseCallback("标签编辑器",callback,img);
cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5,0.5); //设置统一的字体
char keycode=0,c;
int i;
while(1)
{
cvShowImage("标签编辑器",img);
keycode=cvWaitKey(30); i=0;
switch(keycode)
{
case 13: //按Enter键进入编辑状态
{
if(isDown)
{
printf("请输入标签内容:\n");
if(flag==false) //该位置还未创建标签
{
current_label=(struct Label*)malloc(LEN);
current_label->point=cvPoint(position.x,position.y); while((c=getchar())!=35 && i<50) //若最后输入'#'则退出编辑
{
current_label->text[i++]=c;
}
current_label->text[i]='\0'; //让cvPutText只打出\0之前的字符,不打印之后的空字符
c=getchar(); //接收最后的换行符
cvGetTextSize(current_label->text,&font,&current_label->text_size,NULL);
current_label->next=head; head=current_label; //插入到标签链表中
printf("创建了一个标签,内容为:%s\n",current_label->text);
}
else
{
cvSetImageROI(
img,
cvRect(current_label->point.x-2,current_label->point.y-current_label->text_size.height-2,current_label->text_size.width+8,current_label->text_size.height+8)
);
cvZero(img);
cvResetImageROI(img);
memset(current_label->text,0,sizeof(current_label->text)); //将text全部置空
while((c=getchar())!=35 && i<50)
{
current_label->text[i++]=c;
}
current_label->text[i]='\0';
c=getchar(); //接收最后的Enter键
cvGetTextSize(current_label->text,&font,&current_label->text_size,NULL);
}
cvPutText(img,current_label->text,current_label->point,&font,cvScalar(255,255,255));
flag=false;
isDown=false;
}
}
break;
case 27: //按Esc直接关闭当前窗口
return 0;
default:
break;
}
}
cvDestroyWindow("标签编辑器");
cvReleaseImage(&img);
return 0;
} void callback(int event, int x, int y, int flags, void* param)
{
IplImage* img=(IplImage*)param;
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
{
isDown=true;
position.x=x; position.y=y;
current_label=(Label*)isCreated(head,&position);
if(current_label)
{
flag=true;
printf("当前标签内容为:%s\n",current_label->text);
}
else
flag=false;
}
break;
} } void* isCreated(struct Label* head,CvPoint* position)
{
struct Label *p=head,*dst=NULL;
while(p!=NULL)
{
if(position->x>=(p->point.x-4) && position->x<=(p->point.x+p->text_size.width+4)
&& position->y>=(p->point.y-p->text_size.height-4) && position->y<=(p->point.y+6))
{
dst=p;
return (void*)dst;
}
p=p->next;
}
return NULL;
}

  

《学习OpenCV》 第四章 习题六的更多相关文章

  1. 统计学习导论:基于R应用——第四章习题

    第四章习题,部分题目未给出答案 1. 这个题比较简单,有高中生推导水平的应该不难. 2~3证明题,略 4. (a) 这个问题问我略困惑,答案怎么直接写出来了,难道不是10%么 (b) 这个答案是(0. ...

  2. python学习心得第四章

     python 学习心得第四章 1.lambda表达式 1:什么是lambda表达式 为了简化简单函数的代码,选择使用lambda表达式 上面两个函数的表达式虽然不一样,但是本质是一样的,并且lamb ...

  3. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  4. PythonCrashCourse 第四章习题

    Python 从入门到实践第四章习题 4.1想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for 循环将每种比萨的名称都打印出来 修改这个for 循环,使其打印包含比萨名称的句子,而不仅仅 ...

  5. c语言学习之第四章

    第四章 第四章主要介绍了分支结构,循环结构的简单使用,还有其他简单的语句结束语句,比如,break,continue.还有gote语句.下面是我学习C语言第四章的一些心得和总结. 1简单的if语句 简 ...

  6. 第三周学习java第四章学习总结及体会!

    第三周java 2第四章的学习总结: 一.主要内容(类与对象): 1.类: 2.构造方法与对象的创建: 3.类与程序的基本结构: 4.参数传值: 5.对象的组合: 6.实例成员与类成员: 7.方法重载 ...

  7. Windows程序设计(第五版)学习:第四章 文本输出

    第四章 文本输出 1,客户区:整个应用程序窗口中没有被标题栏.边框.菜单栏.工具栏.状态栏和滚动条占用的区域.简而言之,客户区就是窗口中程序可以在上面绘制并向用户传达可视化信息的区域.   2,大多数 ...

  8. C++ Primer Plus学习:第四章

    C++入门第四章:复合类型 1 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 使用数组前,首先要声明.声明包括三个方面: 存储每个元素中值的类型 数组名 数组中的元素个数 声明的通 ...

  9. o'Reill的SVG精髓(第二版)学习笔记——第四章

    第四章:基本形状 4.1线段 SVG可以使用<line>元素画出一条直线段.使用时只需要指定线段起止点的x和y坐标即可.指定坐标时可以不带单位,此时会使用用户坐标,也可以带上单位,如em. ...

随机推荐

  1. Eclipse Code Template 设置自动加注释(转)

    Eclipse Code Template 设置自动加注释 设置注释模板的入口: Window->Preference->Java->Code Style->Code Temp ...

  2. 【nodejs】创建udp套接字的类型参数的含义

    nodejs在创建udp套接字的时候,需要传入一个类型参数.有两种类型参数可供选择:udp4和udp6.udp4对应的就是ipv4,udp6对应的是ipv6.

  3. Python_oldboy_自动化运维之路(一)

    python简介: Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有 ...

  4. 10.30 afternoon

    P76竞赛时间: ????年??月??日??:??-??:?? 题目名称 他 她 它 名称 he she it 输入 he.in she.in it.in 输出 he.out she.out it.o ...

  5. RegistryKey 类

    表示 Windows 注册表中的项级节点. 此类是注册表封装. 继承层次结构 System.Object   System.MarshalByRefObject    Microsoft.Win32. ...

  6. Java中JIN机制及System.loadLibrary() 的执行过程

    Android平台Native开发与JNI机制详解 http://mysuperbaby.iteye.com/blog/915425 个人认为下面这篇转载的文章写的很清晰很不错. 注意Android平 ...

  7. oracle 查看用户表数目,表大小,视图数目等

    查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * fr ...

  8. 直接修改workspace下的配置文件与tomcat下的文件

    项目中直接修改workspace下的配置文件与tomcat下的文件,可是还有错误,例如修改了4个配置文件中的一个配置文件.经查如下: 直接修改workspace下的配置文件与tomcat下的文件,可能 ...

  9. IOS UIColor 自定义颜色

    使用 UIColor定义颜色 和 同 CIColor 与  CGColor 之间的联系.转换 1. 利用UIColor展现 #F6F6F6 这个传统的颜色 #F6F6F6 为一个 16 进制表示的RP ...

  10. Asp.Net 注册 邮箱激活

    数据库 表的设计 State为用户状态  0为禁用  1为可用  默认为0,下面有个UserGUID,这个字段将来用于激活账户 首先你要写一个表单,验证码神马的,这个我就不写了..直接写处理的 代码在 ...