《学习OpenCV》 第四章 习题六
实现的是一个图像标签编辑器,其间遇到了些问题还未解决或者可能解决方法上不是最优,若你有更好的思路可以提供给我,大恩不言谢啦!!☆⌒(*^-゜)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,¤t_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,¤t_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》 第四章 习题六的更多相关文章
- 统计学习导论:基于R应用——第四章习题
第四章习题,部分题目未给出答案 1. 这个题比较简单,有高中生推导水平的应该不难. 2~3证明题,略 4. (a) 这个问题问我略困惑,答案怎么直接写出来了,难道不是10%么 (b) 这个答案是(0. ...
- python学习心得第四章
python 学习心得第四章 1.lambda表达式 1:什么是lambda表达式 为了简化简单函数的代码,选择使用lambda表达式 上面两个函数的表达式虽然不一样,但是本质是一样的,并且lamb ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
- PythonCrashCourse 第四章习题
Python 从入门到实践第四章习题 4.1想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for 循环将每种比萨的名称都打印出来 修改这个for 循环,使其打印包含比萨名称的句子,而不仅仅 ...
- c语言学习之第四章
第四章 第四章主要介绍了分支结构,循环结构的简单使用,还有其他简单的语句结束语句,比如,break,continue.还有gote语句.下面是我学习C语言第四章的一些心得和总结. 1简单的if语句 简 ...
- 第三周学习java第四章学习总结及体会!
第三周java 2第四章的学习总结: 一.主要内容(类与对象): 1.类: 2.构造方法与对象的创建: 3.类与程序的基本结构: 4.参数传值: 5.对象的组合: 6.实例成员与类成员: 7.方法重载 ...
- Windows程序设计(第五版)学习:第四章 文本输出
第四章 文本输出 1,客户区:整个应用程序窗口中没有被标题栏.边框.菜单栏.工具栏.状态栏和滚动条占用的区域.简而言之,客户区就是窗口中程序可以在上面绘制并向用户传达可视化信息的区域. 2,大多数 ...
- C++ Primer Plus学习:第四章
C++入门第四章:复合类型 1 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 使用数组前,首先要声明.声明包括三个方面: 存储每个元素中值的类型 数组名 数组中的元素个数 声明的通 ...
- o'Reill的SVG精髓(第二版)学习笔记——第四章
第四章:基本形状 4.1线段 SVG可以使用<line>元素画出一条直线段.使用时只需要指定线段起止点的x和y坐标即可.指定坐标时可以不带单位,此时会使用用户坐标,也可以带上单位,如em. ...
随机推荐
- string.Format字符串格式说明
先举几个简单的应用案例: 1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 ...
- git 分支策略
转 http://www.ruanyifeng.com/blog/2012/07/git.html 作者: 阮一峰 如果你严肃对待编程,就必定会使用"版本管理系统"(Versio ...
- ELK初学搭建(logstash)
ELK初学搭建(logstash) elasticsearch logstash kibana ELK初学搭建 logstash 1.环境准备 centos6.8_64 mini IP:192.168 ...
- Mac OS使用技巧之十六:系统失去响应怎么办?
再好的系统,再快的本本,也会在执行时由于种种原因出现卡顿或者死机等失去响应的情况.Mac用户也会时不时碰到这样的情况,最常见的表现为鼠标变为七彩圆圈.通常等上一会儿系统会自己恢复.假设迟迟没有响应的话 ...
- docker 下 安装rancher 笔记
sudo yum update 更新系统环境 curl -sSL https://get.docker.com/ | sh 安装最新docker版本 systemctl start docker.se ...
- Java 调用Dll
Java 中怎么能调用到dll中的函数呢? 关键是java中生的本地函数名參数和dll中的本地函数名參数一模一样. 这个程序是java中调用dll中的求和函数. 一,java代码部分操作 1.新建pr ...
- Android read-only file system解决方法
adb shell su - mount -o rw,remount /system
- 修改android应用包名 分类: android 学习笔记 2015-07-16 22:48 4人阅读 评论(0) 收藏
由于项目需要,要修改已经开发好的应用包名,这本身很简单,但是如果你没找到门道,可能会白白浪费许多时间. 修改包名有三个地方要改,这三个地方的修改一定要按顺序来,否则你可能会遇到许多不必要的麻烦. 1. ...
- Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习
1. HashSet集合存储自定义对象并遍历.如果对象的成员变量值相同即为同一个对象 注意了: 你使用的是HashSet集合,这个集合的底层是哈希表结构. 而哈希表结构底层依赖:hashCode()和 ...
- 解决github提交commit,contributions不统计显示绿色的问题
最近使用GitHub Desktop时,发现自己好多次的commits都没有被记录在Contributions中,但是点开项目详情里面可以看到自己的commit确实上传成功了,所以就忧伤了,为什么没有 ...