30 Dec 2010

一个很简单的opengl例子

一个很简单的opengl例子 # include <GL/glut.h>
# include <stdlib.h>

/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
void init ( void )
{
GLfloat mat_specular [ ] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess [ ] = { 50.0 };
GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };

glClearColor ( 0.0, 0.0, 0.0, 0.0 );
glShadeModel ( GL_SMOOTH );

glMaterialfv ( GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv ( GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv ( GL_LIGHT0, GL_POSITION, light_position);

glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
}

/*调用GLUT函数,绘制一个球*/
void display ( void )
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere(1.0, 40, 50);
glFlush();
}


/* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ( );
if (w <= h)
glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w, 1.5 * ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 );
else
glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h, 1.5 * ( GLfloat ) w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity ( ) ;
}


/* 定义对键盘的响应函数 */
void keyboard ( unsigned char key, int x, int y)
{
/*按Esc键退出*/
switch (key)
{
case 27:
exit ( 0 );
break;
}
}


int main(int argc, char** argv)
{
/* GLUT环境初始化*/
glutInit (&argc, argv);
/* 显示模式初始化 */
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
/* 定义窗口大小 */
glutInitWindowSize (300, 300);
/* 定义窗口位置 */
glutInitWindowPosition (100, 100);
/* 显示窗口,窗口标题为执行函数名 */
glutCreateWindow ( argv [ 0 ] );
/* 调用OpenGL初始化函数 */
init ( );
/* 注册OpenGL绘图函数 */
glutDisplayFunc ( display );
/* 注册窗口大小改变时的响应函数 */
glutReshapeFunc ( reshape );
/* 注册键盘响应函数 */
glutKeyboardFunc ( keyboard );
/* 进入GLUT消息循环,开始执行程序 */
glutMainLoop( );
return 0;
}

23 Dec 2010

stasm+opencv




要使用STASM来定位面部特征点,步骤如下: 项目的预编译头加入stasm_dll.lib,然后复制stasm_dll.dll,stasm_dll.hpp和stasm_dll.lib到cpp所在文件夹,最后把data文件夹copy到cpp的上级文件夹,在cpp中引用#include "stasm_dll.hpp"即可.




12 Dec 2010

ZT: OpenGL教程收藏



1.DancingWind NEHE中文教程
       NEHE是十分不错的opengl教程,由浅入深,配合实例讲解。而DancingWind本着一颗分享的心,制成中文版。看官不必一课一课按顺序看但每一课都应该认真看,英文可在英文版教程观看……各位可以在这个网站下载。此外DancingWind还整合了几种OPENGL框架 、SDK()。

2.EastcowBoy  OpenGL入门学习


       连载于programfan.com论坛的入门教程,建议初学者重点看看。涉及的是OpenGL基础,真正的由浅入深,eastcowboy讲解认真详细,备足功课(崇拜ING)。也讲述了很多其他教程中很难包含的关于一点原理概念上的东西,帮助你更好理解opengl。各位可点以上链接,内有目录。(P.S.期待新作)

3.LightHouse3D
提供十分有针对性的教程,譬如三维地形技术啦Billboard公告牌技术啦GLSL教程等等。而且讲解详细,看后一定有所裨益。话说我初学GLSL就是从这里开始呢。(注意是英文哦。)另外貌似还有VRML(虚拟真实建模语言)的介绍呢。

4.Ozone3D
ozone3d.net 里面可以看到很多诱人的东西,我有机会一定得好好参详。此外网站也提供OpenGL教程,但是貌似跨度比较大的说,不太适合拿来初学。另外还有GLSL,Direct3D, Demoniak3D等等的教案,资源实在太丰富了。

5.SULACO
OpenGL的Dephi实现。记得网上也有一些Dephi版的NEHE教程了,可见学OpenGL不一定只有C/C++的。但是即使你手头上只有C/C++也可以看看sulaco的教程。不难明白的,而且更重要的是一些绚丽效果的实现手法。

6.UltimateGameProgramming
这里的教程就更加“逐步”了,十分适合给初学者一直看下去学下去。其最大特点是教程间的关联性,基本每个例子都代表一项特性并都与上下文相关。缺点是,教案是“代码”,意味着看代码学习,所以初学者还是“以此为辅”吧。(注意需要.net编译器)

7.SwiftlessGameProgramming
同样是适合初学者循序渐进地学习的教程,而且附有一定的讲解。有C++版和Basic版。关键词是“一步一步来”,恩,是的,学习不可急进。

当然,系统地学习就要有书在旁,如经典的《OpenGL编程权威指南》(红宝,现在有中文第六版了)、《OpenGL编程基础》等等,但是,要记得ZwqXin上篇文章说过的:行为决定态度啊。

再提供一些相关网站。OPENGL在这个世界上学习资源还是很多的。

Opengl.org -WIKI
Opengl.org-掌握最新信息。

Debevec
关注图形学前沿技术。

GameDev
一个属于3D技术的强大社区,高手云集于此。


开始学习OpenGL可以直接上手的awx文件
点此下载(for VC++6.0)

1 Dec 2010

ZT: Greasemonkey-让Firefox加速的油猴

Greasemonkey 是一个 firefox 扩展, 它具有通过编写脚本来改变被访问网页的功能。使用它,能使您访问的网站更便于阅读或者更便于使用。使用它,您能修复网页渲染的缺陷,而无须烦扰网站 管理员。使用它,您能让网页更好地使用残疾人援助技术,清楚响亮地说出网页内容,或者将网页内容变为盲文。使用它,您能自动地获得其它网站的数据,从而使 两个网站更好地相互链接起来。 什么是GreaseMonkey脚本?

原文链接:http://hzzgood48.com/?tag=%E6%B2%B9%E7%8C%B4%E8%84%9A%E6%9C%AC

Greasemonkey 是一个 firefox 扩展, 它具有通过编写脚本来改变被访问网页的功能。使用它,能使您访问的网站更便于阅读或者更便于使用。使用它,您能修复网页渲染的缺陷,而无须烦扰网站 管理员。使用它,您能让网页更好地使用残疾人援助技术,清楚响亮地说出网页内容,或者将网页内容变为盲文。使用它,您能自动地获得其它网站的数据,从而使 两个网站更好地相互链接起来。

然而 Greasemonkey 本身并没有作这些事。实际上,在您安装它之后,您注意到根本没有任何变动…直到您开始安装一种叫做“用户脚本”的东西。用户脚本(user script)就是一大块 javascript 代码,还有些附加信息,用来告诉 Greasemonkey 脚本应该在何时何地运行。每个用户脚本能够针对具体页面,具体网站,或者 一批网站。用户脚本能做到您在 Javascript 中可做到的任何事情。实际上,它能做得更多,因为 Greasemonkey 提供了专供用户脚本使用的函数。via
如何安装GreaseMonkey和脚本?

Greasemonkey的安装非常简单,和安装其它所有Firefox插件一样,到官方主页下载http://www.greasespot.net, 选择工具 (T)单。您应该看到四个菜单项:启用 (E)、管理用户脚本 (U)…、新建 用户脚本 (N)…和用户脚本命令 (C)。 只要管理用户脚本 (U)…可以使用,那么就装好了。装用户脚本也很简单,点击要安装的脚本链 接,会弹出一个标题为“Greasemonkey 安装过程”的对话框,其中显示了将要安装的用户脚本名称,简介以及作用与排除的页面列表。确定安装即可。
GreaseMonkey脚本推荐

下面就推荐一些比较受欢迎的Greasemonkey脚本。
1. Gmail的Greasemonkey脚本

Google Account Multi-Login

可以将Gmail右上角的Logout变成选择多个Gmail帐号切换按钮,适合多个Gmail帐号使用者。

Right Click Menu in Gmail

在你的Gmail中增加右键功能,右键包括“inbox”, “compose new”, “sent messages”, “contacts”等。

Folders4Gmail

用类似文件夹的形式来管理你的Lables。

Gmail Super Clean

美化Gmail界面。

Gmail HTML Signatures

为Gmail增加 html签 名,也可以使用我之前介绍的WiseStamp。

Gmail Filter Assistant

Fliter助手,增加一个Filter管理模块,是你能够方便的创建filter。

Gmail Addons

增加各种功能到Gmail,包括Calendar等。

Gmail + Reader Integrator

喜欢 Gmail 和 Google Reader 的你怎么可以错过这个在 Gmail 里面看 Google Reader 的 addon ?

Gmail Spam-count Hide

隐藏 Gmail 中垃圾邮件的计数。就是传说中眼不见为净的境界。
2. Google日历的Greasemonkey脚本

Google Calendar Header and Navigation Switcher

在 Google 日历的左侧和顶端显示小三角,点击它们可以隐藏 / 显示左侧栏和顶部空间,最大化主区域的面积,折叠状态可记忆。

Google Calendar Wheel Viewer

在月视图、自定义视图中用鼠标滚轮翻屏,这是 Google 日历自身没有提供的。

Google Calendar Display Current Time Line

在日视图、周视图、自定义视图中显示一条当前时间的红线,适合日程多的大忙人使用。
3. Google Reader的Greasemonkey脚本

Google Reader: Show Feed Favicons

在Google Reader中显示Feed Favicons。

Google Reader Subscribers Count

在右下角显示此feed有多少用户通过google reader订阅。

Google Reader Redux

安装后你的Google Reader里所订阅的RSS Feed将会作为一个新菜单项出现在Gmail左侧上方。

Google Reader Preview Enhanced

增加Feed网页预览功能。你可以在feed的List和expand视图进行预览。

Google Reader for wider screens

改变Google Reader现实宽度,以使宽屏电脑用户获得更好的用户体验。

Google reader full feed changer

现在有些Feed不是全文输出,怎么办呢,可以使用此脚本,实现获取feed全文。

Google Reader Minimalistic

获得最简洁的Google Reader界面。

Colorful List View

这个脚本的功能是给Google reader的list view根据不同的feed着色,效果是很华丽的。如果你的feed不多,用这个脚本可以清楚地分别出不同来源的文章,但如果你有几百个不同的feed, 这个脚本恐怕不适合你,太花了。

GoogleMonkeyR

超强的google搜索结果页增强脚本,功能包括多列显示搜索结果、移除右侧付费结果、给搜索结果编号、自动载入翻页结果等等。必装。
4. Google搜索的Greasemonkey脚本

Google Thumbnails

在搜索结果前增加网页的缩略图。

GoogleTagCloudMaker

利用搜索结果显示出一个Tag Cloud,让你更方便找到相关的内容。

Google 100

让Google每页显示100个搜索结果

Google Air Skin

可拥有多个Google应用服务的皮肤。

AutoPagerize (Pagination)

自动翻页脚本。

Google Ad Remover

从Google搜索结果中去除任何广告。

Google Account Multi-Login

多个Google账号登录。没什么需要解释的,如果有好几个Google账号的话,这个脚本很方便。

Google Shortcuts

也是针对Google搜索的一个脚本,安装后,在Google主页输入i:搜索内容 可以直接调用google图片搜索,输入w:搜索内容 则是调用wikpedia, y: 自然是youtube了。

Google Search Sidebar for FF3

为 Google 搜索结果页面加入一个右侧边栏,其中包括来自 Wikipedia、YouTube 和 Flickr 的搜索结果。只要 Google 一次,就能得到这许多结果,相当方便。

Multi-Column Results

将 Google 搜索结果分为多栏,使用 Alt + 1/2/3 组合键可在一栏、二栏、三栏切换,适合宽屏用户。

Google Time Search

提供选项,让你可以搜索指定时间范围内的网页(如过去 24 小时)。

Twitter Search on Google Search Pages

twitter 已经成为最为实时的信息中心,这个 GreaseMonkey 脚本能将 Twitter 搜索结果结成到 Google 中。

Fixed Topbar

提供一个悬浮的导航条,包括到新闻搜索、图像搜索和翻页的连接,可以节省你不少时间。

Delicious Search Results on Google

将 Delicious 的搜索结果集成至 Google。
5. 通用的浏览器辅助增强Greasemonkey脚本

GoogleTagCloudMaker

自动在搜索结果的右边生成标签云(tagcloud,覆盖了原来的赞助商广告),鼠标停留在某个标签上,就会把含有此标签的搜索结果显示在最前面。 可能我说的不是很清楚,原文也说的不是很清楚。安装一下,你就知道有多好用了。Gfan 必备!支持中文标签云哦。

Disable Text Ads

自动移除 VibrantMedia(IntelliTXT), Kontera 和 Linkworth
的内文文字广告。

RSS+Atom Feed Subscribe Button Generator

当你发现一个优秀的新博客时,你还在满屏幕找 RSS 订阅按钮吗?安装这个 addon 之后,你只需在左上角点击自动生成的订阅按钮。(感觉不是很实用,如果有高手会修改这个脚本的话,建议为这个脚本添加更强的功能:订阅到抓虾之类的按 钮。)

Textarea Backup

文本框备份。你每按下十个按键、每十秒、文本框失去焦点(就是一闪一闪的竖线状光标在文本框中消失的时候),该 addon 会自动备份一次。当文本成功提交到服务器时,保存的文字会自动删除。会自动还原的哦。

LookItUp

选中网页文字,按下” w “,右边会出现 Wikipedia 中该词的页面。原文说可以自定义,对高手来说可能比较简单。

Linkify ting

自动把一个 URL 地址变成可以点击的链接。

Google MP3

自动调用 Google MP3 Player 播放任意网页中的 MP3 ,关于 Google MP3 Player 是这样的,Gmail 会自动调用 Google MP3 Player 来播放附件中的 MP3 文件,既然 Gmail 能用这个播放器,我们当然也能拿来用了。

简 繁转换

用于对网页进行简繁体转换阅读。
6. 视频下载的Greasemonkey脚本

Apple Trailer Download

让你可以非常方便地从 movie trailers from apple.com 下载任意大小的视频。用法在你要下载的大小上右键,选择“链接另存为”。

Download Video

让你轻轻松松得到 YouTube, Google Video, Myspace, Metacafe, Break.com, Putfile, Dailymotion 和 Sevenload 里面的视频的真实地址。只要点击页面顶部黄色的 Get download link(s) to video(s) 就行。
7. Web 2.0网站增强的Greasemonkey脚本

del.icio.us Prettifier

是不是觉得 del.icio.us 的界面很没特色(很难看)?快安装上吧。

IMDB enlarge actor pictures on hover

放大 IMDB (电影资料库,这里我链接的是其中文版)中演员的照片。

AdSlicer for MySpace

移除 MySpace 中的广告和空白。

YouTube Googler

让 YouTube 的界面看起来想 Google Videos ,看来是某狂热 Gfan 的杰作。

Facebook Auto-Colorizer

facebook 颜色主题一个。

Digg – Add Mirror

在 digg it 按钮下添加这样几个按钮:在 DuggMirror , Coral Cache, Google Cache 和 Archive.org 中查看该 digg 。当该 digg 的源链接过期,你还是可以轻松地浏览该 digg 的详细内容。也可以当成代理来使用。

Last.fm Artist Fan Rank

last.fm 是一个 Web 2.0 音乐分享社区。我安装该 addon 之后,去了 Last.fm 一趟,不知道它到底是用来干嘛的。-_-|||(我已经修改了该 addon 的作用网页范围。)
8. 豆瓣相关Greasemonkey脚本

Reply buttons for new Douban

给每个帖子添加回复按钮和引用按钮,适用于豆瓣的评论,小组,日记,站务论坛,活动论坛,书影音论坛等。 点击回复按钮自动在下方的输入框中添加 @<用户ID>, 点击引用按钮则自动在下方的输入框中引用全文, 并会自动将输入焦点移至输入框,方便你在豆瓣的讨论。

Friends Toolbar for Douban

在豆瓣的”友邻广播”页面,增加一个浮动的联络用工具条。

Douban Sliding Navbar

悬停式的豆瓣二级导航栏,实现了2007.11.16豆瓣改版风波中部分用户主张的悬停式二级导航栏。

相要查找更多GreaseMonkey脚本,你可以到这个网站: http://userscripts.org/

27 Nov 2010

Powerpoint2007无法输入中文



不知道为什么,突然无法输入中文,google了一下,大多都是说这个问题


可惜的是,我这个选项本来就没有选.多次勾选/选中也不能解决问题.后来找到一个注册表的解决办法:

15 Nov 2010

Python标准库手册 - 4.1 site模块引入的常量


4.1. site模块添加的常量



site模块(启动时会自动导入,除非指定命令行参数-S)添加了一些常量给内置命名空间.它们对于交互式解释环境很有帮助,而且不应该在程序中被使用.



quit([code=None])
exit([code=None])
    当对象被打印时,打印出类似于"使用quit()或Ctrl-D(例如EOF)退出"的信息,被调用时,使用指定的退出code抛出SystemExit异常.

copyright
license
credits
    当对象被打印时,打印出类似于"输入license()查看全部许可内容"的信息,被调用时,用纸张模式显示相应的文字(一次打印一屏).
    


<<4. 内置常量    >>目录    >>5. 内置类型
    



Python标准库手册 - 4. 内置常量


4. 内置常量



    内置的命名空间仅有几个常量,它们是:
    
False
    布尔类型的"假"值
    2.3版本新增
    


True
    布尔类型的"真"值
    2.3版本新增
    
None
    types.NoneType的唯一值.None经常被用来表示值的缺失,当默认参数并未传递给一个函数时.
    2.4版本改动:为None赋值是非法的,并会抛出SyntaxError异常.
    
NotImplemented
    特殊方法"富比较"(rich comparison)(__eq__(), __lt__(), 和friends)可以返回的特殊值,用以表示对给定类型的指定比较方式并未被做实.

Ellipsis
    与扩展切片语法连用的特殊值.

__debug__
    此常量值为True如果Python没有以-0参数启动.参考assert语句.
    
注意
    名称None和__debug__无法被赋值(甚至当做参数名称也不行,抛出SyntaxError),因此他们可被认为是True常量.
    2.7版本改动:当做参数名称对__debug__赋值变为非法.



<<2. 内置函数 - 3 & 3. 次要内置函数    >>目录    >>4.1: site模块添加的常量
    



9 Nov 2010

python调用selenium模拟浏览器行为


测试python刷新签证结果的脚本时候发现,由于调用win32com模拟ie,为了等待ie的状态更新,使用了无限循环while 1这种语法,面对检测刷新结果本身需要无限刷新的情况下,程序的流程很乱,而且结果好像有不正确的情况.搜到了selenium这个东东,经测试,代码非常清晰,封装成2个函数调用,而且效果也很好.具体代码:

python运行脚本的批处理bat文件


python脚本的运行可以直接双击py文件,但是窗口会一闪而过,如果用idel打开,又是2个窗口,一个源文件,一个shell,如果想在命令行看效果,可以写一个简单的批处理文件调用py脚本,具体如下:

8 Nov 2010

OpenGL函数二


opengl函数解释2 第一章使用颜色
l. l glshadeModel--选择平面明暗模式或光滑明暗模式
1. 2 glColor--设置当前颜色
1. 3 glColorPointer--定义颜色数组
1. 4 gllndex--设置当前颜色索引
1. 5 gllndexPointer--定义颜色索引数组
1. 6 glCOforTableEXT--为目标调色板纹理指定调色板的格式和大小
1. 7 glColorsubTableEXT--指定需要替代的目标纹理调色板的一部分
第二章 绘製几何图原及物体
2. l glVertex--指定顶点
2. 2 glVertexPointer--定义顶点数据数组
2. 3 glArrayElement--指定用来绘製顶点的数组元素
2. 4 glBegin, glEnd--限定一个或多个图原顶点的绘製
2. 5 glEdgeFlag, glEdgeFlagy--指定边界标记
2. 6 glPointsize--指定光栅化点的直径
2. 7 glLinewidth--指定光栅化直线的宽度
2. 8 glLinestipple--指定点划线
2. 9 glPolygonMode--选择多边形光栅化模式
2. 10 glFrontFace--定义正面多边形和反反面多边形
2. 11 glPolygonstipple--设置多边形点划图
2. 12 glDrawElements--从数组数据绘製图原
2. 13 glRect--绘製矩形
第三章 坐标转换
3. l glTranslate--用平移矩阵乘以当前矩阵
3. 2 glRotate--用旋转矩阵乘以当前矩阵
3. 3 glscale--用缩放矩阵乘以当前矩阵
3. 4 glViewport--设置机口
3. 5 glFrustum--用透视矩阵乘以当前矩阵
3. 6 glorthO--用正视矩阵乘以当前矩阵
3. 7 glClipPlane--指定切割几何物体的平面
第四章 堆栈操作
4. l glLoadMatrix--用任意矩阵替换当前矩阵
4. 2 glMultMatrix--用任意矩阵乘以当前矩阵
4. 3 glMatrixMode--指定哪一个矩阵是当前矩阵
4. 4 glPushMatrix, glPopMatrix--压人和弹出当前矩阵堆栈
4. 5 glPushAttrib, glPopAttrib--压人和弹出属性堆栈
4. 6 glPushClientAttrib, glPopClientAttrib--在客户属性堆栈中保存和恢复客户状态变量组
4. 7 glPushName, gPopName--压人和弹出名称堆栈
4. 8 gllnitNames--初始名称堆栈
4, 9 glLoadName--向名称堆栈中装载名称
第五章 显示列表
5. l glNewList, glEndList--创建或替换一个显示列表
5. 2 glCallLISt--执行一个显示列表
5. 3 glCallLISts--执行一列显示列表
5. 4 glGenLists--生成一组空的相邻的显示列表
5. 5 glDeleteLists--删除一组相邻的显示列表
5. 6 gllSLISt--检验显示列表的存在
第六章 使用光照和材质
6. l glNormal--设置当前的法向量
6. 2 glNormalPointer--定义法向量数组
6. 3 glLight--设置光源参数
6. 4 glLightModel--设置光照模型参数
6. 5 glMaterial--为光照模型指定材质参数
6. 6 glColorMateria--使材质颜色跟踪当前颜色
第七章 像素操作
7. l glRasterPos--为像素操作指定光栅位置
7. 2 glBitmap--绘製位图
7. 3 glReadPixels--从帧缓存中读取一块像素
7. 4 glDrawPixels--将一个像素块写人帧缓存
7. 5 glCopyPixels--在帧缓存中拷贝像素
7. 6 glCopyTexlmage1D--将像素从帧缓存拷贝到一维纹理图像中
7. 7 glCopyTexlmageZD--把像素从帧缓存拷贝到二维纹理图像中
7. 8 glCopyTexsublmagelD--从帧缓存中拷贝一维纹理图像的子图像
7. 9 glCopyTexsublmageZD--从帧缓存中拷贝二维纹理图像的子图像
7. 10 glPixelZoom--指定像素缩放因子
7. 11 glPixelstore--设置像素存储模式
7. 12 glPixelTransfer--设置像素传输模式
7. 13 glPixelMap--设置像素传输映射表
第八章 纹理映射
8. l glTexlmagelD--指定一维纹理图像
8. 2 glTexlmageZD--指定二维纹理映射
8. 3 glTexParameter--设置纹理参数
8. 4 glTexsublmage1D--指定已存在的一维纹理图像的一部分
8. 5 glTexsublmageZD--指定已存在的二维纹理图像的一部分
8. 6 glTexEnv--设置纹理环境参数
8. 7 glTexCoord--设置当前纹理坐标
8. 8 glTexGen--控制纹理坐标的生成
8. 9 glTexCoordPointer--定义纹理坐标数组
8. 10 glDeleteTextures--删除命名的纹理
第九章 特殊效果操作
9. l glBlendFunc--指定像素的数学算法
9. 2 glHint--指定由实现确定的控制行为
9. 3 glFOg--指定雾化参数
第十章 帧缓存操作
10. l glClear--将缓存清除为预先的设置值
10. 2 glClearAccum--设置累加缓存的清除值
10. 3 glClearColor--设置颜色缓存的清除值
10. 4 glClearDepth--设置深度缓存的清除值
10. 5 glClearlndex--设置颜色索引缓存的清除值
10. 6 glClearstencil--设置模板缓存的清除值
10. 7 glDrawBuffer--指定绘製的颜色缓存
10. 8 gllndexMask--控制颜色索引缓存中单个位的写操作
10. 9 glColorMask--激活或关闭帧缓存颜色分量的写操作
10. 10 glDepthMask--激活或关闭对深度缓存的写操作
10. 11 glstencilMask--控制模板平面中单个位的写操作
10. 12 glAlphaFunc-一指定alpha检验函数
10. 13 glstencilFunc--设置模板检验函数和参考值
10. 14 glstencilop--设置模板检验操作
10. 15 glDepthFunc--指定深度比较中使用的数值
10. 16 glDepthRange--指定从单位化的设备坐标到窗口坐标的z值映射
10. 17 glLOgiCOp--为颜色索引绘製指定逻辑像素操作
10. 18 glACCum--对累加缓存进行操作
第十一章 绘製曲线和曲面
11. l glEvalCoord--求取激活的一维和二维纹理图
11. 2 glMapl--定义一维求值器
11. 3 glMapZ--定义二维求值器
11. 4 glMapGrid--定义一维或二维网格
11. 5 glEvalMesh--计算一维或二维点网格或线网格
11. 6 glEvalPoint--生成并求取网格中的单个点
第十二章 查询函数
12. l glGet--返回所选择的参数值
12. 2 glGetClipPlane--返回指定的切平面係数
12. 3 glGetColorTableEXT--获得当前目标纹理调色板的颜色表数据
12. 4 glGetColorTableParameterfvEXT, glGetColorTableParameterlvEXT-从颜色表中获得调色板参数
12. 5 glGetError--返回错误信息
12. 6 glGetLight--返回光源参数值
12. 7 glGetMap--返回求值器参数
12. 8 glGetMaterial--返回材质参数
12. 9 glGetPixelMap--返回指定的像素映像
12. 10 glGetPointery--返回顶点数据数组地J
12. 11 glGetPolygonstipple--返回多边形点戈
12. 12 glGetstring--返回描述当前OpenGL
12. 13 glGetTexEnv--返回纹理环境参数
12. 14 glGetTexGen--返回纹理坐标生成参数
12. 15 glGetTexlmage--返回纹理图像
12. 16 glGetTexLevelParameter--返回指定细节水平的纹理参数值
12. 17 glGetTexParameter--返回纹理参数值
第二篇GLU库函数
第一章 绘製NURBS曲线和曲面
1. l gluNewNurbsRenderer--创建一个NURBS对像
1. 2 gluNurbsProperty--设置NURBS属性
1. 3 gluNurbsCallback--为NURBS对像定义回调函数
1. 4 gluBeginCurve, gluEndCurve--限定NURBS曲线的定义
1. 5 gluNurbsCurve--定义NURBS曲线的形状
1. 6 gluDeleteNurbsRenderer--删除NURBS对像
1. 7 gluBeglnsurface, gluEndsurface--限定NURBS曲面的定义
1. 8 ghiNurbssurface--定义NURBS曲面的形状
1. 9 gluBeginTrim, gluEndTrim--限定NURBS裁剪环的定义
1. 10 gluPwlCurve--描述分段线性NURBS裁剪曲线
1. ll gfuBeglnPolygon, gluEndPolygon--限定多边形的定义
1. 12 gluPickMatrix--定义拾取区域
第二章 绘製二次几何物体
2. l gluNewQuadric--创建一个二次对象
2. 2 gluQuadricDrawsope--指定二次对象的绘製方式
2. 3 gluQuadricNormals--指定二次对象使用的法向量类型
2. 4 gluQuadricorientation--指定二次对象的内侧面或外侧面方向
2. 5 gluCylinder--绘製圆柱体
2. 6 ghisphere--绘製球体
2. 7 glllDISk--绘製圆盘
2. 8 gluPartialDisk--绘製部分圆盘
2. 9 gliJDeleteQuadric--删除二次对象
2. 10 gluQuadricTexture--指定是否为二次对象使用纹理
2. 11 ghiQuadricCallback--为二次对象定义回调
第三章 网格化
3. l gluNewTess--创建一个网格化对象
3. 2 gluTessVertex--在多边形上指定顶点
3. 3 gluTessCallback--为网格化对象定义回调
3. 4 gluTessBeglnPolygon, ghiTessEndPolygon--限定多边形的描述
3. 5 gluTessBeglnContour, gluTessEndContour--限定多边形轮廓线的定义
3. 6 gluTessProperty--设置网格化对象的属性
3. 7 ghiNextContour--标记开始绘製另一个轮廓线
3. 8 gluTessNormal--为多边形指定法向量
3. 9 gluDeleteTess--删除网格化对象
第四章 坐标变换
4. l gluOorthoZD--定义二维正视投影矩阵
4. 2 gluPerspective--创建透视投影矩阵
4. 3 gltlLOOkAt--定义视景转换
4. 4 gluProject--将物体坐标映射为窗口坐标
4. 5 gluInProject--将窗口坐标映射力物体坐标
第五章 多重映射
5. l gfuBuildlDMipmaps--创建一维多重映射
5. 2 gluBuildZDMipmaps--创建H维多重映射
5. 3 gluSCalelmage--将图像缩放到任意尺寸
第六章 查询函数
6. l ghiErrorstring--从OpenGL或GLU错误代码中生成错误字符串
6. 2 gluGetNurbsProperty--获得NURBS属性
6. 3 ghiGetstring--获得描述GLU版本号或支持GLU扩展调用的字符串
6. 4 ghiGetTessProperty--获得网格化对象的属性
第三篇GLUT库函数
第一章 初始化和启动事件处理
1. l ghjtlnit--初始化GLUT库
1. 2 glutlnitwindowPosition--设置初始窗口位置
1. 3 glutlnitwindowsize--设置初始窗口大小
1. 4 glutlnitDisplayMode--设置初始显示模式
1. 5 glutMainLoop--进人GLUT事件处理循环
第二章 窗口管理
2. l glutCreatewindow--创建顶层窗口
2. 2 glutCreatesubwindow--创建子窗口
2. 3 ghitHidewindow--隐藏当前窗口的显示状态
2. 4 glutshowwindow--改变当前窗口的显示状态, 使其显示
2. 5 gfutsetwindowTitle--设置当前顶层窗口的窗口标题
2. 6 ghitsetlconTitle--设置当前顶层窗口的图标标题
2. 7 ghitPostRedisplay--标记当前窗口需要重新绘製
2. 8 glutswapBuffers--交换当前窗口的缓存
2. 9 glutFullscreen--关闭全屏显示
2. 10 glutPositionwindow--申请改变当前窗口的位置
2. ll gintReshapewindow--申请改变当前窗口的大小
2. 12 glutsetwindow--设置当前窗口
2. 13 ghitGetwindow--获得当前窗口的标识符
2. 14 glutPopwindow--改变当前窗口的位置, 使其前移
2. 15 ghitPtshwilldOO--改变当前窗口的位置, 使其后移
2. 16 glutDestroywindow--销毁指定的窗口
2. 17 glutlconifywindow--使当前窗口图标化显示
2. 18 glutsetCursor--设置当前窗口的鼠标形状
第三章 重迭层管理
3. l glutEstablishoverlay--创建当前窗口的重迭层
3. 2 glutUseLayer--改变当前窗口的使用层
3. 3 glutRemoveoverlay--删除当前窗口的重迭层
3. 4 glutPostoverlayRedisplay--标记当前窗口的重迭层需要重新绘製
3. 5 glutshowoverlay--显示当前窗口的重迭层
3. 6 glutHideoverlay--显示当前窗口的重迭层
第四章 菜单管理
4. l glutCreateMenu--创建一个新的弹出式菜单
4. 2 glutAddMenuEntry--在当前菜单的底部增加一个菜单条目
4. 3 glutAddsubMenu--在当前菜单的底部增加一个子菜单触发条目
4. 4 glutAttachMenu--把当前窗口的一个鼠标按键与当前菜单的标识符联繫起来
4. 5 glutGetMenu--获取当前菜单的标识符
4. 6 glutsetMenu--设置当前菜单
4. 7 glutDestroyMenu--删除指定的菜单
4. 8 glutChangeToMenuEntry--将指定的当前菜单中的菜单项更改为菜单条目
4. 9 glutChangeTosubMenu--将指定的当前菜单中的菜单项更改为子菜单触发条目
4. 10 glutRemoveMenultem--删除指定的菜单项
4. 11 glutDetachMenu--释放当前窗口的一个鼠标按键
第五章 注册国调函数
5. l glutDispfayFunc--注册当前窗口的显示回调函数
5. 2 glutReshapeFunc--注册当前窗口的形状变化回调函数
5. 3 glutMouseFunc--注册当前窗口的鼠标回调函数
5. 4 glutMotionFunc--设置移动回调函数
5. 5 glutldleFunc--设置全局的空閒回调函数
5. 6 glutVisibilityFunc--设置当前窗口的可视回调函数
5. 7 glutKeyboardFunc--注册当前窗口的键盘回调函数
5. 8 glutspecialFunc--设置当前窗口的特定键回调函数
5. 9 glutoverlayDisplayFunc--注册当前窗口的重迭层显示回调函数
5. 10 glutPassiveMotionFunc--设置当前窗口的被动移动回调函数
5. 11 glutEntryFunc--设置当前窗口的鼠标进出回调函数
5. 12 glutspaceballMotionFunc--设置当前窗口的空间球移动回调函数
5. 13 glutspaceballRotateFunc--设置当前窗口的空间球旋转回调函数
5. 14 glutspaceballButtonFunc--设置当前窗口的空间球按键回调函数
5. 15 glutButtonBoxFunc--设置当前窗口的拨号按键盒按键回调函数
5. 16 glutDialsFunc--设置当前窗口的拨号按键盒拨号回调函数
5. 17 glutTabletMotionFunc--设置图形板移动回调函数
5. 18 glutTabletButtonFunc--设置当前窗口的图形板按键回调函数
5. 19 glutMenustatusFunc--设置全局的菜单状态回调函数
5. 20 glutTimerFunc--注册按一定时间间隔触发的定时器回调函数
第六章 颜色素引映射表管理
6. l glutsetColor--设置当前窗口当前层一个颜色表单元的颜色
6. 2 glutGetColor--获得指定的索引颜色
6. 3 glutCopyColormap--将逻辑颜色表从指定的窗口拷贝到当前窗口
第七章 状态检索
7. l glutGet--检索指定的GLUT状态
7. 2 glutLayerGet--检索属于当前窗口重迭层的 GLU T状态
7. 3 glutDeviceGet--检索GLUT设备信息
7. 4 glutGetModifiers--返回修饰键在引起某些回调的事件发生时的状态
7. 5 glutExtensionsupported--判别当前OpenGL版本是否支持给定的OpenGL扩展
第八章 字体绘製
8. l glutBltmapCharcter--绘製一个位图字符
8. 2 glutBitmapwidth--返回一个位图字符的宽度
8. 3 glutstrokeCharcter--绘製一个笔划字符
8. 4 glutstrokewidth--返回一个笔划字体的宽度
第九章 几何图形绘製
9. 1 glutSolidsphere, glutwiresphere--绘製实心球体和线框球体
9. 2 glutsolidCube, glutwireCube--绘製实心立方体和线框立方体
9. 3 glutsolidCone, glutwireCone--绘製实心圆锥体和线框圆锥体
9. 4 glutsolidTorus, glutwireTorus--绘製实心圆环和线框圆环
9. 5 glutSolidDOdeCahedroll, glLltwiFeDOdechedfotl--绘製实心十二面体和线框十二面体
9. 6 glutSolidOctahedron, glutWireOctahedron--绘製买心八面体和线框八面体
9. 7 glutsolldTetrahedron, glutwireTetrahedron--绘製实心四面体和线框四面体
9. 8 glutSollelcosahedron, glutwirelcosahedron--绘製实心二十面体和线框二十面体
9. 9 glutsolidTeapot, glutwireTeapot--绘製实心茶壶和线框茶壶

OpenGL函数


OpenGL函数整理 一:GL库函数
使用颜色
glshadeModel--选择平面明暗模式或光滑明暗模式
glColor--设置当前颜色
glColorPointer--定义颜色数组
gllndex--设置当前颜色索引
gllndexPointer--定义颜色索引数组
glCOforTableEXT--为目标调色板纹理指定调色板的格式和大小
glColorsubTableEXT--指定需要替代的目标纹理调色板的一部分
绘制几何图原及物体
glVertex--指定顶点
glVertexPointer--定义顶点数据数组
glArrayElement--指定用来绘制顶点的数组元素
glBegin,glEnd--限定一个或多个图原顶点的绘制
glEdgeFlag,glEdgeFlagy--指定边界标记
glPointsize--指定光栅化点的直径
glLinewidth--指定光栅化直线的宽度
glLinestipple--指定点划线
glPolygonMode--选择多边形光栅化模式
glFrontFace--定义正面多边形和反反面多边形
glPolygonstipple--设置多边形点划图
glDrawElements--从数组数据绘制图原
glRect--绘制矩形
坐标转换
glTranslate--用平移矩阵乘以当前矩阵
glRotate--用旋转矩阵乘以当前矩阵
glscale--用缩放矩阵乘以当前矩阵
glViewport--设置机口
glFrustum--用透视矩阵乘以当前矩阵
glorthO--用正视矩阵乘以当前矩阵
glClipPlane--指定切割几何物体的平面
堆栈操作
glLoadMatrix--用任意矩阵替换当前矩阵
glMultMatrix--用任意矩阵乘以当前矩阵
glMatrixMode--指定哪一个矩阵是当前矩阵
glPushMatrix,glPopMatrix--压人和弹出当前矩阵堆栈
glPushAttrib,glPopAttrib--压人和弹出属性堆栈
glPushClientAttrib,glPopClientAttrib--在客户属性堆栈中保存和恢复客户状态变量组
glPushName,gPopName--压人和弹出名称堆栈
gllnitNames--初始名称堆栈
glLoadName--向名称堆栈中装载名称
显示列表
glNewList,glEndList--创建或替换一个显示列表
glCallLISt--执行一个显示列表
glCallLISts--执行一列显示列表
glGenLists--生成一组空的相邻的显示列表
glDeleteLists--删除一组相邻的显示列表
gllSLISt--检验显示列表的存在
使用光照和材质
glNormal--设置当前的法向量
glNormalPointer--定义法向量数组
glLight--设置光源参数
glLightModel--设置光照模型参数
glMaterial--为光照模型指定材质参数
glColorMateria--使材质颜色跟踪当前颜色
像素操作
glRasterPos--为像素操作指定光栅位置
glBitmap--绘制位图
glReadPixels--从帧缓存中读取一块像素
glDrawPixels--将一个像素块写人帧缓存
glCopyPixels--在帧缓存中拷贝像素
glCopyTexlmage1D--将像素从帧缓存拷贝到一维纹理图像中
glCopyTexlmageZD--把像素从帧缓存拷贝到二维纹理图像中
glCopyTexsublmagelD--从帧缓存中拷贝一维纹理图像的子图像
glCopyTexsublmageZD--从帧缓存中拷贝二维纹理图像的子图像
glPixelZoom--指定像素缩放因子
glPixelstore--设置像素存储模式
glPixelTransfer--设置像素传输模式
glPixelMap--设置像素传输映射表
纹理映射
glTexlmagelD--指定一维纹理图像
glTexlmageZD--指定二维纹理映射
glTexParameter--设置纹理参数
glTexsublmage1D--指定已存在的一维纹理图像的一部分
glTexsublmageZD--指定已存在的二维纹理图像的一部分
glTexEnv--设置纹理环境参数
glTexCoord--设置当前纹理坐标
glTexGen--控制纹理坐标的生成
glTexCoordPointer--定义纹理坐标数组
glDeleteTextures--删除命名的纹理
特殊效果操作
glBlendFunc--指定像素的数学算法
glHint--指定由实现确定的控制行为
glFOg--指定雾化参数
帧缓存操作
glClear--将缓存清除为预先的设置值
glClearAccum--设置累加缓存的清除值
glClearColor--设置颜色缓存的清除值
glClearDepth--设置深度缓存的清除值
glClearlndex--设置颜色索引缓存的清除值
glClearstencil--设置模板缓存的清除值
glDrawBuffer--指定绘制的颜色缓存
gllndexMask--控制颜色索引缓存中单个位的写操作
glColorMask--激活或关闭帧缓存颜色分量的写操作
glDepthMask--激活或关闭对深度缓存的写操作
glstencilMask--控制模板平面中单个位的写操作
glAlphaFunc-一指定alpha检验函数
glstencilFunc--设置模板检验函数和参考值
glstencilop--设置模板检验操作
glDepthFunc--指定深度比较中使用的数值
glDepthRange--指定从单位化的设备坐标到窗口坐标的z值映射
glLOgiCOp--为颜色索引绘制指定逻辑像素操作
glACCum--对累加缓存进行操作
绘制曲线和曲面
glEvalCoord--求取激活的一维和二维纹理图
glMapl--定义一维求值器
glMapZ--定义二维求值器
glMapGrid--定义一维或二维网格
glEvalMesh--计算一维或二维点网格或线网格
glEvalPoint--生成并求取网格中的单个点
查询函数
glGet--返回所选择的参数值
glGetClipPlane--返回指定的切平面系数
glGetColorTableEXT--获得当前目标纹理调色板的颜色表数据
glGetColorTableParameterfvEXT,glGetColorTableParameterlvEXT-从颜色表中获得调色板参数
glGetError--返回错误信息
glGetLight--返回光源参数值
glGetMap--返回求值器参数
glGetMaterial--返回材质参数
glGetPixelMap--返回指定的像素映像
glGetPointery--返回顶点数据数组地J
glGetPolygonstipple--返回多边形点戈
glGetstring--返回描述当前OpenGL
glGetTexEnv--返回纹理环境参数
glGetTexGen--返回纹理坐标生成参数
glGetTexlmage--返回纹理图像
glGetTexLevelParameter--返回指定细节水平的纹理参数值
glGetTexParameter--返回纹理参数值


二:GLU库函数
绘制NURBS曲线和曲面
gluNewNurbsRenderer--创建一个NURBS对像
gluNurbsProperty--设置NURBS属性
gluNurbsCallback--为NURBS对像定义回调函数
gluBeginCurve,gluEndCurve--限定NURBS曲线的定义
gluNurbsCurve--定义NURBS曲线的形状
gluDeleteNurbsRenderer--删除NURBS对像
gluBeglnsurface,gluEndsurface--限定NURBS曲面的定义
ghiNurbssurface--定义NURBS曲面的形状
gluBeginTrim,gluEndTrim--限定NURBS裁剪环的定义
gluPwlCurve--描述分段线性NURBS裁剪曲线
gfuBeglnPolygon, gluEndPolygon--限定多边形的定义
gluPickMatrix--定义拾取区域
绘制二次几何物体
gluNewQuadric--创建一个二次对象
gluQuadricDrawsope--指定二次对象的绘制方式
gluQuadricNormals--指定二次对象使用的法向量类型
gluQuadricorientation--指定二次对象的内侧面或外侧面方向
gluCylinder--绘制圆柱体
ghisphere--绘制球体
glllDISk--绘制圆盘
gluPartialDisk--绘制部分圆盘
gliJDeleteQuadric--删除二次对象
gluQuadricTexture--指定是否为二次对象使用纹理
ghiQuadricCallback--为二次对象定义回调
网格化
gluNewTess--创建一个网格化对象
gluTessVertex--在多边形上指定顶点
gluTessCallback--为网格化对象定义回调
gluTessBeglnPolygon,ghiTessEndPolygon--限定多边形的描述
gluTessBeglnContour,gluTessEndContour--限定多边形轮廓线的定义
gluTessProperty--设置网格化对象的属性
ghiNextContour--标记开始绘制另一个轮廓线
gluTessNormal--为多边形指定法向量
gluDeleteTess--删除网格化对象
坐标变换
gluOorthoZD--定义二维正视投影矩阵
gluPerspective--创建透视投影矩阵
gltlLOOkAt--定义视景转换
gluProject--将物体坐标映射为窗口坐标
gluInProject--将窗口坐标映射力物体坐标
多重映射
gfuBuildlDMipmaps--创建一维多重映射
gluBuildZDMipmaps--创建H维多重映射
gluSCalelmage--将图像缩放到任意尺寸
查询函数
ghiErrorstring--从OpenGL或GLU错误代码中生成错误字符串
gluGetNurbsProperty--获得NURBS属性
ghiGetstring--获得描述GLU版本号或支持GLU扩展调用的字符串
ghiGetTessProperty--获得网格化对象的属性


三:GLUT库函数

初始化和启动事件处理
ghjtlnit--初始化GLUT库
glutlnitwindowPosition--设置初始窗口位置
glutlnitwindowsize--设置初始窗口大小
glutlnitDisplayMode--设置初始显示模式
glutMainLoop--进人GLUT事件处理循环
窗口管理
glutCreatewindow--创建顶层窗口
glutCreatesubwindow--创建子窗口
ghitHidewindow--隐藏当前窗口的显示状态
glutshowwindow--改变当前窗口的显示状态,使其显示
gfutsetwindowTitle--设置当前顶层窗口的窗口标题
ghitsetlconTitle--设置当前顶层窗口的图标标题
ghitPostRedisplay--标记当前窗口需要重新绘制
glutswapBuffers--交换当前窗口的缓存
glutFullscreen--关闭全屏显示
glutPositionwindow--申请改变当前窗口的位置
gintReshapewindow--申请改变当前窗口的大小
glutsetwindow--设置当前窗口
ghitGetwindow--获得当前窗口的标识符
glutPopwindow--改变当前窗口的位置,使其前移
ghitPtshwilldOO--改变当前窗口的位置,使其后移
glutDestroywindow--销毁指定的窗口
glutlconifywindow--使当前窗口图标化显示
glutsetCursor--设置当前窗口的鼠标形状
重叠层管理
glutEstablishoverlay--创建当前窗口的重叠层
glutUseLayer--改变当前窗口的使用层
glutRemoveoverlay--删除当前窗口的重叠层
glutPostoverlayRedisplay--标记当前窗口的重叠层
需要重新绘制
glutshowoverlay--显示当前窗口的重叠层
glutHideoverlay--显示当前窗口的重叠层
菜单管理
glutCreateMenu--创建一个新的弹出式菜单
glutAddMenuEntry--在当前菜单的底部增加一个菜单条目
glutAddsubMenu--在当前菜单的底部增加一个子菜单触发条目
glutAttachMenu--把当前窗口的一个鼠标按键与当前菜单的标识符联系起来
glutGetMenu--获取当前菜单的标识符
glutsetMenu--设置当前菜单
glutDestroyMenu--删除指定的菜单
glutChangeToMenuEntry--将指定的当前菜单中的菜单项更改为菜单条目
glutChangeTosubMenu--将指定的当前菜单中的菜单项更改为子菜单触发条目
glutRemoveMenultem--删除指定的菜单项
glutDetachMenu--释放当前窗口的一个鼠标按键
注册国调函数
glutDispfayFunc--注册当前窗口的显示回调函数
glutReshapeFunc--注册当前窗口的形状变化回调函数
glutMouseFunc--注册当前窗口的鼠标回调函数
glutMotionFunc--设置移动回调函数
glutldleFunc--设置全局的空闲回调函数
glutVisibilityFunc--设置当前窗口的可视回调函数
glutKeyboardFunc--注册当前窗口的键盘回调函数
glutspecialFunc--设置当前窗口的特定键回调函数
glutoverlayDisplayFunc--注册当前窗口的重叠层显示回调函数
glutPassiveMotionFunc--设置当前窗口的被动移动回调函数
glutEntryFunc--设置当前窗口的鼠标进出回调函数
glutspaceballMotionFunc--设置当前窗口的空间球移动回调函数
glutspaceballRotateFunc--设置当前窗口的空间球旋转回调函数
glutspaceballButtonFunc--设置当前窗口的空间球按键回调函数
glutButtonBoxFunc--设置当前窗口的拨号按键盒按键回调函数
glutDialsFunc--设置当前窗口的拨号按键盒拨号回调函数
glutTabletMotionFunc--设置图形板移动回调函数
glutTabletButtonFunc--设置当前窗口的图形板按键回调函数
glutMenustatusFunc--设置全局的菜单状态回调函数
glutTimerFunc--注册按一定时间间隔触发的定时器回调函数
颜色素引映射表管理
glutsetColor--设置当前窗口当前层一个颜色表单元的颜色
glutGetColor--获得指定的索引颜色
glutCopyColormap--将逻辑颜色表从指定的窗口拷贝到当前窗口
状态检索
glutGet--检索指定的GLUT状态
glutLayerGet--检索属于当前窗口重叠层的 GLU T状态
glutDeviceGet--检索GLUT设备信息
glutGetModifiers--返回修饰键在引起某些回调的事件发生时的状态
glutExtensionsupported--判别当前OpenGL版本是否支持给定的OpenGL扩展
字体绘制
glutBltmapCharcter--绘制一个位图字符
glutBitmapwidth--返回一个位图字符的宽度
glutstrokeCharcter--绘制一个笔画字符
glutstrokewidth--返回一个笔画字体的宽度
几何图形绘制
glutSolidsphere,glutwiresphere--绘制实心球体和线框球体
glutsolidCube,glutwireCube--绘制实心立方体和线框立方体
glutsolidCone,glutwireCone--绘制实心圆锥体和线框圆锥体
glutsolidTorus,glutwireTorus--绘制实心圆环和线框圆环
glutSolidDOdeCahedroll,glLltwiFeDOdechedfotl--绘制实心
十二面体和线框十二面体
glutSolidOctahedron,glutWireOctahedron--绘制买心八面体和线框八面体
glutsolldTetrahedron,glutwireTetrahedron--绘制实心四面体和线框四面体
glutSollelcosahedron,glutwirelcosahedron--绘制实心二十面体和线框二十面体
glutsolidTeapot,glutwireTeapot--绘制实心茶壶和线框茶壶

7 Nov 2010

python发送邮件


Update:可以使用下面的函数来发信

def SendEmail(fromEmail, password, toEmailList, subjectStr, contentStr):
    import smtplib
    import email.utils
    from email.mime.text import MIMEText

    # Create the message
    msg = MIMEText(contentStr)
    msg['To'] = email.utils.formataddr(('Recipient', ','.join(toEmailList)))
    msg['From'] = email.utils.formataddr(('Author', fromEmail))
    msg['Subject'] = subjectStr

    # Create the connection
    server = smtplib.SMTP('smtp.gmail.com:587')
    server.set_debuglevel(True)  # show communication with the server
    try:
        # identify ourselves, prompting server for supported features
        server.ehlo()

        # If we can encrypt this session, do it
        if server.has_extn('STARTTLS'):
            server.starttls()
            server.ehlo()  # re-identify ourselves over TLS connection

        server.login(fromEmail, password)
        server.sendmail(fromEmail, toEmailList, msg.as_string())
    finally:
        server.quit()

为了刷签证结果,我每天刷十几次,于是写了脚本来模拟浏览器访问网站得到处理结果,具体见:python模拟网页填表.但是还是害怕漏掉,firefox有webmail notifier插件,于是想完善上个脚本,如果处理结果不是"正在处理当中",就给我邮箱发一封信,这样用死循环,每5分钟刷新一次,直到出结果邮件发送成功再break.网上一搜,发邮件的代码大把,无奈都是08年居多,竟然都不能成功,大多死在sendmail步骤,貌似是socket超时了.底层不懂啊,继续google,找到了如下代码,经测试好用.贴出来,记录之.

2 Nov 2010

灰度变换

首先提取一幅图像的一个象素,在BMP格式中一个象素由8位红色亮度值,8位绿色亮度值和8位蓝色亮度值组成,只要按一定的变换函数去变换

这种3种颜色的亮度值就可以起到灰度变换的目的。 变换原理是这样的:

比如线性变换
可以用一个线性函数
f(x,y)=a'+(b'-a')/(b-a)×(f(x,y)-a)
f(x,y)代表一个象素
[a,b]是原始图像的灰度范围,[a',b']是变换后新图像的灰度范围
用这个线性函数分别对R,G,B分量进行变换可以起到单色增强的目的,然后再混合输出。
如果b'-a' > b-a ,则使得图像灰度范围增大,即对比度增大,图像会变得清晰
如果b'-a' < b-a ,则使得图像灰度范围缩小,即对比度减小。 分段线性变换 和线性变换差不多 不过对于单一一个R或G或B分量采用分段函数进行变换。 如 f(x,y)=a'+(b'-a')/(b-a)×(f(x,y)-a) 当f(x,y)在[a,b]范围内 f(x,y)=0 当f(x,y)n
这样就指定了一个变换段 a,b,只有灰度在a,b段内的点才会增强,灰度b的变成白色。

非线性变换
可以根据需要制定非线性函数对灰度进行变换,典型的有
对数变换
f(x,y)=a+ ln[f(x,y)+1]/(b×lnc) 这里a,b,c是参数而不是灰度范围了,对数变换用于扩展低灰度区
指数变换
f(x,y)=b^(c*[f(x,y)]-a]) ,a,b,c同样是参数,指数变换用来压缩低灰度区

OpenCV 简明介绍 - ZT


这里简单的记录一些 OpenCV 这个库的使用。这是用 C/C++ 写的一个和 computer vision 相关的库,一共含有 5 个组件:

* CXCORE 是 OpenCV 里面使用的常用数据结构,以及处理这些数据结构的函数。
* CV 是常用的 computer vision 相关的函数,比如计算 histogram、目标检测、跟踪的程序。
* ML 是常用的 machine learning 相关的函数,如做分类的 naive Bayes、SVM 等等。
* highgui 是一些比较高层函数,主要是做用户界面。
* 另外还有一个从摄像头获取数据的 CVCAM 库,但是 1.1 里面似乎并进 highgui 了。
注:可能作者写文章时候比较早,目前opencv已经2.1版本了.

最新的是 1.1pre1,但是 debian 里面还是两年前的 1.0 版本的,这就需要自己编译一个了,后面有空学着 debian 的方式做个 deb 包好了。

OpenCV 的文档也算是还不错的了,除了函数的解释,部分功能还有例程、例子可以参考,这对对函数功能不是很清楚的人是非常有用的,比如我 :-D 这里不打算详细的记录 OpenCV 的每个功能,感兴趣的看文档吧。



先从 CXCORE 的基本结构讲起,OpenCV 里面提供了:

点 CvPoint(分 int 和 float 类型的,一般 int 的都没有后缀,float 会写 32f,double 是 64f;有 2D 和 3D 的版本),

大小 CvSize、

矩形 CvRect(用左下角的顶点坐标和宽、高表示)、

向量 CvScalar(4 个 double 那么大)。

更重要的就是存储矩阵用的 CvMat、CvMatND(多维矩阵,一般图片就是几个 channel,每个 channel 是一个 CvMat),稀疏矩阵 CvSparseMat。注意这里面有一个比较重要的成员,就是 int* refcount,这是允许多个“矩阵”(其实是 CvMatHeader 或者 CvMatNDHeader)对同一个矩阵进行引用,这时释放的时候涉及到矩阵元素的属主(ownership),只有当 refcount 为 0 的时候,释放的时候才会释放这些元素。数据的入口都是匿名 union,data 可以当作指针用。

图片一般存放在一个 IplImage 结构里面,这个结构里面有很多参数决定图片数据的类型,比如是 UINT8 还是 float 等。创建这些数据最基本的函数就是 cvCreate*,这是产生一个完整的结构,并且分配数据的内存,另有一种是仅仅分配一个 header,函数就是 cvCreate*Header,之后可以用 cvSet*Data 指定数据,释放这些结构使用 cvRelease* 和 cvRelease*Header。另外可以通过 cvInit* 和 cvInit*Header 初始化这些数据结构。我们发现 OpenCV 的函数都是以 cv 开头,而结构都是 Cv 开头。另外,进行深层 copy 使用 cvClone* 函数。如果需要手工增加/减少对数据的 refcount,可以使用 cvIncRefData、cvDecRefData。OpenCV 里面的数据用 CvArr,这是一个 void 类型,因此可以自由转换成为别的类型,如果需要访问 CvArr 类型的数据,可以用 cvGetRawData,下面是一个例子:

cvGetRawData( array, (uchar**)&data, &step, &size );

step /= sizeof(data[0]);

for( y = 0; y < size.height; y++, data += step )

for( x = 0; x < size.width; x++ )

data[x] = (float)fabs(data[x]);
这里的 data 是个 float*,因此每次递增量是 cvGetRawData 返回的 step 除以 sizeof(float)。类似的,cvGet* 命令将会返回对应的 header,如 cvGetMat、cvGetImage 等。 对于一个 CvMat,可以用 cvGetSubMat、cvGetRow(s),cvGetCol(s)、cvGetDiag 获得矩阵的部分,cvGetSize 获得矩阵的大小。遍历稀疏矩阵一般用 cvInitSparseMatIterator、cvGetNextSparseNode。另外可以用 cvGetElemType 获得元素种类,cvGetDim(s) 获得多维矩阵的大小。如果需要访问某些元素,可以用 cvPtr?D 获得指针,cvGet?D 获得元素值,另外有快速版本 cvmGet(对 2D 的矩阵)。对应有 Set 版本,用于赋值,特别的有 cvSetZero 和 cvSetIdentity 用于产生 0 矩阵和单位矩阵。另外和 matlab 类似有个 cvRange,cvReshape 改变矩阵大小,cvRepeat 和 repmat 类似,cvFlip 和 flip* 类似,cvSplit 切分矩阵,cvMerge 是逆操作。针对图片提供有 cvMixChannels。和 randperm 类似有一个 cvRandShuffle。 cvLUT 进行查表(某些图片是 indexed color),cvConvertScale 可以将不同的类型的数据(尤其是图片,有的用 float 的 0-1 表示,有的用 UINT8 表示)互相转化,它的一个特殊情况就是 cvConvertScaleAbs,cvAdd 将两个 CvArr 相加,cvAddS 加的是 scalar,cvAddWeighted 是加权和,cvSub 是相减,cvSubS 减标量,cvSubRS 是用标量减 CvArr,cvMul 是相乘,,cvDiv 是除,另外有 cvAnd(S)、cvOr(S)、cvXor(S)、cvNot、cvCmp(S);cvInRange(S) 可以检查元素是不是位于上下界中,cvMax(S)、cvMin(S) 求最大最小,cvAbsDiff(S) 求差的绝对值,cvCountNonZero 数非零元素个数,cvSum 求和,cvAvg 求平均,cvAvgSdv 计算均值和标准差,cvMinMaxLoc 返回最小最大的位置,cvNorm 计算范数(包括 L_1、L_2 和 L_\infty)。cvReduce 将矩阵变成向量。 OpenCV 也实现了一些代数运算,比如 cvDotProduct 计算内积,cvNormalize 将向量依照某种范数归一化,cvCrossProduct 计算叉积,cvScaleAdd 将标量相加,cvGEMM 是一个广义的矩阵乘积,包括每个矩阵是不是转置,然后相乘相加(用它定义了 cvMatMulAdd 和 cvMatMul),矩阵产生的变换 cvTransform、cvPerspectiveTransform,转置相乘 cvMulTransposed,迹 cvTrace,转置 cvTranspose、行列式 cvDet,cvInvert 求逆,cvSolve 求解线性方程组,cvSVD 计算奇异值分解,cvSVBkSb 用奇异值产生原来的矩阵,求对称矩阵的特征值 cvEigenVV,cvCovarMat 计算协方差矩阵,cvMahanobis 计算马氏距离,cvCalcPCA 计算主成分分解,cvProjectPCA 进行投影,cvBackProjectPCA 重构,。 下面是 OpenCV 里面常用的数学函数,如舍入的 cvRound、cvFloor 和 cvCeil,开方系列 cvSqrt、cvInvSqrt、cvCbrt,反正切 cvFastArctan、判断 cvIsNaN、cvIsInf,坐标转换 cvCartToPolar 和 cvPolarToCart,幂函数 cvPow,指数 cvExp,对数 cvLog,求解三次方程 cvSolveCubic,一般多项式 cvSolvePoly。 另外有一些随机数相关的函数,比如 cvRNG 产生一个 random number generator,cvRandArr 产生一个随机 CvArr,cvRandInt 返回一个随机整数,cvRandReal 产生 0-1 之间的随机实数。 另外有一些和 discrete Fourier transform 相关的东西,比如 cvDFT,cvDCT 等。 OpenCV 提供了一些动态存储的数据结构,这在很多操作中非常重要,比如需要进行检测某些特征点,那么用户并不知道将会发现多少个,所以最好的方法是使用 OpenCV 的动态数据结构,不过很遗憾的是,似乎这些结构不仅不能和 STL 的容器互相转换,接口也并不统一。 比较重要的类结构是 CvMemStorage,一般说来我们使用 cvCreateMemStorage 创建一个,并最后用 cvReleaseMemStorage 释放,OpenCV 里面很多函数需要 workspace 往往就是一个 CvMemStorage,如果需要自己进行更细致的操作,就需要了解一些比较基本的知识,比如它的结构是一个一个的 block 用双向链表链接(CvMemBlock 结构)而成,通过 CvMemStoragePos 记录位置,通过 cvCreateChildMemStorage 可以创建一个和 parent 相对独立的存储空间,临时存放数据非常方便。通过 cvClearMemStorage 将该结构管理的内存减到最少。CvMemStorage 提供了一个较大尺度的内存管理机制,而 CvSeq 就成为了一个容器,这个容器是一个双向链表(另有 CvSeqBlock 是个循环链表)。这个容器可以用 cvCreateSeq 创建(有一些内部支持的类型),cvSeqPush/cvSeqPop 是当作一个 stack 来进行入栈操作,类似的操作是 cvSeqPush/PopFront(队列常用操作),还可以一次插入多个 cvPush/PopMulti,插入 cvSeqInsert、删除 cvSeqRemove、删除所有元素 cvClearSeq、获得其中一个元素 cvGetSeqElem、获得一个元素的指标 cvGetElemIdx、转换成 array cvCvtSeqToArray、为 array 创建 Seq 的 header cvMakeSeqHeaderForArray,创建一个 CvSeq 的子序列 cvSlice、复制 cvCloneSeq、子序列的删除插入 cvRemove/InsertSlice、反转 cvSeqInvert、排序 cvSeqSort、搜索 cvSeqSearch。和 CvSeq 的输入输出相关的就是 CvSeqWriter 和 CvSeqReader 了,分别调用 cvStart/EndWriter/Reader 即可。 另外一个有用的数据结构是 CvSet,它是 CvGraph、SvSparseMat 和 CvSubdiv2D 的父类,其实现依赖于 CvSeq,创建一个 CvSet 和 CvSeq 类似为 cvCreateSet,添加、删除元素使用 cvSetAdd(cvSetNew 是一个 inline 版本)和 cvSetRemove(cvSetRemoveByPtr 使用指针删除),cvGetSetElem 通过一个索引获得元素,cvClearSet 清除里面的元素。 CvGraph 是用来表示一个带权有向或者无向图的数据结构,用 cvCreateGraph 创建,cvGraphAdd/RemoveVxt 添加顶点(另有一个ByPtr 版本),可以用 cvGetGraphVxt 获得顶点内容,cvGraphVxtIdx 获得元素的索引,cvGraphAdd/RemoveEdge 添加/删除边(也有 ByPtr 版本),另外有搜索边的 cvFindGraphEdge 以及 ByPtr 版本。通过 cvGraphVxtDegree 获得顶点的 degree,清除一个 graph 可以用 cvClearGraph,复制用 cvCloneGraph。遍历一个 graph 可以用 CvGraphScanner 这个数据结构,使用 cvCreateGraphScanner 创建深度优先便利的 scanner(用 Release 释放),这个 scanner 可以用一个 mask 来决定哪些地方是值得停下来供程序员处理的,有了这个 scanner 后用 cvGraphNextItem 就可以迭代了。 OpenCV 里面还有不少作图函数,就是在图片上画一些简单的几何形状,比如 Line、Rectangle、Circle、Ellipse、EllipseBox、FillPoly、FillConvexPoly、 PolyLine。另外为了渲染字体,有 cvInitFont,cvPutText、cvGetTextSize 供使用。另外提供了 cv 里面 contour 的绘制函数(一般使用 cvFindContours 获得等高线,然后)cvDrawContours。通过 cvInitLineIterator 可以获得一条直线(指定起点和终点)上面的那些 pixel。cvClipLine 是将一条直线用一个矩形 clip。cvEllipse2Poly 将椭圆转换成为 polyline。 另外 cxcore 里面还提供了一个一致的存储数据的方式,这是通过 XML(或者 YAML)和 CvFileStorage 结构实现的,XML 本身是一个 tree 结构的东西,每个节点用 CvFileNode 表示其类型,用 CvAttrList 表示一个对象含有的属性列表。创建/释放一个 CvFileStorage 对象用 cvOpen/ReleaseFileStorage 函数。前者创建的 CvFileStorage 可用 cvStart/EndWriteStruct 或者 cvWriteInt/String/Real/Comment/RawData 进行写入,另外有 cvWrite 适合写入 CvSeq 等对象。读取使用比较笨的就是直接 cvRead*ByName,或者 cvGetFileNodeByName,比较快的是创建 CvStringHashNode,使用它查询 cvGetFileNode,然后从 CvFileNode 里面获得数据。另外,也有类似的 cvReadInt/Real/等等,以及 cvRead。 OpenCV 提供了一个基本的 RTTI 实现,这是利用 CvTypeInfo 实现的,利用 cvTypeOf 可以获得对应的类型,如果不确定有没有某个类型,可以用 cvFindType 搜索,通过 cvRegisterType 和 cvUnregisterType 注册、注销新类型。这样我们可以直接用 cvRelease 释放某个已知类型的对象、cvClone 复制一个,cvSave 和 cvLoad 实现该对象的存储。 cxcore 里面还有一些非常有用的功能,比如 cvCheckArr 检查有没有越界或者 NaN 类型。cvKMeans2 可以进行 kmeans 聚类,cvSeqPartition 用于将序列通过一个等价函数分成等价类。另外有一些用于出错处理的函数,比如每个 OpenCV 的函数源代码里面写的 CV_FUNCNAME( Name ) 就是用于报告出错函数的宏,等价于声明了一个静态的字符串,常用 CV_ERROR 报错,另有 CV_CHECK 检查出错代码,CV_CALL 提供统一的调用 cxcore 函数方法(自动 CV_CHECK),CV_ASSERT 判断条件(和 assert 类似)。另外有 cvGetErrStatus、cvSetErrStatus,设置出错模式 cvGet/SetErrMode(分 leaf 出错就退出,parent 调用 handler 后向上 unwind,silent 不调用 handler 直接向上 unwind),产生错误 cvError,可以用 cvErrorStr 获得解释。 和 OS 相关的函数,如 cvAlloc、cvFree,计算用时的 cvGetTickCount 和 cvgetTickFrequency,编写模块用的 cvRegisterModule、cvGetModuleInfo,另外还有获得线程、以及并行运算信息的函数,这里不加叙述了。 ml 这个库的结构相对简单,实现的 ML 的算法也仅仅那么几个最经典的,并不具有很好的扩展性。几乎所有的 ml 的模型都是继承 CvStatModel 这个类(其实是一个接口),主要有 clear() 清除模型,train() 训练,predict() 预测,以及 IO 相关的 save/load() 或者 read/write()。实现的算法有朴素贝叶斯分类器 CvNormalBayesClassifier,k-近邻 CvKNearest(不知道用了 kdtree 这些结构没),支持向量机 CvSVM(不支持用户自定义的核函数似乎,可以用 k-fold 交叉验证选择参数),决策树 CART CvDTree,集成算法 AdaBoost CvBoost 以及 boosted tree CvBoostTree、随机树 CvRTree、EM 算法 CvEM(仅仅对某些特定模型可以用),神经网络(两层前馈神经网络)CvANN,感觉就是可以用来做些简单的问题,但是不要指望能用到最新的一些模型。 原文链接:点击这里

1 Nov 2010

opencv轮廓检测函数

收藏到CSDN网摘



matlab用久了,人会变懒惰.一直没有读opencv的代码,苦苦寻找bwlabel和bwareaopen的类似函数而不得,肤色检测结果却必须经过去噪这一关,没辙,自己写吧.google到一篇博文,博主很牛,分析了matlab的bwlabe代码,参考博主的分析,我实现了我的bwareaopen第一版.

31 Oct 2010

python模拟网页填表



更新:加入有结果发邮件函数,具体见:python发送邮件.
在等签证结果,很着急.我每天都要刷个无数遍,那个网页想自动化实现,需要填4组数据.
用python做自动化正合适.一般网页用httpFox看到post数据,然后伪装浏览器,
做header和data这2个字典就行,注意data要用urllib.urlencode()编码.
但是这个网页要求SSL链接,如何做安全SSL我还不会.只好搜索,找到了Selenium,
这个东西真的很强大,有点儿类似按键精灵之类,可以录制所有浏览器操作
包括填表数据,然后自动化生成java,c#,python,php...很多语言的原生代码
也有很多人推荐cPAMIE来模拟ie访问数据.
最后找到的解决办法是用win32com来模拟ie,可以分析documents的元素来模拟ie,
这个办法的好处是比较直观,容易理解,mark一下.
import win32com
import time
refnum = "签证reference号码"
strdate = "日期"
strmon = "月份"
stryear = "年份"
url = "https://www.vfs.org.in/UKG-PassportTracking-PPT/ApplicantTrackStatus.aspx?Data=eQhlWV1635htWhLZVVgaKw==〈=XlDVhFJC4oE="

ie = win32com.client.Dispatch("InternetExplorer.Application")
ie.Visible = 0
ie.Navigate(url)
state = ie.ReadyState
print "正在查询..."
while 1:
    state = ie.ReadyState
    if state==4:
        break
time.sleep(1)
print "查询成功!"
state = None
ie.Document.getElementByID("txtRefNO").value = refnum
ie.Document.getElementByID("txtDat").value = strdate
ie.Document.getElementByID("txtMont").value = strmon
ie.Document.getElementByID("txtYea").value = stryear
ie.Document.getElementByID("cmdSubmit").click()
while 1:
    state = ie.ReadyState
##    print state,
    if state==4 and str(ie.LocationURL)=="https://www.vfs.org.in/UKG-PassportTracking-PPT/ApplicantTrackStatus.aspx?Data=eQhlWV1635htWhLZVVgaKw%3d%3d〈=XlDVhFJC4oE%3d":
## 注释掉的这句可以显示整个网页的代码
##        print ie.Document.body.innerHTML 
        print ie.Document.getElementByID("lblScanStatus").innerHTML
        break
time.sleep(1)
另,如果你用pythonwin运行,可能会出现乱码,这时pythonwin的环境造成
需要的地方这样即可
u = u"你好"
print u.encode("utf8")

3 Oct 2010

OpenCV图像、矩阵、数组


OpenCV图像、矩阵、数组

一、结构
IplImage
  |-- int  nChannels;     // Number of color channels (1,2,3,4)
  |-- int  depth;         // Pixel depth in bits:
  |                       //   IPL_DEPTH_8U, IPL_DEPTH_8S,
  |                       //   IPL_DEPTH_16U,IPL_DEPTH_16S,
  |                       //   IPL_DEPTH_32S,IPL_DEPTH_32F,
  |                       //   IPL_DEPTH_64F
  |-- int  width;         // image width in pixels
  |-- int  height;        // image height in pixels
  |-- char* imageData;    // pointer to aligned image data
  |                       // Note that color images are stored in BGR order 这就是传说中的数据矩阵
  |-- int  dataOrder;     // 0 - interleaved color channels,
  |                       // 1 - separate color channels
  |                       // cvCreateImage can only create interleaved images
  |-- int  origin;        // 0 - top-left origin,
  |                       // 1 - bottom-left origin (Windows bitmaps style)
  |-- int  widthStep;     // size of aligned image row in bytes
  |-- int  imageSize;     // image data size in bytes = height*widthStep
  |-- struct _IplROI *roi;// image ROI. when not NULL specifies image
  |                       // region  to be processed.
  |-- char *imageDataOrigin; // pointer to the unaligned origin of image data
  |                          // (needed for correct image deallocation)
  |
  |-- int  align;         // Alignment of image rows: 4 or 8 byte alignment
  |                       // OpenCV ignores this and uses widthStep instead
  |-- char colorModel[4]; // Color model - ignored by OpenCV


矩阵:
CvMat                      // 2维矩阵
  |-- int   type;          // 元素类型(uchar,short,int,float,double)
  |-- int   step;          // 一行所占字节长度
  |-- int   rows, cols;    // 尺寸大小
  |-- int   height, width; // 备用尺寸参照
  |-- union data;
     |-- uchar*  ptr;     // 针对unsigned char矩阵的数据指针
      |-- short*  s;       // 针对short矩阵的数据指针
      |-- int*    i;       // 针对integer矩阵的数据指针
      |-- float*  fl;      // 针对float矩阵的数据指针
      |-- double* db;      // 针对double矩阵的数据指针


CvMatND                    // N-维矩阵
  |-- int   type;          // 元素类型(uchar,short,int,float,double)
  |-- int   dims;          // 数组维数
  |-- union data;
  |   |-- uchar*  ptr;     // 针对unsigned char矩阵的数据指针
  |   |-- short*  s;       // 针对short矩阵的数据指针
  |   |-- int*    i;       // 针对integer矩阵的数据指针
  |   |-- float*  fl;      // 针对float矩阵的数据指针
  |   |-- double* db;      // 针对double矩阵的数据指针
  |
  |-- struct dim[];        // 每个维的信息
      |-- size;            // 该维内元素个数
      |-- step;            // 该维内元素之间偏移量


通用数组:
CvArr*     // 仅作为函数参数,说明函数接受多种类型的数组,例如:
           //    IplImage*, CvMat* 或者 CvSeq*. 
           // 只需通过分析数组头部的前4字节便可确定数组类型
二、修改单个像素:

1.3通道时:
CV_IMAGE_ELEM(image, unsigned char, i, j*3+k) = gray_val;            //0<=k<3
2.单通道时:
CV_IMAGE_ELEM(image, unsigned char, i, j) = gray_val;
3.通用方法:
CvScalar s;
                 s=cvGet2D(img,i,j); // get the (i,j) pixel value

                 s.val[0]=111;         //单通道就只有这个有效
                 s.val[1]=111;
                 s.val[2]=111;
                 cvSet2D(img,i,j,s);//set the (i,j) pixel value
三、图像到矩阵 方式一、cvGetMat方式:
CvMat mathdr, *mat = cvGetMat( img, &mathdr );
mathdr只是根据img生成一个矩阵头,而其数据指向img的数据。 但只是把原来图像img头变成了CvMat头,数据体部分并没有复制,所以如果此时Release了img,则再访问mat就会出现错误。 方式二、cvConvert方式:
CvMat *mat = cvCreateMat( img->height, img->width, CV_64FC3 );
cvConvert( img, mat );
// #define cvConvert( src, dst )  cvConvertScale( (src), (dst), 1, 0 )
四、从一幅图像中截出一小块,把它转成一维向量
cvSetImageROI(srcImg,blockRect);//blockRect为CvRect类型
 cvCopy(srcImg,block);//srcImg为IplImage类型,block为CvMat类型
 cvResetImageROI(srcImg);
 CvMat vecHead,*vec;
 vec=cvReshape( block, &vecHead, 0, 1 );//vec是得到的一维向量
说明: 1 同样大小的IplImage和CvMat,IplImage->widthStep不等于CvMat->step; 2 cvGetMat和cvReshape都只生成一个新的矩阵头,而数据都指向原来的地址,所以是两个矩阵共有一组数据,这一点在使用中要注意,原来的数据撤消是否会影响后生成的矩阵的使用。 3 cvGetMat得到的矩阵的step,等于原来IplImage的widthStep,再调用cvReshape时会出错。 4 cvReshape是按行形成向量,如果想按列形成向量,就先调用cvTranspose对矩阵进行转置,再调用cvReshape. 5 用cvCopy可以在IplImage和CvMat之间转换,比cvGetMat好,但其数据必须是同样的type和size. 6 如果是不同的type之间转换,可以用cvScale. 五、矩阵元素操作 一般的,对于1通道的数组:
CvMat* M = cvCreateMat( 4, 4, CV_64FC1 );
CV_MAT_ELEM( *M, double, row, col ) = 3.0;
注意double要根据数组的数据类型来传入。 对于两通道和四通道而言:
CvMat* vector = cvCreateMat( 1, 3, CV_32SC2 );
CV_MAT_ELEM( *vector, CvPoint, 0, 0 ) = cvPoint(100,100);

CvMat* vector = cvCreateMat( 1, 3, CV_64FC4 );
CV_MAT_ELEM( *vector, CvScalar, 0, 0 ) = cvScalar(0,0,0,0);

 
六、数组到矩阵
// 3 channels
CvMat mathdr, *mat;
double data[] = { 111, 112, 113, 121, 122, 123,
211, 212, 213, 221, 222, 223 };
CvMat* orig = &cvMat( 2, 2, CV_64FC3, data );
//(111,112,113) (121,122,123)
//(211,212,213) (221,222,223)

2 Aug 2010

Matlab随机数生成函数



betarnd 贝塔分布的随机数生成器
binornd 二项分布的随机数生成器
chi2rnd 卡方分布的随机数生成器
exprnd 指数分布的随机数生成器
frnd f分布的随机数生成器
gamrnd 伽玛分布的随机数生成器
geornd 几何分布的随机数生成器
hygernd 超几何分布的随机数生成器
lognrnd 对数正态分布的随机数生成器
nbinrnd 负二项分布的随机数生成器
ncfrnd 非中心f分布的随机数生成器
nctrnd 非中心t分布的随机数生成器
ncx2rnd 非中心卡方分布的随机数生成器
normrnd 正态(高斯)分布的随机数生成器
poissrnd 泊松分布的随机数生成器
raylrnd 瑞利分布的随机数生成器
trnd 学生氏t分布的随机数生成器
unidrnd 离散均匀分布的随机数生成器
unifrnd 连续均匀分布的随机数生成器
weibrnd 威布尔分布的随机数生成器

22 Jun 2010

matlab生成螺旋矩阵

n=5;
a=rand(1,n);
b=a(bsxfun(@(i,j)i+j-1-n*(i+j>n+1),1:n,(1:n)'))

产生一个螺旋型n*n矩阵,如:n=5时:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

30 May 2010

matlab GUI资料

matlab GUI资料












































































































MATLAB GUI应用__MATLAB资料汇总
资料名称 免费下载地址
李显洪《Matlab7.x界面设计与编译技巧》PDF下载 http://www.matlabfan.com/thread-315-1-1.html
图形用户界面(GUI)制作-彩色教程(很多实例) http://www.matlabfan.com/thread-218-1-1.html
GUI演示实例:自制简易计算器 http://www.matlabfan.com/thread-114-1-1.html
MATLAB环境下使用摄像头 http://www.matlabfan.com/thread-899-1-1.html
关于Matlab GUI的课件ppt http://www.matlabfan.com/thread-576-1-1.html
GUI生成exe后,去掉执行程序时出现的dos窗口 http://www.matlabfan.com/thread-503-1-1.html
把Matlab中的GUI生成独立的应用程序(EXE文件) http://www.matlabfan.com/thread-284-1-1.html
在GUI中调用simulink模块,显示并修改参数 http://www.matlabfan.com/thread-1022-1-1.html
matlab gui实例,有很多,解释的也很详细 http://www.matlabfan.com/thread-775-1-2.html
基于Matlab GUI的贪食蛇游戏 http://www.matlabfan.com/thread-552-1-2.html
一个GUI的项目例子,希望对大家有帮助(转载) http://www.matlabfan.com/thread-551-1-2.html
GUI演示实例:主成分分析GUI代码---很经典 http://www.matlabfan.com/thread-113-1-2.html
一个实例搞定MATLAB界面编程 http://www.matlabfan.com/thread-245-1-2.html
Matlab GUI 编程(适用于Matlab的初学者) http://www.matlabfan.com/thread-95-1-2.html
强烈推荐!学习GUI的35个实例! http://www.matlabfan.com/thread-605-1-2.html
MATLAB精通GUI图形界面编程 http://www.matlabfan.com/thread-554-1-2.html
很好的GUI学习开发经验 http://www.matlabfan.com/thread-148-1-2.html
基于Matlab GUI的扫雷游戏 http://www.matlabfan.com/thread-149-1-2.html
GUI中各种控件的特征属性的意义和应用 http://www.matlabfan.com/thread-115-1-2.html
【GUI演示实例】Real-Time Stock Viewer(实时股票浏览器) http://www.matlabfan.com/thread-367-1-2.html
基于MATLAB_GUI的简易计算器源程序 http://www.matlabfan.com/thread-817-1-2.html

29 May 2010

ZT: matlab gui标准控件


三类:用户界面控件、下拉菜单、内容菜单。
1. 用户界面控件包括各种常见控件,如按钮、列表框、编辑框等;
2. 下拉菜单对象主要是各种菜单和子菜单;
3. 内容菜单主要是内容式菜单,如弹出式菜单等。


MATALB的标准图形用户界面
1. 消息对话框
msgbox函数。它不接受用户的任何输入,在用户单击OK按钮后,对话框自动关闭,然后返回程序中继续执行。
>> msgbox('欢迎使用MATLAB') % 建立一个没有标题的消息对话框
>> msgbox('欢迎使用MATLAB','MATALB','warn') %% 建立一个有标题的消息对话框

2. 错误对话框
errordlg函数。 >> errordlg %建立一个默认参数的错误对话框
>> errordlg('这是一个错误对话框','MATLAB error') %建立一个名为MATLAB error的错误对话框

3. 警告对话框
warndlg函数。 >> warndlg %建立一个默认参数的警告对话框
>> errordlg('这是一个警告对话框','MATLAB warning')

4. 帮助对话框
helpdlg函数。
>> helpdlg('你需要帮助吗?','MATLAB Help')

5. 进度条设置对话框
waitbar函数。作用是反映程序运行的完成情况。
h=waitbar(0,'请稍等......')
for i=1:10000
waitbar(i/10000)
end

6.输入对话框
inputdlg函数。
prompt={'输入梯形的上底:','输入梯形的下底','输入梯形的高'};%设置提示字符串
name='Enter trapeaia Data';%设置标题
numlines=1;%指定输入数据的行数
defAns={'20','50','40'};%设定默认值
Resize='on';%设定对话框尺寸可调节
answer=inputdlg(prompt,name,numlines,defAns,'on')%创建输入对话框

7. 列表对话框
listdlg函数。
p=path(path,'C:\MATLAB7 \work');%设置路径,若为当前目录,可以省略这一步
d=dir('C:\MATLAB7\work');%获取指针,若为当前目录,则d=dir
str={d.name};%获取目录内的文件名
[sel,ok]=listdlg('Liststring',str,'PromptString','请选择文件 ','SelectionMode','Multiple')%创建列表对话框。
文件选择成功后,单击“OK‘按钮,系统将选择好的文件序号存入相应向量sel,参数ok的值为1。

8.问题对话框
questdlg函数。提出一个问题,等待用户回答。默认下回答按钮有三个:Yes、No、Cancel。当用户单击任何一个按钮时,系统将该按钮名保存 在一个变量(ButtonName)中。如果用户关闭对话框,则系统将ButtonName置为空。
>> ButtonName=questdlg('你准备好了吗?','MATLAB quest','Yes','No','Cancel','Yes')

9.路径选择对话框
uigedir函数。用于用户查找和选择路径。
>> directoryname=uigetdir('C:\MATLAB7\work','浏览文件件')

10.选择文件对话框
uigetfile函数。用于用户选择所需的文件。
① >> [fn,pn,fi]=uigetfile('*.m','select a M-file')%打开一个选择M文件的对话框,并选择一个文件
② [fn,pn,fi]=uigetfile(...
{'*.m;*.fig;*.mat;','All MATLAB File(*.m,*.fig,*.mat,*.mdl)';
'*.m','M-file(*.m)';...
'*.fig','Figure(*.fig)';...
'*.mat','MAT-flie(*.mat)';...
'*.mdl','Models(*.mdl)';...
'*.*','All Flies(*.*)'},...
'Pick a file')
%打开一个选择多种文件的对话框,并选择一个文件

11.文件保存对话框
uiputfile函数。用于保存文件。
① >> [fn,pn,fi]=uiputfile('*.m','Save selected a M-file')
② [fn,pn,fi]=uiputfile(...
{'*.m;*.fig;*.mat;','All MATLAB File(*.m,*.fig,*.mat,*.mdl)';
'*.m','M-file(*.m)';...
'*.fig','Figure(*.fig)';...
'*.mat','MAT-flie(*.mat)';...
'*.mdl','Models(*.mdl)';...
'*.*','All Flies(*.*)'},...
'Save a file')
%建立多种保存文件的对话框,并选择一个文件

12. 页面设置对话框
pagesetupdlg函数。用来设置页面的各种属性、参数。调用格式为:
dlg=pagesetupdlg(fig)
该命令创建一个页面设置对话框,在该对话框用户可以设置页面的各种属性和参数。该命令只支持单一图形窗口的页面设置,参数fig也必须是单一的图形句柄,不可以是图形句柄向量或simulink图。
>> fig=figure;
>> dlg=pagesetupdlg(fig)

13.打印设置对话框
printdlg函数。用户可以对各种打印参数进行设置。
x=[-pi:0.02:pi];
y=cos(x);
fig=figure;
plot(x,y);
printdlg(fig);%打开Windows打印对话框
printdlg('-crossplatform',fig);%打开MATLAB打印对话框

14.颜色设置对话框
uisetcolor函数。用于用户设置图形的前景色或背景色。
① >> c=uisetcolor %建立一个颜色选择对话框
② %建立一个颜色对话框,并设置对话框的初始颜色,然后选择一种颜色用于一个图形对象。
x=[0:0.02:2*pi];
y=sin(x);
h=figure;
plot(x,y);
c=uisetcolor(h,'select color')

15.字体设置对话框
uisetfont函数。用于用户设置或修改文本字体、坐标轴或设置控件对象的显示文本的字体属性。
① >> s=uisetfont % 建立一个默认字体设置对话框,并设置一种字体。
② 对控件中的文本进行设置
T1=uicontrol('style','pushbutton','string',' 确定',...
'position',[200 320 60 20]); %创建一个按钮
T2=uicontrol('style','pushbutton','string','取消',...
'position',[200 220 60 20]); %创建一个按钮
s=uisetfont(T1) %打开字体设置对话框
set(T2,s) %将T1的设置复制到T2

ZT-matlab gui笔记



1、从最简单的开始
编程最基本的目的就是——我执行一个操作,程序做出一个反应。
“一个操作”包括:点击鼠标,拖动滑块,填写数据,选择选项……
“做出一个反应”包括:计算一些东西,然后储存在哪里,或者贴个图出来,或者显示在哪里……
-------------------------------------------------------------------------------------------------------------------
编程的基本思想:

目的->当点击按钮A时, 然后执行任务C,
则->进入按钮A的回调函数callback 里,写下任务C的代码。
-------------------------------------------------------------------------------------------------------------------
a:不知道callback在哪??右键单击按钮,view callbacks->选择callback)别的控件也一样。
a:不同的回调函数啥意思??
callBack
最常用的就是它。如果控件是按钮,那点击按钮时,则按钮下的 Callback就会执行;如果是滑块,则拖动滑块时,滑块名下的callback就会执行;总之,就是对控件默认操作时,matlab后台就会自动调用它名下的的callback。正常用途,全放在callback下就够了。如果其他的,实在是想知道,了解一下也未尝不可。
ButtonDownFcn
就是鼠标在它(代指各种控件)上面点击一下,你放在这个函数名下的代码就会执行。(ps:按钮的callback也是点击,所以会覆盖掉这个 buttondownfcn。)
CreateFcn
顾名思义,在生成这个控件,显示之前,执行你放在这个函数名下的代码;
DeleteFcn
一样。在控件要销毁,但是被毁灭之前执行这个函数名下的代码。貌似“真的要退出吗”这一类就是写在这里。
KeyPressFcn
当前控件获得焦点且有按键按下时执行。(什么是焦点?就是这个控件被鼠标点了(或者是tab轮选到了)。你打开一个记事本,然后再点这个网页,再随 便按几个按键,记事本上有字不?没有对吧。因为它没获得焦点,所以你的按键它不会反应的。只有你最后再点它一下,再按几个按键,结果怎么样?有字了吧?)这里的KeyPressFcn也是一样的道理。
一般在这下面的代码还会判断下按键是什么,然后执行相应的代码。
ResizeFcn,SelectionChangeFcn 不常用。也懒得去看了。附几句,控件都有Resize的属性,好像默认是不可调整,如果要用到这个函数,去把它打开先。
SelectionChangeFcn
是在群按钮 组件中,改变选择时,所执行的函数。
哪些控件支持哪些回调函数?很简单,你在它上面右键就可以看到了,点进去就可以编辑了。
可以在property inspect中在需要的回调函数下设置%automatic 就可以自动添加相应的回调函数框架。

2、常用控件代码框架参考
---------------------------------------------------------------------
Toggle Button 的callback一般写法
toggle button是什么?设计面板上,左边那一栏图标,看到它名字了吧?没看到?File->preference->GUIDE->把那个show names那一栏勾选上。好了,可以看到了吧 。知道是什么了吧?
拖进来,双击它,看到它的属性设置表。上面各种各样的属性,以后有时间慢慢研究。
点下它时,它默认value ='Max'
不点下它时,它value='Min'
--------
代码:

functon togglebutton1_callback(hObject,eventdata,handles)
%这一句,现在不用管。自动加的。
%%%以下是一般代码
button_state = get(hObject,'Value')
%控件甲的callback下面hObject就是控件甲,同理控件乙callback下的hObject......
if button_state==get(hObject,'Max')
%则怎么怎么怎么
else if button_state==get(hObject,'Min')
%则怎么怎么怎么
end
--------
备注:button_state随便取的变量名,存放按钮的选择状态,别以为它是什么喔。
如果你的button甲是放在一个buttonGroup里面,则button甲callback下的代码就要挪到buttonGroup下面去。因为buttonGroup的回调函数会覆盖掉它成员的回调函数。
----------------------------------------
Radio Buttons
------
代码:

右键点选你的Radio按钮,进入编辑callback
function ………………略
if(get(hObject,'Value')==get(hObject,'Max'))
%被选中了,你想怎么样
else
%不被选中,你想怎么样
end
-----------------------------------------
Check Boxes
-------
代码:

if(get(hObject,'Value')==get(hObject,'Max'))
%被选中了,你想怎么样
else
%不被选中,你想怎么样
end
------------------------------------------
Edit Text
-----------
代码:

function edit1_Callback(hObject,eventdata,handles)
user_string = get(hObject,'String'); %就得到了所输入的字符
%因为matlab是把所有的输入当作字符来看待,如果你是期望的到输入的数据的话,则:
user_entry= str2double(get(hObject,'String')); 这里进行一个数据类型转换。看函数名就知道了。
if isnan(user_entry) %nan就是not a number的简写。知道这个函数意思了吧?
errodlg('You must entry a number value','Bad Input','modal') %跳出一个对话框。
end
%正确得到了数值,以下输入你的其他代码
----------
附: 'Bad Input'是指窗口样式,就像我们在操作系统下,经常会跳出一个黄色感叹号的对话框,或者一个红叉的对话框;
modal是指窗口类型,就像一些程序跳出警告对话框,我们什么也不能做了,只能把那个对话框选择一个是或者不是,才能继续做其他事情。这种对话框就是modal类型。而通常的比如浏览器的界面,我们打开后,可以不管,然后打开别的对话框,这种就是非模态对话框。
默认在点击你的界面菜单栏或者界面上的其他组件后,这个edit text的callback都回被执行一遍,所以在你点确定按钮的时候,edit callback下读到的数据会更新的了,不用担心!
---------------------------------------------------
Sliders
---------
代码:

function slider1_callback(hObject,eventdata,handles)
slide_value=get(hObject,'Value');%获取滑块当前值
%别的代码
----------
附: 它的Max Min 属性设置了滑竿的最大最小范围值。
---------------------------------------------------
List Boxes
-----------
代码:

function ........
index = get(handles.listbox1,'Value'); %listbox1是你自己的那个控件的tag名字
file_list =get(handles.listbox1,'String'); %得到了你的listBoxes的列表
file_name = file_list{index};
%得到了所选择的项目名,一下写自己的代码
-------------------
附:
此 callback在鼠标在这个控件上松开或者特定的键盘按键松开(看你怎么设置它的别的属性的了)时候执行。
默认键盘上 下 键可以改变它的值同时执行一次callback。而enter和space不改变它的值,只是执行 callback
Max-Min 差值是0的话,表示只可以单选;1的话,表示可以多选。这个可以在他的属性栏里设置
----------------------------------------------------------
Pop_up Menus
--------------
代码:

function .......
val=get(hObject,'Value')
Switch val
case 1
%
case 2
%
defualt
......
end
----------------------------------------------------
Button Groups
------------------
代码:

function .......
switch get(hObject,'Tag');
%注意这里的hObject和别的不同,并不是指这个BUtton Group,而是指在组里面,被选中的那个控件
case 'radio button1' %按钮1的tag
%。。。。。
case '按钮2的tag'
%。。。。。
。。。
end
----------
附:所以在这里,如果要拿到button groups本身的话,就用handles.它的tag名 中间一个点。
--------------------------------------------------
Axes
-------------
它是用来画图的, 可以说是一块画布。它并不算是严格意义上的控件,但可以让用户在它的区域上点击或者移动鼠标时(看你是放在什么callback下了)执行一定的代码。那就要加它自己的callback函数了。
下面用来一般功能,所以不用自己的callback,代码都是写在别的控件回调函数下。

代码:

axes(handles.youraxesname);% 选择你的一个axes,自然,用它的tag来选中它
plot(x,y); %这时,所画的图就到它上面了
set(handles.youraxesname,'XMimrFrick','on'); %顺便设置一下它的属性
grid on; %加上网格
--------------------------------------------------
Active控件
------------
还没时间去研究。这个是最好用的,因为可以借用别人的现成的东西,毕竟自己不是程序员,没有必要编写太多的代码。一些通用的比如文件存取对话框,视频放映之类的。
可惜,我还没时间去看。呵呵。
------------------------------------------------------------------------------------------------------------------

3、怎么获得和设置控件的属性
------------
通俗的说,就是我怎么获取 编辑框里的字符,滑块现在的位置,pop up里被选中的选项,如何控制 static text显示我要求的信息
控件的属性当然远不止我刚刚说的。
在你需要的地方插入以下代码:
设置:
set(handles.你控件的tag,'要设置的属性名','要设置的属性值')
获取:
get(handles.你控件的tag,'要获取的属性名')

比如:set(handles.edit1,'string','hello world');
help里可以看到所有可能有用的属性
MATLAB->Creating Graphical User Interfaces->Laying Out GUIs and Setting Properties->What Properties Do I Need to Set?


4. 数据怎么在不同的控件之间传递
知道了GUI的数据管理规则,这个就很简单了。
-------------------
先看在一个GUI界面内部的传递的数据
每一个控件的回调函数头:
function myc_Callback(hObject, eventdata, handles)

第一个参数是hObject,是跟这个callback所关联的控件的 handles,在它自己的callback下,可以用代号-> hObject 来调用它。。不用管那么麻烦的概念,只用知道,控件自己的回调函数调用自己的属性,只用hObject. 属性名 就可以了(中间一点)。
第二个参数是MATLAB的保留参数
第三个handles,是这个GUI界面的代号。可以通过它获取这个界面的所有信息。所以在控件A自己的回调函数中,要获取或者设置别的控件的属性,就用 handles.别的控件Tag.属性
------------------------------
handles hObject 都是结构体。正常的编程概念。

handles格式是一个存放数据的缸。控件的handles是小缸,它的名字叫做hObject;GUI界面的handle是一个大缸,并且这个缸名字 也叫做handles;大缸里存放了所有的小缸和所有用户数据,你只需 handles.控件A的tag 就可以存取控件A的信息。

那我怎么把自己计算出或者别的什么数据放到这个缸里呢?
^_^ 在任何地方
handles.自己的变量名 = 某些值 (其实也就是给结构体添加成员变量)
这样你就定义了自己的变量。
在任何地方
b=handles.自己的变量名 (结构名加点号来引用成员变量)
就可以得到这个变量值,同样也可以修改它。
别忘了使用
guidata(hObject, handles);(不用改,直接黏贴) 在函数末尾来保存你对handles和hObject的操作。(不然你自定义的变量就没了)

5、在不同GUI之间传递数据
--------------
*************这部分是以前写的我发现我的理解有些问题---所以我现在传递数据用的application data的方法,没用这个。可能还没理解透output的函数作用***************
传入
那就来看打开一个GUI界面时,传给他的参数有哪些。

function mygui_OpeningFcn(hObject, eventdata, handles, varargin)
所有的启动参数都是通过varargin传到它的OpeningFcn里面的。那启动参数可以是哪些呢?

1、figure,也就是窗口参数。
比如说position之类
例如:打开这个GUI时,使用这个命令 mygui('Position',[434 234 234 34])则表示打开窗口在这个位置;还有哪些可控属性可以查help。
2、自定义参数 。
如果传入的参数不是figure的属性(matlab查找不到你输入的属性名),则你输入的参数作为一个向量存放在varargin里面。
比如mygui('路人甲','80‘),那varargin{1}存放了'路人甲',varargin{2}=’80‘
那mygui中对这读取两个数据进行反应,就达到了传入参数的目的。

传出
那怎么把数据传出来呢?
将你要输出的数据存在 handles.output里面
在GUI任意地方
handles.output=数据1;
handles.secend_output=数据2;
然后在GUI的outputFcn里面加上
varaginout{1}=handles.output;
varaginout{2}=handles.secend_output;
这样就把数据传出来了。

看每一个GUI的最外层的那句
function varargout = mygui(varargin) 看输入输出,就是这样了。把GUI本身就是一个函数,
b=mygui(一些传入的参数) 就执行GUI并返回结果
则b就得到了传出来的结果。

来自http://blog.163.com/cjt_0125@yeah/blog/static/916829092009101771445748/

28 May 2010

matlab tips - 清除直线之外的点



原图


处理后



close all;

a = imread('test.jpg'); % 读取图像
a = im2bw(a); % 二值化
figure,imshow(a);

line1 = [13,168;358,55]; % 两条直线,坐标格式[row1,col1;row2,col2]
line2 = [15,280;364,437];

k1 = (line1(1,1)-line1(2,1))/(line1(1,2)-line1(2,2)); % 直线斜率1
k2 = (line2(1,1)-line2(2,1))/(line2(1,2)-line2(2,2));

[m,n] = size(a); % 尺寸

for i=1:m
    for j=1:n
        if i-line1(2,1)<k1*(j-line1(2,2)) % 清除直线1左边
            a(i,j) = 0;
        end
        if i-line2(2,1)<k2*(j-line2(2,2)) % 清除直线2右边
            a(i,j) = 0;
        end
    end
end

figure,imshow(a);

25 May 2010

sphinx简介

sphinx简介

简单来说,这是一个基于ReStructuredText的文档生成工具。方便易用,功能强大。

有很多开源工程都采用sphinx作为文档生成系统,最有名的就是 python官方文档 。 在 sphinx官方 网站 上也列出使用sphinx的项目,有将近90个左右,其中不乏大名鼎鼎的开源项目。

一些中文的翻译项目也采用了sphinx,如 pymotwcn

 



安装

1. 安装python

2. 要确认已经安装了setuptools

  • 如果已经安装,你在python安装路径下的Scripts文件夹下会找到一个easy_install.exe。
  • setuptools下载

3. 在命令行输入easy_install sphinx

  • easy_install可以自动下载并安装sphinx以及它所依赖的其他模块。

 

建立sphinx工程

建议使用sphinx自带的配置工具sphinx-quickstart。 - 建立一个工程目录,比如D\:Note。 - 在该目录启动命令行,输入sphinx-quickstart

D:\Note>sphinx-quickstart




  • 程序会提示输入一些选项,如输入根目录





    Welcome to the Sphinx quickstart utility.

    Please enter values
    for the following settings (just press Enter to
    accept a
    default value, if one is given in brackets).

    Enter the root path
    for documentation.
    > Root path for the documentation [.]:
    大部分使用默认选项,直接按回车即可。




  • 需要指定的选项



    1. 分离source和build目录,方便管理




      > Separate source and build directories (y/N) [n]: y


    2. 指定工程名、作者名、版本号





      The project name will occur in several places in the built documentation.
      > Project name: Note
      > Author name(s): LK

      Sphinx has the notion of a
      "version" and a "release" for the
      software. Each version can have multiple releases.
      For example, for
      Python the version is something like
      2.5 or 3.0, while the release is
      something like
      2.5.1 or 3.0a1.  If you don't need this dual structure,
      just set both to the same value.
      > Project version: 0.1
      > Project release [0.1]:





    3. 文档文件的后缀名,默认是.rst,个人认为用.txt更方便些。



      The file name suffix for source files. Commonly, this is either ".txt"
      or
      ".rst".  Only files with this suffix are considered documents.
      > Source file suffix [.rst]: .txt






  • 完成后,可以看到Note目录下有以下目录和文件


    • build目录 运行make命令后,生成的文件都在这个目录里面
    • source目录 放置文档的源文件
    • make.bat 批处理命令
    • makefile


  • 基本完成了,使用make html命令就可以生成html形式的文档了。



配置(conf.py)



conf.py文件包含了sphinx工程的所有配置选项,包括一些无法在sphinx-quickstart中进行设置的。



分为三部分:


  • General configuration(一般选项)
  • Options for HTML output(HTML输出选项)
  • Options for LaTeX output(Latex输出选项)

下面是一些常用的选项:





  • language (语言)


    对应于sphinx的locale目录下的文件夹,里面是本地化配置。


    官方版本只支持繁体中文(zh_TW),可以下载 sphinx简体中文包 (javaEye topman制作)


    下载后放到locale目录下,然后language选项修改为zh_CN即可



  • html_theme (输出html的主题):



    # The theme to use for HTML and HTML Help pages.  Major themes that come with
    #
    Sphinx are currently 'default' and 'sphinxdoc'.
    html_theme = 'sphinxdoc'





常用的文档格式符号


下面只是列出了一些常用的格式符号,以供大家参考,详细的教程可以参照《reStructuredText 简明教程》 (以下基本上是从该教程直接引用过来的)。



标题


ReStructuredText会根据下划线读取文档的标题,并且可以自动组织索引



=====================
文档标题
=====================

--------
子标题
--------

章节标题
========

...



列表


列表中,相同的层级使用相同的缩进。


列表中同一层级不需要空行分隔。不同层级起始处必须有空行。



列表:
 
- 条目
 
- 条目

     
- 条目
     
- 条目
 
- 条目



超链接


 


独立链接 ,自动将网址转换为链接。


例如 http://www.ubuntu.org.cn/


 



http://www.ubuntu.org.cn/ 


 


命名链接 ,为链接命名,有助记忆和减少空间占用。


在正文中使用 <链接名>_ ,注释中使用 _<链接名>: [链接目标]

例如 Ubuntu



Ubuntu_

.. _Ubuntu:  http:
//www.ubuntu.org.cn/

 



代码


sphinx对嵌入程序代码的支持很好(本来就是为了编写python文档而开发的工具)。


在段落的结尾添加符号 :: ,则表明下面的段落为代码段落。代码段落相对之前的段落要缩进一次。




文本


只要没有空行,不管换多少次行,都会处理为一行。 建议您将每行的内容控制在50个汉字或者100个字母之内, 尽量在标点符号处手动换行,以增加源文件的可读性。



其他


暂时没有发现支持ReStructuredText的Blog,不知道大家有没有知道的。如果能直接用ReStructuredText写Blog 就太好了。


22 May 2010

数学软件四大家---Maple、MATLAB、MathCAD和Mathematica


目前在科技和工程界上比较流行和著名的数学软件主要有四个,分别是Maple、MATLAB、 MathCAD和Mathematica。它们在各自针对的目标都有不同的特色。下面就让我为你一一道来。   

一、Maple V 系统   
Maple V是由Waterloo大学开发的数学系统软件,它不但具有精确的数值处理功能,而且具有无以伦比的符号计算功能。Maple V的符号计算能力还是MathCAD和MATLAB等软件的符号处理的核心。Maple提供了2000余种数学函数,涉及范围包括:普通数学、高等数学、 线性代数、数论、离散数学、图形学。它还提供了一套内置的编程语言,用户可以开发自己的应用程序,而且Maple自身的2000多种函数,基本上是用此语 言开发的。   Maple采用字符行输入方式,输入时需要按照规定的格式输入,虽然与一般常见的数学格式不同,但灵活方便,也很容易理解。输出则可以选择字符方式和 图形方式,产生的图形结果可以很方便地剪贴到Windows应用程序内。   

二、MATLAB 系统   
MATLAB原是矩阵实验室(Matrix Laboratory)在70年代用来提供Linpack和Eispack软件包的接口程序,采用C语言编写。从80年代出现3.0的DOS版本,逐渐成 为科技计算、视图交互系统和程序语言。MATLAB可以运行在十几个操作平台上,比较常见的有基于Windows 9X/NT、OS/2、Macintosh、Sun、Unix、Linux等平台的系统。   MATLAB程序主要由主程序和各种工具包组成,其中主程序包含数百个内部核心函数,工具包则包括复杂系统仿真、信号处理工具包、系统识别工具包、优 化工具包、神经网络工具包、控制系统工具包、μ分析和综合工具包、样条工具包、符号数学工具包、图像处理工具包、统计工具包等。而且5.x版本还包含一套 几十个的PDF文件,从MATLAB的使用入门到其他专题应用均有详细的介绍。   MATLAB是数值计算的先锋,它以矩阵作为基本数据单位,在应用线性代数、数理统计、自动控制、数字信号处理、动态系统仿真方面已经成为首选工具, 同时也是科研工作人员和大学生、研究生进行科学研究的得力工具。MATLAB在输入方面也很方便,可以使用内部的Editor或者其他任何字符处理器,同 时它还可以与Word6.0/7.0结合在一起,在Word的页面里直接调用MATLAB的大部分功能,使Word具有特殊的计算能力。   

三、MathCAD 系统   
MathCAD是美国Mathsoft公司推出的一个交互式的数学系统软件。从早期的DOS下的1.0和Windows下的4.0版本,到今日的 8.0版本,功能也从简单的数值计算,直至引用Maple强大的符号计算能力,使得它发生了一个质的飞跃。   MathCAD是集文本编辑、数学计算、程序编辑和仿真于一体的软件。MathCAD7.0 Professional(专业版)运行在Win9X/NT下,它的主要特点是输入格式与人们习惯的数学书写格式很近似,采用WYSWYG(所见所得)界 面,特别适合一般无须进行复杂编程或要求比较特殊的计算。MathCAD 7.0 Professional 还带有一个程序编辑器,对于一般比较短小,或者要求计算速度比较低时,采用它也是可以的。这个程序编辑器的优点是语法特别简单。   MathCAD可以看作是一个功能强大的计算器,没有很复杂的规则;同时它也可以和Word、Lotus、WPS2000等字处理软件很好地配合使 用,可以把它当作一个出色的全屏幕数学公式编辑器。   

四、Mathematica 系统   
Mathematica是由美国物理学家Stephen Wolfram领导的Wolfram Research开发的数学系统软件。它拥有强大的数值计算和符号计算能力,在这一方面与Maple类似,但它的符号计算不是基于Maple上的,而是自 己开发的。   Mathematica的基本系统主要是用C语言开发的,因而可以比较容易地移植到各种平台上,Mathematica是一个交互式的计算系统,计算 是在用户和Mathematica互相交换、传递信息数据的过程中完成的。Mathematica系统所接受的命令都被称作表达式,系统在接受了一个表达 式之后就对它进行处理,然后再把计算结果返回。Mathematica对于输入形式有比较严格的规定,用户必须按照系统规定的数学格式输入,系统才能正确 地处理,不过由于3.0版本引入输入面板,并且可以修改、重组输入面板,因此以前版本输入指令时需要不断切换大小写字符的繁琐方式得到很好的改善。3.0 版本可以用各种格式保存文件和剪贴内容,包括RTF、HTML、BMP等格式。   

五、四种软件的比较   
选用何种数学软件?如果仅仅是要求一般的计算或者是普通用户日常使用,首选的是MathCAD,它在高等数学方面所具有的能力,足够一般客户的要求, 而且它的输入界面也特别友好。如果要求计算精度、符号计算和编程方面的话,最好同时使用Maple和Mathematica,它们在符号处理方面各具特 色,有些Maple不能处理的,Mathematica却能处理,诸如某些积分、求极限等方面,这些都是比较特殊的。如果要求进行矩阵方面或图形方面的处 理,则选择MATLAB,它的矩阵计算和图形处理方面则是它的强项,同时利用MATLAB的NoteBook功能,结合Word6.0/7.0的编辑功能,可以很方便地处理科技文章.

其他开源免费数学计算软件
有很多,比如octave、scilab、rlab、freemat和maxima等等…没研究过…貌似也听不错的应该…:D

MATLAB与Microsoft Word的连接


MathCAD文字处理是非常强的,那么MATLAB的文字处理又将如何呢?MathWorks公司开发的MATLAB Notebook成功地将Microsoft Word和MATLAB结合在一起,为文字处理、科学计算和工程设计营造了一个完美的工作环境。这样MATLAB不仅兼具原有的计算能力,而且又增加了 Word软件的编辑能力,已经远远的把MathCAD抛在后面。MATLAB Notebook可以在word中随时修改计算命令,随时计算并生成图像返回,使用户能在Word环境中“随心所欲地享用”MATLAB的浩瀚科技资源。 MATLAB Notebook的工作方式是:用户在word文档中创建命令,然后送到MATLAB的后台中执行,最后将结果返回到word中。

建议撰写科技报告、论文、专著的科学工作者使用MATLAB Notebook,建议讲授、编写理工科教材的教师使用MATLAB Notebook,建议对于演算理工科习题的广大学生使用MATLAB Notebook。MATLAB Notebook的强大功能将会使你事半功倍。

1 安装MATLAB Notebook
从上面的介绍中可以看出,使用MATLAB Notebook时,你的计算机中必须有Word和MATLAB。本书以MATLAB6.5和word2000为例。MATLAB Notebook文件又称为M-book文件。MATLAB6.5的Notebook是在MATLAB环境下安装的。具体步骤如下:

(1)在系统中分别安装MATLAB6.5和word2000,并启动 MATLAB6.5命令窗口;

(2)在命令窗口中输入:

>> notebook -setup

就会得到如下提示:

Welcome to the utility for setting up the MATLAB Notebook

for interfacing MATLAB to Microsoft Word




Choose your version of Microsoft Word:

[1] Microsoft Word 97

[2] Microsoft Word 2000

[3] Microsoft Word 2002 (XP)

[4] Exit, making no changes

(3)根据安装的Word的版本选择相应的代号,本文选择如下:

Microsoft Word Version: 2

Notebook setup is complete.

这样你就可以使用MATLAB Notebook了。有两种方法可以打开一个M-book文件。



(1)直接在MATLAB命令窗口键入命令来新建或打开一个M-book文件:

>> notebook %新建一个M-book(不建议使用,在我的计算机里经常出错)

>> notebook c:\documents\mymbook.doc %打开一个已经存在的M-book

(2)先打开word2000,然后打开文件(F)/新建(不要直接点击新建按钮),弹出图11-1对话框。选中其中的m-book模板。在新建的word文档中就会出现图11-2中黑圈所在的菜单栏。

2 使用MATLAB Notebook
Notebook是通过动态链接来和MATLAB交互的。Notebook和MATLAB交互的基本单位为细胞。Notebook需要输入MATLAB中的命令组成细胞,再传到MATLAB中运行,运行输出的结果再以细胞的方式传回Notebook。

1. 在Word中执行命令的基本过程
Notebook采用输入细胞(input cell)来定义MATLAB的输入命令。步骤如下:

(1)采用文本格式输入命令,在命令结束时不要按回车和空格键;

(2)从Notebook菜单中选中“Define Input Cell”选项,用来定义输入细胞;

(3)从Notebook菜单中选中“Evaluate Cell”选项或者Ctrl+Enter。

其中输入细胞都显示为黑方括号包括的绿色字符,输出细胞都是黑方括号包括的蓝色字符,如果出现错误黑方括号包括的红色字符,其它文本都默认为黑色字符。如下:(作者注释:无专门标示的行为蓝色)

m=eye(3) (作者注释:此行为绿色)

m =



1 0 0



0 1 0



0 0 1

m/0 (作者注释:此行为绿色)

Warning: Divide by zero.



(Type "warning off MATLAB:divideByZero" to suppress this warning.)



ans =



Inf NaN NaN



NaN Inf NaN



NaN NaN Inf

m=eye(3) n=eye(4) (作者注释:此行为绿色)

??? format compact;m=eye(3) n=eye(4)



| (作者注释:此行以及上下两行为红色)



Error: Missing operator, comma, or semicolon. 绿色)



2. 实例讲解
在一段文本中间执行代码

在MATLAB中,可以把输入细胞放在文本中间运行,而不影响其它文本。步骤如下:

(1)输入样本如下,将m=eye(3)放到文本中间。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

你去过《动力学与控制技术》论坛吗?m=eye(3) 那里有很多好东西。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(2)选中命令,如下所示:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

你去过《动力学与控制技术》论坛吗?m=eye(3) 那里有很多好东西。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(3)从Notebook菜单中选中“Evaluate Cell”选项或者Ctrl+Enter。将会出现上面例子中类似的结果。

(4)如果要将输出细胞转化为普通文本,选中要转换的细胞,然后从 Notebook菜单中选中“Undefine Cells”选项或者Alt+U。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

你去过《动力学与控制技术》论坛吗?m=eye(3) 那里有很多好东西。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

m =



1 0 0



0 1 0



0 0 1

【实例】绘制一幅图片

生成完整图形的多条图形指令必须定义在同一细胞群中

t=0:0.1:20;y=1-cos(t).*exp(-t/5);

Time=[0,20,20,0];

Amplitude=[0.95,0.95,1.05,1.05];

fill(Time,Amplitude,'g'),axis([0,20,0,2]);

xlabel('Time'),ylabel('Amplitude');

hold on

plot(t,y,'r','LineWidth',2)

hold off

ymax=min(y)

将以上程序写到Word当中,然后全部选上,然后选择【Notebook|Define Input Cell】,最后从Notebook菜单中选中【Evaluate Cell】选项,或者Ctrl+Enter。得到如下结果

t=0:0.1:20;y=1-cos(t).*exp(-t/5);



Time=[0,20,20,0];



Amplitude=[0.95,0.95,1.05,1.05];



fill(Time,Amplitude,'g'),axis([0,20,0,2]),xlabel('Time'),ylabel('Amplitude');



hold on



plot(t,y,'r','LineWidth',2)



hold off



ymax=min(y)




ymax =

0

20 May 2010

python实现请按任意键结束


python实现请按任意键结束...

# it works on Windows
# we can also find the corresponding system command on Linux
import os
os.system("pause")

12 May 2010

霍夫变换(Hough Transform)

霍夫变换(Hough Transform)

霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。

设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。

直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(22)。可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。

同理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。这个性质就为我们解决问题提供了方法:

1. 首先,对参数平面,将其所有数据置为0.
2. 对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点的值都加1。
3. 最后,找到参数平面上最大点的位置,这个位置就是原图像上直线的参数。

上面就是霍夫变换的基本思想。就是把图像平面上的点对应到参数平面上的线,最后通过统计特性来解决问题。假如图像平面上有两条直线,那么最终在参数平面上就会看到两个峰值点,依此类推。

在实际应用中,y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用中,是采用参数方程 p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就对应到参数p---theta平面上的一条曲线上。其它的还是一样。

要从一副图像中检测出半径以知的圆形来。这个问题比前一个还要直观。我们可以取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像上的圆心。在这个问题里,图像平面上的每一点对应到参数平面上的一个圆。

把上面的问题改一下,假如我们不知道半径的值,而要找出图像上的圆来。这样,一个办法是把参数平面扩大称为三维空间。就是说,参数空间变为x--y--R 三维,对应圆的圆心和半径。图像平面上的每一点就对应于参数空间中每个半径下的一个圆,这实际上是一个圆锥。最后当然还是找参数空间中的峰值点。不过,这个方法显然需要大量的内存,运行速度也会是很大问题。

我们前面假定的图像都是黑白图像(2值图像),实际上这些2值图像多是彩色或灰度图像通过边缘提取来的。我们前面提到过,图像边缘除了位置信息,还有方向信息也很重要,这里就用上了。根据圆的性质,圆的半径一定在垂直于圆的切线的直线上,也就是说,在圆上任意一点的法线上。这样,解决上面的问题,我们仍采用2维的参数空间,对于图像上的每一前景点,加上它的方向信息,都可以确定出一条直线,圆的圆心就在这条直线上。这样一来,问题就会简单了许多。

图象处理中的边缘检测

边缘提取以及边缘增强是不少图像处理软件都具有的基本功能,它的增强效果很明显,在用于识别的应用中,图像边缘也是非常重要的特征之一。图像边缘保留了原始图像中相当重要的部分信息,而又使得总的数据量减小了很多,这正符合特征提取的要求。在以后要谈到的霍夫变换(检测图像中的几何形状)中,边缘提取就是前提步骤。


既然边缘提取是要保留图像的灰度变化剧烈的区域,从数学上,最直观的方法就是微分(对于数字图像来说就是差分),在信号处理的角度来看,也可以说是用高通滤波器,即保留高频信号。这是最关键的一步,在此之前有时需要对输入图像进行消除噪声的处理。

用于图像识别的边缘提取往往需要输出的边缘是二值图像,即只有黑白两个灰度的图像,其中一个灰度代表边缘,另一个代表背景。此外,还需要把边缘细化成只有一个像素的宽度。总的说来边缘提取的步骤如下:
1,去噪声
2,微分运算
3,2值化处理
4,细化

第二步是关键,有不少书把第二步就直接称为边缘提取。实现它的算法也有很多,一般的图像处理教科书上都会介绍好几种,如拉普拉兹算子,索贝尔算子,罗伯特算子等等。这些都是模板运算,首先定义一个模板,模板的大小以3*3的较常见,也有2*2,5*5或更大尺寸的。运算时,把模板中心对应到图像的每一个像素位置,然后按照模板对应的公式对中心像素和它周围的像素进行数学运算,算出的结果作为输出图像对应像素点的值。模板运算是图像的一种处理手段--邻域处理,有许多图像增强效果都可以采用模板运算实现,如平滑效果,中值滤波 (一种消除噪声的方法),油画效果,图像的凹凸效果等等。

这里对拉普拉兹算子和索贝尔算子补充两句。拉普拉兹算子是
2阶微分算子,也就是说,相当于求取2次微分,它的精度还算比较高,但对噪声过于敏感(有噪声的情况下效果很差)是它的重大缺点,所以这种算子并不是特别常用。索贝尔算子是最常用的算子之一(它是一种一阶算子),方法简单效果也不错,但提取出的边缘比较粗,要进行细化处理。另外,索贝尔算子也可提取出图像边缘的方向信息来,有文章论证过,在不考虑噪声的情况下,它取得的边缘信息误差不超过7度。

下面介绍几种高级算法。首先是马尔(Marr)算子,马尔是计算机视觉这门学问的奠基人,很了不起,但这些理论很难懂。他提出的边缘提取方法可以看成两个步骤,一个是平滑作用来消除噪声,另一个是微分提取边缘,也可以说是由两个滤波器组成,低通滤波去除噪声,高通滤波提取边缘。人们也称这种方法为LOG滤波器,这也是根据它数学表达式和滤波器形状起的名字。也可以采用模板运算来实现这种算法,但模板的大小一般要在7*7以上,所以运算复杂程度比索贝尔算子等要大不少,运算时间当然也长许多。

另外一种非常重要的算法是坎尼(Canny)算子,这是坎尼在1986年写的一篇论文里仔细论述的。他给出了判断边缘提取方法性能的指标。而坎尼算子也是图像处理领域里的标准方法,也可以说是默认的方法。比较奇怪的是,国内的图像处理教科书中,介绍坎尼算子的很少。郑南宁的‘计算机视觉与模式识别’(1998年),算是介绍的比较详细的。坎尼算子在使用时要提供给一些参数,用于控制算法的性能,实际上,对于不同的图像或不同的边缘提取目的,应该提供不同的参数,以达到最佳效果。它也有模板运算方法,模板的大小也比较大,和提供的参数有关,标准的大小差不多是17*17,可以根据算子的可分离性用快速算法(否则就会慢的一塌糊涂),坎尼算子的2值化也很有特色,具有一定的智能性。

还有一种算法:Shen-Castan算子,效果和坎尼算子不相上下,这种算法在对边缘提取好坏的判别标准上有些不同。在实际的图像处理与识别应用中,有时需要根据被处理图像的种类以及实际目的,量身定做算法,边缘提取也是一样,但是基本原理都是一样的。