《学习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. ...
随机推荐
- [置顶] Linux高编之进程--------fork函数的同步与异步(兄弟子进程和父子孙进程示列)
前面讲述的fork函数的基本用法,下面通过两个程序来说明fork函数同步与异步之间的关系: <1>通过fork函数实现在父进程下的四个兄弟子进程(即异步) : 函数实现代码: #inclu ...
- js实现table中前端搜索(模糊查询)
项目中用到js前端搜索功能,根据 姓名或姓名 进行 搜索,实现方法如下,遍历table所有行中的某列,符合条件则置tr为display:'',不满足条件置tr为display:none. 代码如下: ...
- uva 11300 - Spreading the Wealth(数论)
题目链接:uva 11300 - Spreading the Wealth 题目大意:有n个人坐在圆桌旁,每个人有一定的金币,金币的总数可以被n整除,现在每个人可以给左右的人一些金币,使得每个人手上的 ...
- ASP.NET常用导出Excel方法汇总
本文转载:http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html http://geekswithblogs.net/a ...
- Android开发ImageView控件缩放图片
首先还是最基础的ImageView控件如何显示图片: <ImageView Android:id="@+id/imgView" ...
- 通过SSHFS在RHEL中安全的挂载远程Linux/UNIX目录或文件系统--转载
You can easily mount remote server file system or your own home directory using special sshfs and fu ...
- iOS-UICollectionView自定义布局
UICollectionView自定义布局 转载: http://answerhuang.duapp.com/index.php/2013/11/20/custom_collection_view_l ...
- [转] CSS transition
https://css-tricks.com/almanac/properties/t/transition/ The transition property is a shorthand prope ...
- [转] 函数编程之闭包漫谈(Closure)
在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义 先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境).这个从字面上很难理解,特别对于一 ...
- 配置Nginx 1.8支持PHP 5.6
启动PHP和Nginx 修改Nginx配置文件/usr/local/nginx/conf/nginx.conf server { listen ; server_name localhost; loc ...