实现的是一个图像标签编辑器,其间遇到了些问题还未解决或者可能解决方法上不是最优,若你有更好的思路可以提供给我,大恩不言谢啦!!☆⌒(*^-゜)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. Windows宿主机访问Ubuntu中mysql数据库笔记

    1.网络 既然要远程ubuntu的系统.那么首先是两个网络是不是在一个网段.能不能ping的通? a)  Windows电脑上--cmd 打开命令窗口.键入:ipconfig 命令.查看主机IP. b ...

  2. ELK初学搭建(logstash)

    ELK初学搭建(logstash) elasticsearch logstash kibana ELK初学搭建 logstash 1.环境准备 centos6.8_64 mini IP:192.168 ...

  3. JS:九宫格抽奖转盘实例

    工作需要,所以做了个抽奖转盘的插件,当然这里只做最简单的演示.可以用于取代一些flash抽奖程序. 机制说明: 1.通过定义lottery-unit来控制节点的个数及索引: 2.通过设置lottery ...

  4. html5 文件拖拽上传

    本文首先发表在  码蜂笔记 : http://coderbee.net/index.php/web/20130703/266 html5 文件拖拽上传是个老话题了,网上有很多例子,我一开始的代码也是网 ...

  5. Color Cube – 国产的优秀配色取色工具

    官方下载地址:http://fancynode.dbankcloud.com/ColorCube2.0.1ForWin.rar 比如今天所要介绍的 Color Cube (配色神器) 就属于“功大于过 ...

  6. Android color(颜色) 在XML文件和java代码中

    Android color(颜色) 在XML文件和java代码中,有需要的朋友可以参考下. 1.使用Color类的常量,如: int color = Color.BLUE;//创建一个蓝色 是使用An ...

  7. HDOJ 4696 Answers 乱搞

    乱搞: rt.有1就能输出全部的数,否则仅仅能输出偶数 Answers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/1 ...

  8. StopWatch

    附件 http://download.csdn.net/detail/teststudio/6575241 主窗体UNIT unit MainForm; interface uses Windows, ...

  9. 打开WEBBROWSER的选中文件路径

      uses CommCtrl, httpApp, ShellApi; {  GetWebPath(WebBrowser1); } function GetWebPath(web: TWebBrows ...

  10. JavaCodeTra 猴子选猴王 约瑟夫循环

    之前用的是循环链表,java刚学,不知道怎么用链表.用个小算法吧 代码: import java.util.Scanner; /** * */ /** * @author john * @约瑟夫循环/ ...