Thursday 31 May 2007

新安装MATLAB7运行时自动关闭的问题

http://tb.blog.csdn.net/TrackBack.aspx?PostId=1584882



这个问题的原因时因为你的CPU是AMD系列的,速龙、闪龙等,表现就是安装好后打开,自动关闭一闪而过,没有任何提示。


这个问题以前碰到过,通过网友的帖子解决了,但今天又有同事过来问我.看来还是写一下吧!


解决办法:
1,确认安装好后(假如安装在D盘) 在此路径下D:\MATLAB7\bin\win32有一个文件名为atlas_Athlon.dll的文件;

2,然后在我的电脑上右击点"属性->高级->环境变量->系统变量->新建 ,输入以下信息:

变量名:BLAS_VERSION
变量值:D:\MATLAB7\bin\win32\atlas_Athlon.dll.


然后,再运行就OK啦!~

如生

如死

如踏过地狱的烈火

如真

如假

如穿过天堂的云朵

 

在不断追逐的旅途中

忘却了 心底最初的创痛

在平凡的日子里重复

那些不断轮回的往事随风

 

如进

如退

如凄风中漂泊的飞鸟

如梦

如幻

如不小心闯进神秘的花园

Saturday 26 May 2007

一首歌一个故事

歌曲:一首歌一个故事
歌手:谭咏麟 专辑:梦幻的笑容


清脆的结他
乱弹乱弹着歌
未明内容在讲什么
从甜蜜的爱
到炎夏之吻
都爱得着魔
时间愉快掠过
有理想但是傻
也都不错
直到在某一天
唱尽无尽爱歌
能感动有情人
会是这样多

从前曾相恋的失恋的小伙子
唱每一首歌一个故事
道尽离合悲欢几个字
完全来自过去那日子
犹如人生之歌一开始不休止
唱每一首歌一个故事
为着前路永远冲刺

一个深秋
极甜蜜而重要
问谁共鸣或多或少
无名字的你
仍忘掉不了
使我心在烧
时间共我竞赛
志向总未动摇
每一分秒
越爱越爱你多
有热情自有歌
才感动有情人
会是这样多
(你能做到已找到所爱天地
尽管亦尝试过
有是有非每段时期)
ha...
我仍是我
纵使岁月如飞
仍是我
仍是我
亦有喜
亦有悲
在我所唱我的歌
说起........
回头天真的最初
常常不小心闯祸
但是风风雨雨
自然掠过
已经得到太多
和情人轻轻哼句歌
悠悠然倚窗观星座
是什么帮过我
令年月
未枉过........

Thursday 24 May 2007

dream girl——for a hap in my life

生命中闪电一般划过

 

留下一种梦想 零落心底

 

相遇是 一种偶然

重逢才 那样的珍贵

 

不奢望,因为 只是 一个 不愿意醒来的梦

 

see you

 

天空下的  寂寞

 

I forget this

 

you say only one word and even not to me

 

so i know so i know

 

i never ever appear in your beautiful eyes

 

you are the dream girl so i have to leave you and go far far away

 

you are the dream girl for you give me the best experience in th world

 

you are the dream girl for you stay far away from me silent staring at him

 

you are the dream girl singing a song i wrote it for you

 

you are the dream girl telling me we have to always be friends

 

you are the dream girl so sweet for me to forget

 

so  i know so i know

 

dream girl is not you,is not her,is just a stranger appear in my life by an accident

 

i don't need to find a word

 

you know ,you are the dream girl of some one

 

i know ,you are the dream girl of me

Tuesday 22 May 2007

不被爱的小孩

寂寞梧桐秋风落

空心琵琶萧瑟多

不再轻轻的悲哀

我是不懂爱的小孩

 

小路草长踏阶行

花园何处觅新径

依然默默的伤害

我是不会爱的小孩

 

两岸潮生心起退

执手无语泪成灰

可否静静的等待

我是不被爱的小孩

====================================

 

无聊写于2007年初夏将至未至之时

看来我也可以装一下,哈哈

情凭谁来定错对

歌曲:情凭谁来定错对
歌手:谭咏麟 专辑:梦幻的笑容


情凭谁来定错对谭咏麟
曲: oh tae ho 词:谭咏麟编:卢东尼

情凭谁来定错对我始终不想去追
寂寞路上遇痴心相恋也有过痛苦一堆
如能从头遇见你我始终不会后退
将伤心收於记忆中仍没法去剪碎

浓情蜜意尽过去冻好比一杯冷水
独自默默望苍天心底里满载往昔唏嘘
迷雾已渐渐散退过去的经已逝去
前路漫漫显得崎岖还是要我去面对

回忆起当天的欢笑是光阴冲洗不去
在这一生中这一生中沉醉

寂寞憔悴这世界可有谁
逝去了的爱情陪孤单寄居
寂寞憔悴人痛心因你别去
我已不懂得哭笑望著你身影远去

难得当天的相爱是你我都倾出所有
令这一生中这一生中无悔
但寂寞憔悴这世界可有谁

我已不懂得哭笑就让我消失告退
我已不懂得哭笑就让我风中告退

Sunday 20 May 2007

偏偏喜欢你

歌曲:偏偏喜欢你
歌手:陈百强 专辑:偏偏喜欢你


愁绪挥不去苦闷散不去
为何我心一片空虚
感情已失去一切都失去
满腔恨愁不可消除
为何你的嘴里总是那一句
为何我的心不会死
明白到爱失去一切都不对
我又为何偏偏喜欢你

爱已是负累相爱似受罪*
心底如今满苦泪
旧日情如醉此际怕再追
偏偏痴心想见你
为何我心分秒想着过去
为何你一点都不记起
情义已失去恩爱都失去
我却为何偏偏喜欢你

Saturday 19 May 2007

为爱而生

在梦想的天空下迷途

我已经记不清来路

生命的花雨渐渐零落

那些青春依然流散在别处

 

岁月的钟摆不断敲打我的孤独

寂寞在心底长成大树

一年前种下的种子

怎么样都再也找不到当初的话语

 

微冷的夜空下轻柔的风吹拂

你可会在昏暗的街角中走出

喧嚣的街道下

路灯照射着匆匆的脚步

 

随音乐的节奏起舞

幻想有一天落下的幕布

我的眼泪再不需隐藏

飘落在这舞台上写成我的书

 

即使再怎么样痛苦

我也拒绝麻木

让风铃静静的响起

然后才看得到可能的幸福

 

=========================================================

 

 

msn计数器

如果你想获得有关你的空间流量的具体信息,诸如单位时间内的访问量,来访者停留时间,来访者IP及所在国家等等众多专业统计结果,上述网站就不能满足你的需要了。推荐你到这个网站申请此项服务:http://www.statcounter.com/,它提供了极其强大且稳定可靠的统计功能,几乎面面俱到,至少对于我们这个水平这些功能是足够了,而且众多信息均以图形或表格的方式予以呈现,直观明了(Tucow五星推荐)。所有这些服务均为免费,除非你的月访问量超过20万。唯一的缺点就是提供的计数器样式过于简单,可供选择的余地也不大。。它的申请过程很简单,成功后会先让你选择计数器样式(你可以进行简单的定值),然后设定某些参数,诸如通过Cookie功能将你自己的登陆排除在统计数字之外等,之后你可以在Install Code页面获取HTML代码,需要注意的是,它会为不同类型的页面生成不同的代码,因此你要在“Statcounter Code Option”里选择“Html Only Code”,通过这个命令生成的代码才可用于MSN Space,获取代码后的操作就和上面已降解的方式一样了。由于是海外的服务商,所以页面信息全部是英文,这对于不谙E文的朋友可能有些麻烦。

情人

歌曲:情人
歌手:beyond 专辑:乐与怒


情人
词刘卓辉.曲黄家驹.主唱黄家驹.

盼望你没有为我又再渡暗中淌泪
我不想留底你的心空虚
盼望你别再让我象背负太深的罪
我的心如水你不必痴醉
盼望我别去后会共你在远方相聚
每一天望海每一天相对
盼望你现已没有让我别去的恐惧
我即使离开你的天空里
哦你可知谁甘心归去
你与我之间有谁
是缘是情是童真还是意外
有泪有罪有付出还有忍耐
是人是墙是寒冬藏在眼内
有日有夜有幻想没法等待
多少春秋风雨改多少崎岖不变爱
多少唏嘘的你在人海

她来听我演唱会

歌曲:她来听我的演唱会
歌手:张学友 专辑:走过1999


她来听我的演唱会
在十七岁的初恋第一次约会
男孩为了她彻夜排队
半年的积畜买了门票一对
我唱得她心醉我唱得她心碎
三年的感情一封信就要收回
她记得月台汽笛声声在催
播我的歌陪着人们流泪
嘿陪人们流泪
她来听我的演唱会
在二十五岁恋爱是风光明媚
男朋友背着她送人玫瑰
她不听电话夜夜听歌不睡
我唱得她心醉
我唱得她心碎
成年人分手后都像无所谓
和朋友一起买醉卡拉ok
唱我的歌陪着画面流泪
嘿陪着流眼泪.
我唱得她心醉
我唱得她心碎
在三十三岁真爱那么珍贵
年轻的女孩求她让一让位
让男人决定跟谁远走高飞
嘿谁在远走高飞
我唱得她心醉
我唱得她心碎
她努力不让自己看来很累
岁月在听我
们唱无怨无悔
在掌声里唱到自己流泪
嘿唱到自己流泪
她来听我的演唱会
在四十岁后听歌的女人很美
小孩在问她为什么流泪
身边的男人早已渐渐入睡
她静静听着我们的演唱会

Friday 18 May 2007

一个测试

1)写下一个异性的名字
***
2)你最喜欢的顔色是红色,黑色,蓝色,绿色,还是黄色?
蓝色
3)你英文名字的第一个字母?
F
4)你的生日是几月?
8
5)黑色和白色,你更喜欢哪个?
黑色
6)写下一个同性的名字
***
7) 你最喜欢的数字?
4
你喜欢美国的加利福尼亚州(california) 还是福罗里达州(florida)?
california
9)你最喜欢湖还是海洋?

海洋

========================================================

1)你深深的爱这个人
2)如果你选择:

蓝色:你是个八爪鱼,同时爱很多人,而且你喜欢你的爱人的吻和爱
3)如果你的你英文名字的第一个字母是:
a-k 你有的一生中会很多爱和友情
4)如果你生在:
七月到九月:你会有个很快乐的一年且会经历一个在你一生中好的,很大的改变
5)如果你选择了:
黑色:你的生命将会改变方向,当时看起来似乎很难,但之后你会觉得这个改变是你一生中最好的东西
6)他是你最好的朋友
7)这是你一生中会有的贴心朋友的数目
8)如果你选了:
加利福尼亚州(california) :你喜欢冒险
9)如果你选了:
海洋:你是个八爪鱼,同时爱很多人,且你想让你爱的人快乐
=================================================

1)你深深的爱这个人

2)如果你选择:
红色:你是很警戒的人,你的一生中充满了爱

黑色:你很保守,但很自负

绿色:你的灵魂很散懒,而且你是个比较放松的人

蓝色:你是个八爪鱼,同时爱很多人,而且你喜欢你的爱人的吻和爱

黄色:你是个快乐人,而且你给失落的人很好的建议

3)如果你的你英文名字的第一个字母是:
a-k 你有的一生中会很多爱和友情

l-r 你总是想欢享你的生命,你的爱情生活马上就要开放

s-z 你喜欢帮助他人,而且你的未来的爱情生活充满希望


4)如果你生在:

一月到三月:今年你会很走运,而且你会发现你会以外的爱上一个人
四月到六月:你会有个很强的爱情,这段感情不会很长,但那美好的回忆会让你永生不忘
七月到九月:你会有个很快乐的一年且会经历一个在你一生中好的,很大的改变
十月到十二月:你的爱情不会很好,但最终你会找到你一生的伴侣

5)如果你选择了:
黑色:你的生命将会改变方向,当时看起来似乎很难,但之后你会觉得这个改变是你一生中最好的东西
白色:你有个朋友很信任你,愿意爲你做任何事情,但你可能不知道这一点

6)他是你最好的朋友

7)这是你一生中会有的贴心朋友的数目

如果你选了:
加利福尼亚州(california) :你喜欢冒险

福罗里达州(florida):你是个懒散的人

9)如果你选了:
湖:你对你的朋友和爱人很忠诚,且你是个保守的人

海洋:你是个八爪鱼,同时爱很多人,且你想让你爱的人快乐

===================================================

 

一个无趣的心理测试。。。。

也许 人都是要从  别的东西去寻求一种信心吧。。。。。

或者是 从中 得到 一种 可以逃避的 借口吧

 

一个通宵看完eva,无语的感觉。。。。

Thursday 17 May 2007

编译的一些基础知识


lexical analysis


token   attribute     <token,attribute>
pattern
lexemes


error recovery


input buffering


add a sentinels EOF


prefix
suffix
substring
subsequence  


union
concatenation
kleene clourse   L*
positive clourse L+


regular language


regular expressions


regular set (r)|(s) (r)(s) (r)* (r)
regular definition


non regular set


transition diagram


NFA
DFA


NFA->DFA->Min DFA
RE->NFA
RE->DFA


the phases of a compiler


lexical
syntax
semantic
intermediate code generator
code optimizer
code generator
symbol table
error handle



零碎

import msxml 分析库


#import <msxml4.dll> named_guids


得到一个int值的每一个字符值


itemp=*((int*)temp);
char*p=(char*)&i



听了一首歌:)


 

歌曲:情人

歌手:beyond 专辑:乐与怒

情人
词刘卓辉.曲黄家驹.主唱黄家驹.

盼望你没有为我又再渡暗中淌泪
我不想留底你的心空虚
盼望你别再让我象背负太深的罪
我的心如水你不必痴醉
盼望我别去后会共你在远方相聚
每一天望海每一天相对
盼望你现已没有让我别去的恐惧
我即使离开你的天空里
哦你可知谁甘心归去
你与我之间有谁
是缘是情是童真还是意外
有泪有罪有付出还有忍耐
是人是墙是寒冬藏在眼内
有日有夜有幻想没法等待
多少春秋风雨改多少崎岖不变爱
多少唏嘘的你在人海



歌曲:情人(国)

歌手:beyond 专辑:这里那里


词林夕.曲黄家驹.主唱黄贯中.

也许你想像不到我有多渴望做到
在我的怀抱听你的心跳
从来没有对你说我不说你都知道
我对你的好你都不需要
ha......有一天我怕你会说
请别再自寻烦恼
我笑我哭我等待你不明白
你爱你恨你感慨我都不在
不痛不痒不在乎怎样去爱
不言不语离不开互相伤害
到底我已经不是想哭就哭的小孩
一点点伤害应该躲得开
也许我放弃忍耐时间会过得更快
一个人不快还不算最坏
ha......我今天承受的悲哀
你可以置身事外
多少情话说不来
多少爱情爱不来
多少情人真的离不开

Wednesday 16 May 2007

夜深似水

晚上 从实验室 走出来。。。。居然下雨了,风吹过,心有一点点的冷

 

老天这么配合我的心境

 

夜很深,似乎想要睡,似乎又睡不着,思绪在半空中漂浮

 

然后,毅然决然的  跟过去作别

Tuesday 15 May 2007

opencv编程入门3

图像处理



分配与释放图像空间




  • 分配图像空间:
    IplImage* cvCreateImage(CvSize size, int depth, int channels);

       size:   cvSize(width,height);

       depth: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
              IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F

       channels: 1, 2, 3 or 4.
         注意数据为交叉存取.彩色图像的数据编排为b0 g0 r0 b1 g1 r1 ...

    举例:


    // 分配一个单通道字节图像
    IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

    // 分配一个三通道浮点图像
    IplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);



  • 释放图像空间:
    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 
    cvReleaseImage(&img);



  • 复制图像:
    IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 
    IplImage* img2;
    img2=cvCloneImage(img1);



  • 设定/获取兴趣区域:
    void   cvSetImageROI(IplImage* image, CvRect rect);
    void   cvResetImageROI(IplImage* image);
    vRect cvGetImageROI(const IplImage* image);

    大部分OpenCV函数都支持ROI.



  • 设定/获取兴趣通道:
    void cvSetImageCOI(IplImage* image, int coi); // 0=all
    int cvGetImageCOI(const IplImage* image);

    大部分OpenCV函数暂不支持COI.





读取存储图像




  • 从文件中载入图像:
       IplImage* img=0; 
       img=cvLoadImage(fileName);
       if(!img) printf("Could not load image file: %s\n",fileName);

       Supported image formats: BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM,
                                SR, RAS, TIFF, TIF

    载入图像默认转为3通道彩色图像. 如果不是,则需加flag:


       img=cvLoadImage(fileName,flag);

       flag: >0 载入图像转为三通道彩色图像
             =0 载入图像转为单通道灰度图像
             <0 不转换载入图像(通道数与图像文件相同).



  • 图像存储为图像文件:
       if(!cvSaveImage(outFileName,img)) printf("Could not save: %s\n",outFileName);

    输入文件格式由文件扩展名决定.






存取图像元素




  • 假设需要读取在i行j列像点的第k通道. 其中, 行数i的范围为[0, height-1], 列数j的范围为[0, width-1], 通道k的范围为[0, nchannels-1].



  • 间接存取: (比较通用, 但效率低, 可读取任一类型图像数据)



    • 对单通道字节图像:
      IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
      CvScalar s;
      s=cvGet2D(img,i,j); // get the (i,j) pixel value
      printf("intensity=%f\n",s.val[0]);
      s.val[0]=111;
      cvSet2D(img,i,j,s); // set the (i,j) pixel value



    • 对多通道浮点或字节图像:
      IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
      CvScalar s;
      s=cvGet2D(img,i,j); // get the (i,j) pixel value
      printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);
      s.val[0]=111;
      s.val[1]=111;
      s.val[2]=111;
      cvSet2D(img,i,j,s); // set the (i,j) pixel value






  • 直接存取: (效率高, 但容易出错)



    • 对单通道字节图像:
      IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
      ((uchar *)(img->imageData + i*img->widthStep))[j]=111;



    • 对多通道字节图像:
      IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
      ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B
      ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G
      ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R



    • 对多通道浮点图像:
      IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
      ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B
      ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G
      ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R






  • 用指针直接存取 : (在某些情况下简单高效)



    • 对单通道字节图像:
      IplImage* img   = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
      int height      = img->height;
      int width       = img->width;
      int step        = img->widthStep/sizeof(uchar);
      uchar* data     = (uchar *)img->imageData;
      data[i*step+j] = 111;



    • 对多通道字节图像:
      IplImage* img   = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
      int height      = img->height;
      int width       = img->width;
      int step        = img->widthStep/sizeof(uchar);
      int channels    = img->nChannels;
      uchar* data     = (uchar *)img->imageData;
      data[i*step+j*channels+k] = 111;



    • 对单通道浮点图像(假设用4字节调整):
      IplImage* img   = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
      int height      = img->height;
      int width       = img->width;
      int step        = img->widthStep/sizeof(float);
      int channels    = img->nChannels;
      float * data     = (float *)img->imageData;
      data[i*step+j*channels+k] = 111;







  • 使用 c++ wrapper 进行直接存取: (简单高效)



    • 对单/多通道字节图像,多通道浮点图像定义一个 c++ wrapper:
      template<class T> class Image
      {
         private:
         IplImage* imgp;
         public:
         Image(IplImage* img=0) {imgp=img;}
         ~Image(){imgp=0;}
         void operator=(IplImage* img) {imgp=img;}
         inline T* operator[](const int rowIndx) {
           return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));}
      };

      typedef struct{
         unsigned char b,g,r;
      } RgbPixel;

      typedef struct{
         float b,g,r;
      } RgbPixelFloat;

      typedef Image<RgbPixel>        RgbImage;
      typedef Image<RgbPixelFloat>   RgbImageFloat;
      typedef Image<unsigned char>   BwImage;
      typedef Image<float>           BwImageFloat;



    • 单通道字节图像:
      IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
      BwImage imgA(img);
      imgA[i][j] = 111;



    • 多通道字节图像:
      IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
      RgbImage   imgA(img);
      imgA[i][j].b = 111;
      imgA[i][j].g = 111;
      imgA[i][j].r = 111;



    • 多通道浮点图像:
      IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
      RgbImageFloat imgA(img);
      imgA[i][j].b = 111;
      imgA[i][j].g = 111;
      imgA[i][j].r = 111;








图像转换




  • 转为灰度或彩色字节图像:
    cvConvertImage(src, dst, flags=0);

       src = float/byte grayscale/color image
       dst = byte grayscale/color image
       flags = CV_CVTIMG_FLIP      (flip vertically)
               CV_CVTIMG_SWAP_RB   (swap the R and B channels)



  • 转换彩色图像为灰度图像:



    使用OpenCV转换函数:


    cvCvtColor(cimg,gimg,CV_BGR2GRAY); // cimg -> gimg



    直接转换:


    for(i=0;i<cimg->height;i++) for(j=0;j<cimg->width;j++) 
       gimgA[i][j]= (uchar)(cimgA[i][j].b*0.114 +
                            cimgA[i][j].g*0.587 +
                            cimgA[i][j].r*0.299);



  • 颜色空间转换:


    cvCvtColor(src,dst,code); // src -> dst

       code     = CV_<X>2<Y>
       <X>/<Y> = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

    e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab





绘图命令




  • 画长方体:
    // 用宽度为1的红线在(100,100)与(200,200)之间画一长方体
    cvRectangle(img, cvPoint(100,100), cvPoint(200,200), cvScalar(255,0,0), 1);



  • 画圆:
    // 在(100,100)处画一半径为20的圆,使用宽度为1的绿线
    cvCircle(img, cvPoint(100,100), 20, cvScalar(0,255,0), 1);



  • 画线段:
    // 在(100,100)与(200,200)之间画绿色线段,宽度为1
    cvLine(img, cvPoint(100,100), cvPoint(200,200), cvScalar(0,255,0), 1);



  • 画一组线段:
    CvPoint   curve1[]={10,10,   10,100,   100,100,   100,10};
    CvPoint   curve2[]={30,30,   30,130,   130,130,   130,30,   150,10};
    CvPoint* curveArr[2]={curve1, curve2};
    int       nCurvePts[2]={4,5};
    int       nCurves=2;
    int       isCurveClosed=1;
    int       lineWidth=1;

    cvPolyLine(img,curveArr,nCurvePts,nCurves,isCurveClosed,cvScalar(0,255,255),lineWidth);



  • 画内填充色的多边形:
    cvFillPoly(img,curveArr,nCurvePts,nCurves,cvScalar(0,255,255));



  • 添加文本:
    CvFont font;
    double hScale=1.0;
    double vScale=1.0;
    int     lineWidth=1;
    cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);

    cvPutText (img,"My comment",cvPoint(200,400), &font, cvScalar(255,255,0));

    Other possible fonts:


    CV_FONT_HERSHEY_SIMPLEX, CV_FONT_HERSHEY_PLAIN,
    CV_FONT_HERSHEY_DUPLEX, CV_FONT_HERSHEY_COMPLEX,
    CV_FONT_HERSHEY_TRIPLEX, CV_FONT_HERSHEY_COMPLEX_SMALL,
    CV_FONT_HERSHEY_SCRIPT_SIMPLEX, CV_FONT_HERSHEY_SCRIPT_COMPLEX,



opencv编程入门4




















矩阵操作



分配释放矩阵空间




  • 综述:

    • OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.

    • OpenCV将向量作为1维矩阵处理.

    • 矩阵按行存储,每行有4字节的校整.




  • 分配矩阵空间:
    CvMat* cvCreateMat(int rows, int cols, int type);

       type: 矩阵元素类型. 格式为CV_<bit_depth>(S|U|F)C<number_of_channels>.  
       例如: CV_8UC1 表示8位无符号单通道矩阵, CV_32SC2表示32位有符号双通道矩阵.

       例程:
       CvMat* M = cvCreateMat(4,4,CV_32FC1);



  • 释放矩阵空间:
    CvMat* M = cvCreateMat(4,4,CV_32FC1);
    cvReleaseMat(&M);



  • 复制矩阵:
    CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
    CvMat* M2;
    M2=cvCloneMat(M1);



  • 初始化矩阵:
    double a[] = { 1,   2,   3,   4,
                    5,   6,   7,   8,
                    9, 10, 11, 12 };

    CvMat Ma=cvMat(3, 4, CV_64FC1, a);

    另一种方法:


    CvMat Ma;
    cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);



  • 初始化矩阵为单位阵:
    CvMat* M = cvCreateMat(4,4,CV_32FC1);
    cvSetIdentity(M); // 这里似乎有问题,不成功





存取矩阵元素




  • 假设需要存取一个2维浮点矩阵的第(i,j)个元素.



  • 间接存取矩阵元素:
    cvmSet(M,i,j,2.0); // Set M(i,j)
    t = cvmGet(M,i,j); // Get M(i,j)



  • 直接存取,假设使用4-字节校正:
    CvMat* M     = cvCreateMat(4,4,CV_32FC1);
    int n        = M->cols;
    float *data = M->data.fl;

    data[i*n+j] = 3.0;



  • 直接存取,校正字节任意:
    CvMat* M     = cvCreateMat(4,4,CV_32FC1);
    int    step   = M->step/sizeof(float);
    float *data = M->data.fl;

    (data+i*step)[j] = 3.0;



  • 直接存取一个初始化的矩阵元素:
    double a[16];
    CvMat Ma = cvMat(3, 4, CV_64FC1, a);
    a[i*4+j] = 2.0; // Ma(i,j)=2.0;





矩阵/向量操作




  • 矩阵-矩阵操作:
    CvMat *Ma, *Mb, *Mc;
    cvAdd(Ma, Mb, Mc);       // Ma+Mb    -> Mc
    cvSub(Ma, Mb, Mc);       // Ma-Mb    -> Mc
    cvMatMul(Ma, Mb, Mc);    // Ma*Mb    -> Mc



  • 按元素的矩阵操作:
    CvMat *Ma, *Mb, *Mc;
    cvMul(Ma, Mb, Mc);       // Ma.*Mb   -> Mc
    cvDiv(Ma, Mb, Mc);       // Ma./Mb   -> Mc
    cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc




  • 向量乘积:
    double va[] = {1, 2, 3};
    double vb[] = {0, 0, 1};
    double vc[3];

    CvMat Va=cvMat(3, 1, CV_64FC1, va);
    CvMat Vb=cvMat(3, 1, CV_64FC1, vb);
    CvMat Vc=cvMat(3, 1, CV_64FC1, vc);

    double res=cvDotProduct(&Va,&Vb); // 点乘:    Va . Vb -> res
    cvCrossProduct(&Va, &Vb, &Vc);     // 向量积: Va x Vb -> Vc
    end{verbatim}

    注意 Va, Vb, Vc 在向量积中向量元素个数须相同.






  • 单矩阵操作:
    CvMat *Ma, *Mb;
    cvTranspose(Ma, Mb);       // transpose(Ma) -> Mb (不能对自身进行转置)
    CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0]
    double d = cvDet(Ma);      // det(Ma) -> d
    cvInvert(Ma, Mb);          // inv(Ma) -> Mb



  • 非齐次线性系统求解:
    CvMat* A   = cvCreateMat(3,3,CV_32FC1);
    CvMat* x   = cvCreateMat(3,1,CV_32FC1);
    CvMat* b   = cvCreateMat(3,1,CV_32FC1);
    cvSolve(&A, &b, &x);     // solve (Ax=b) for x



  • 特征值分析(针对对称矩阵):
    CvMat* A   = cvCreateMat(3,3,CV_32FC1);
    CvMat* E   = cvCreateMat(3,3,CV_32FC1);
    CvMat* l   = cvCreateMat(3,1,CV_32FC1);
    cvEigenVV(&A, &E, &l);   // l = A的特征值 (降序排列)
                             // E = 对应的特征向量 (每行)



  • 奇异值分解SVD:
    CvMat* A   = cvCreateMat(3,3,CV_32FC1);
    CvMat* U   = cvCreateMat(3,3,CV_32FC1);
    CvMat* D   = cvCreateMat(3,3,CV_32FC1);
    CvMat* V   = cvCreateMat(3,3,CV_32FC1);
    cvSVD(A, D, U, V, CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T

    标号使得 U 和 V 返回时被转置(若没有转置标号,则有问题不成功!!!).






视频序列操作



从视频序列中抓取一帧




  • OpenCV支持从摄像头或视频文件(AVI)中抓取图像.



  • 从摄像头获取初始化:
    CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0



  • 从视频文件获取初始化:
    CvCapture* capture = cvCaptureFromAVI("infile.avi");



  • 抓取帧:
    IplImage* img = 0; 
    if(!cvGrabFrame(capture)){               // 抓取一帧
       printf("Could not grab a frame\n\7");
       exit(0);
    }
    img=cvRetrieveFrame(capture);            // 恢复获取的帧图像

    要从多个摄像头同时获取图像, 首先从每个摄像头抓取一帧. 在抓取动作都结束后再恢复帧图像.  




  • 释放抓取源:
    cvReleaseCapture(&capture);

    注意由设备抓取的图像是由capture函数自动分配和释放的. 不要试图自己释放它.






获取/设定帧信息




  • 获取设备特性:
    cvQueryFrame(capture); // this call is necessary to get correct 
                            // capture properties
    int frameH     = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
    int frameW     = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
    int fps        = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
    int numFrames = (int) cvGetCaptureProperty(capture,   CV_CAP_PROP_FRAME_COUNT);

    所有帧数似乎只与视频文件有关. 用摄像头时不对,奇怪!!!.





  • 获取帧信息:
    float posMsec    =        cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);
    int posFrames    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);
    float posRatio   =        cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);

    获取所抓取帧在视频序列中的位置, 从首帧开始按[毫秒]算. 或者从首帧开始从0标号, 获取所抓取帧的标号. 或者取相对位置,首帧为0,末帧为1, 只对视频文件有效.




  • 设定所抓取的第一帧标号:
    // 从视频文件相对位置0.9处开始抓取
    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO, (double)0.9);

    只对从视频文件抓取有效. 不过似乎也不成功!!!






存储视频文件




  • 初始化视频存储器:
    CvVideoWriter *writer = 0;
    int isColor = 1;
    int fps      = 25;   // or 30
    int frameW   = 640; // 744 for firewire cameras
    int frameH   = 480; // 480 for firewire cameras
    writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),
                                fps,cvSize(frameW,frameH),isColor);

    其他有效编码:


    CV_FOURCC('P','I','M','1')     = MPEG-1 codec
    CV_FOURCC('M','J','P','G')     = motion-jpeg codec (does not work well)
    CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
    CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
    CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
    CV_FOURCC('U', '2', '6', '3') = H263 codec
    CV_FOURCC('I', '2', '6', '3') = H263I codec
    CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

    若把视频编码设为-1则将打开一个编码选择窗口(windows系统下).





  • 存储视频文件:
    IplImage* img = 0; 
    int nFrames = 50;
    for(i=0;i<nFrames;i++){
       cvGrabFrame(capture);           // 抓取帧
       img=cvRetrieveFrame(capture);   // 恢复图像
       cvWriteFrame(writer,img);       // 将帧添加入视频文件
    }

    若想在抓取中查看抓取图像, 可在循环中加入下列代码:


    cvShowImage("mainWin", img); 
    key=cvWaitKey(20);            // wait 20 ms

    若没有20[毫秒]延迟,将无法正确显示视频序列.




  • 释放视频存储器:
    cvReleaseVideoWriter(&writer);







原文地址 http://www.opencv.org.cn/forum/viewtopic.php?t=63&highlight=%E8%A7%86%E9%A2%91

opencv编程入门2

C程序实例




////////////////////////////////////////////////////////////////////////
//
// hello-world.cpp
//
// 一个简单的OpenCV程序
// 它从一个文件中读取图像,将色彩值颠倒,并显示结果.
//
////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>


int main(int argc, char *argv[])
{
   IplImage* img = 0;
   int height,width,step,channels;
   uchar *data;
   int i,j,k;

   if(argc<2){
     printf("Usage: main <image-file-name>\n\7");
     exit(0);
   }

   // 载入图像  
   img=cvLoadImage(argv[1]);
   if(!img){
     printf("Could not load image file: %s\n",argv[1]);
     exit(0);
   }

   // 获取图像数据
   height     = img->height;
   width      = img->width;
   step       = img->widthStep;
   channels   = img->nChannels;
   data       = (uchar *)img->imageData;
   printf("Processing a %dx%d image with %d channels\n",height,width,channels);

   // 创建窗口
   cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
   cvMoveWindow("mainWin", 100, 100);

   // 反色图像
   for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++)
     data[i*step+j*channels+k]=255-data[i*step+j*channels+k];

   // 显示图像
   cvShowImage("mainWin", img );

   // wait for a key
   cvWaitKey(0);

   // release the image
   cvReleaseImage(&img );
   return 0;
}





GUI命令



窗口管理




  • 创建并放置一个窗口:
       cvNamedWindow("win1", CV_WINDOW_AUTOSIZE); 
       cvMoveWindow("win1", 100, 100); // 以屏幕左上角为起点的偏移量



  • 读入图像:
       IplImage* img=0; 
       img=cvLoadImage(fileName);
       if(!img) printf("Could not load image file: %s\n",fileName);



  • 显示图像:
       cvShowImage("win1",img);

    可显示彩色或灰度的字节/浮点图像。 彩色图像数据认定为BGR顺序.




  • 关闭窗口:
       cvDestroyWindow("win1");



  • 改变窗口尺寸:
       cvResizeWindow("win1",100,100); // 新的宽/高值(象素点)






输入设备




  • 响应鼠标事件:

    • 定义鼠标handler:
         void mouseHandler(int event, int x, int y, int flags, void* param)
         {
           switch(event){
             case CV_EVENT_LBUTTONDOWN:
               if(flags & CV_EVENT_FLAG_CTRLKEY)
                 printf("Left button down with CTRL pressed\n");
               break;

             case CV_EVENT_LBUTTONUP:
               printf("Left button up\n");
               break;
           }
         }

         // x,y:    针对左上角的像点坐标

         // event: CV_EVENT_LBUTTONDOWN,    CV_EVENT_RBUTTONDOWN,    CV_EVENT_MBUTTONDOWN,
         //         CV_EVENT_LBUTTONUP,      CV_EVENT_RBUTTONUP,      CV_EVENT_MBUTTONUP,
         //         CV_EVENT_LBUTTONDBLCLK, CV_EVENT_RBUTTONDBLCLK, CV_EVENT_MBUTTONDBLCLK,
         //         CV_EVENT_MOUSEMOVE:

         // flags: CV_EVENT_FLAG_CTRLKEY, CV_EVENT_FLAG_SHIFTKEY, CV_EVENT_FLAG_ALTKEY,
         //         CV_EVENT_FLAG_LBUTTON, CV_EVENT_FLAG_RBUTTON,   CV_EVENT_FLAG_MBUTTON



    • 注册handler:
         mouseParam=5;
         cvSetMouseCallback("win1",mouseHandler,&mouseParam);







  • 响应键盘事件:

    • 键盘没有事件handler.



    • 直接获取键盘操作:
         int key;
         key=cvWaitKey(10); // 输入等待10ms



    • 等待按键并获取键盘操作:
         int key;
         key=cvWaitKey(0); // 无限等待键盘输入



    • 键盘输入循环:
         while(1){
           key=cvWaitKey(10);
           if(key==27) break;

           switch(key){
             case 'h':
               ...
               break;
             case 'i':
               ...
               break;
           }
         }






  • 处理滚动条事件:

    • 定义滚动条handler:
         void trackbarHandler(int pos)
         {
           printf("Trackbar position: %d\n",pos);
         }



    • 注册handler:
         int trackbarVal=25;
         int maxVal=100;
         cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal , trackbarHandler);



    • 获取滚动条当前位置:
         int pos = cvGetTrackbarPos("bar1","win1");



    • 设定滚动条位置:
         cvSetTrackbarPos("bar1", "win1", 25);








OpenCV基础数据结构



图像数据结构




  • IPL 图像:
    IplImage
       |-- int   nChannels;      // 色彩通道数(1,2,3,4)
       |-- int   depth;          // 象素色深:
       |                        //    IPL_DEPTH_8U, IPL_DEPTH_8S,
       |                        //    IPL_DEPTH_16U,IPL_DEPTH_16S,
       |                        //    IPL_DEPTH_32S,IPL_DEPTH_32F,
       |                        //    IPL_DEPTH_64F
       |-- int   width;          // 图像宽度(象素点数)
       |-- int   height;         // 图像高度(象素点数)

       |-- char* imageData;     // 指针指向成一列排列的图像数据
       |                        // 注意色彩顺序为BGR
       |-- int   dataOrder;      // 0 - 彩色通道交叉存取 BGRBGRBGR,
       |                        // 1 - 彩色通道分隔存取 BBBGGGRRR
       |                        // 函数cvCreateImage只能创建交叉存取的图像
       |-- int   origin;         // 0 - 起点为左上角,
       |                        // 1 - 起点为右下角(Windows位图bitmap格式)
       |-- int   widthStep;      // 每行图像数据所占字节大小
       |-- int   imageSize;      // 图像数据所占字节大小 = 高度*每行图像数据字节大小
       |-- struct _IplROI *roi;// 图像ROI. 若不为NULL则表示需要处理的图像
       |                        // 区域.
       |-- char *imageDataOrigin; // 指针指向图像数据原点
       |                           // (用来校准图像存储单元的重新分配)
       |
       |-- int   align;          // 图像行校准: 4或8字节校准
       |                        // OpenCV不采用它而使用widthStep
       |-- char colorModel[4]; // 图像色彩模型 - 被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;             // 该维内元素之间偏移量


    CvSparseMat // 稀疏N维数组



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




  • 标量:
    CvScalar
       |-- double val[4]; //4D向量

    初始化函数:


    CvScalar s = cvScalar(double val0, double val1=0, double val2=0, double val3=0);

    举例:


    CvScalar s = cvScalar(20.0);
    s.val[0]=10.0;

    注意:初始化函数与数据结构同名,只是首字母小写. 它不是C++的构造函数.






其他数据结构




  • 点:
    CvPoint       p = cvPoint(int x, int y);
    CvPoint2D32f p = cvPoint2D32f(float x, float y);
    CvPoint3D32f p = cvPoint3D32f(float x, float y, float z);
    例如:
    p.x=5.0;
    p.y=5.0;



  • 长方形尺寸:
    CvSize        r = cvSize(int width, int height);
    CvSize2D32f   r = cvSize2D32f(float width, float height);



  • 带偏移量的长方形尺寸:
    CvRect        r = cvRect(int x, int y, int width, int height);



OpenCV 编程入门1

OpenCV 编程入门


美国伊力诺理工学院计算机科学系Gady Adam


翻译:Mensch



2006年11月22日






内容






简介



OpenCV概述




  • 什么是OpenCV  

    • 开源C/C++计算机视觉库.

    • 面向实时应用进行优化.

    • 跨操作系统/硬件/窗口管理器.

    • 通用图像/视频载入、存储和获取.

    • 由中、高层API构成.

    • 为Intel®公司的 Integrated Performance Primitives (IPP) 提供了透明接口.




  • 特性:

    • 图像数据操作 (分配,释放, 复制, 设定, 转换).

    • 图像与视频 I/O (基于文件/摄像头输入, 图像/视频文件输出).

    • 矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD).

    • 各种动态数据结构(列表, 队列, 集, 树, 图).

    • 基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔).

    • 结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化).

    • 摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配).

    • 动作分析(光流, 动作分割, 跟踪).

    • 对象辨识 (特征方法, 隐马可夫链模型HMM).

    • 基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条).

    • 图像标识 (直线, 圆锥, 多边形, 文本绘图)




  • OpenCV 模块:

    • cv - OpenCV 主要函数.

    • cvaux - 辅助 (实验性) OpenCV 函数.

    • cxcore - 数据结构与线性代数算法.

    • highgui - GUI函数.






资料链接




  • 参考手册:

    • <opencv-root>/docs/index.htm




  • 网络资源:

    • 官方网页: http://www.intel.com/technology/computing/opencv/



    • 软件下载: http://sourceforge.net/projects/opencvlibrary/






  • 书籍:

    • Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006).




  • 视频处理例程 (位于 <opencv-root>/samples/c/目录中):

    • 色彩跟踪: camshiftdemo

    • 点跟踪: lkdemo

    • 动作分割: motempl

    • 边缘检测: laplace




  • 图像处理例程(位于<opencv-root>/samples/c/目录中):

    • 边缘检测: edge

    • 分割: pyramid_segmentation

    • 形态: morphology

    • 直方图: demhist

    • 距离转换: distrans

    • 椭圆拟合 fitellipse







OpenCV 命名约定




  • 函数命名:
         cvActionTarget[Mod](...)

         Action = 核心功能(例如 设定set, 创建create)
         Target = 操作目标 (例如 轮廓contour, 多边形polygon)
         [Mod]   = 可选修饰词 (例如说明参数类型)



  • 矩阵数据类型:
         CV_<bit_depth>(S|U|F)C<number_of_channels>

         S = 带符号整数
         U = 无符号整数
         F = 浮点数

         例:    CV_8UC1 表示一个8位无符号单通道矩阵,
               CV_32FC2 表示一个32位浮点双通道矩阵.



  • 图像数据类型:
         IPL_DEPTH_<bit_depth>(S|U|F)

         例:    IPL_DEPTH_8U 表示一个8位无符号图像.
               IPL_DEPTH_32F 表示一个32位浮点数图像.



  • 头文件:
         #include <cv.h>
         #include <cvaux.h>
         #include <highgui.h>  
         #include <cxcore.h>    // 不必要 - 该头文件已在 cv.h 文件中包含


    编译命令
    Linux系统:

    g++ hello-world.cpp -o hello-world \
         -I /usr/local/include/opencv -L /usr/local/lib   \
         -lm -lcv -lhighgui -lcvaux
    Windows系统:
    注意在项目属性中设好OpenCV头文件以及库文件的路径.

Monday 14 May 2007

累 && 上午 google&&下午 莫干山路50号 && 晚上whisk

好累,早上醒来,头又开始疼了,去上课,受不了,于是又回来了。。。。睡觉。。。。

 

决定,从这个世界消失。。。。。

 

昨天被一个jj 严厉批评,再回想起自己的一些行径,开始沉默。。。于是头又疼了。。。

 

我不过是放不下自己么?那么就让自己从这个世界消失好了。。。。。

 

我不过是看不透自己么?那么就让自己从这个世界消失好了。。。。。

 

好累,下午还要上课呢。。。。

 

还是要去多听听音乐,昨天的live太赞了,晚上睡觉前都是那段鼓,那段中号,那段萨克斯。。。。。然后把自己完完全全的relax。。。

 

我真的是因为自己太过于紧张了么?好吧,抒情结束,下面开始叙述

=======================================

 

上午11:30 google面试。。。感觉挺好,不像上一次头那么疼。。。洗了澡,吃一次羊肉串,深呼吸一下。。。。像上次一样。。。好紧张。。。然后进去写代码,好郁闷。。。不停的被挑错,不停的。。。。一开始还写了伪代码T.T. 感觉很不好,40分钟就出来了,没戏了。。跟google 88了

 

出来之后,记忆变得不连续,再吃羊肉串,到来福士广场,看到一帮小朋友在帮人拉票,加油好男儿?里面还有拉票会。。。。转了一圈,又出来,上车,头很晕,然后一些东西又记得不清楚了。。。回来,想了很久,去吃麻辣烫,只点了很少的,猛然发现,自己拿的东西这么的熟悉,吃了一点,一阵莫名的感觉,吃不下去了。。。

 

回寝室,跟tony聊了一会,tony 还是给我信心了,不过还是做好别的准备吧,sigh MS ms 也是一个不错的选择吧

===============================

 

然后cherry 打我电话,一起出发,到了北区,看了一位很白很白的jj,然后开始粤语聊着起来,到江湾镇,乘轻轨,到中谭路,yaonv 和unchained 从赤峰出发。。。先到中谭路,然后往南走,遇见了yaonv和unchained, 第一次见到真人,yaonv很pp,unchained很sg

,恩,然后3:00开始的show ,迟到了,yaonv和cherry两位开始聊,我跟unchained也边走边聊。。。后来cohiba来了,后来看到glr 和他的mm.






双城现代手工艺术馆,顾忠山 吉他手 ;alec 萨克斯; e.j.parker 贝司;whitcomb 小号;chris 鼓;还有中号 和 钢琴忘了,cohiba 跟我说过的。。。。cohiba对他们了解很多,而且kind and helpful。还有关于jz club的典故,发现他们真的活得很滋润,生活既是工作,工作即使乐趣。。。顾忠山的英文比中文好多了。。。。。

还是说歌吧,具体的手法和曲子好不好我也不懂,只能写些感受。。。。一开始yaonv还问我第一次来听的惯不惯,我觉得很好,第一次来,就融入了,真的很好,relax myself,还能感受很多。。。我觉得不尝试去理解,只是在喧嚣的节奏中去追随。。。也许可以触碰的到,在某一天,但是,生活就在背后。。。。其实我还是太过于紧张,太过于目的性。。。慢慢的单纯的只为了这音乐,为了这气氛。。。慢慢来的话,时间过得很快,然后,再慢慢来的话,神经可以放松,然后,再慢慢来的话,我想从这个世界消失。。。。我毕竟有我自己的风格,自己的路,自己的方向。。。。。remix love smile sex fear hate laugh sad sweet anger fuck  forget it。。。。。

忽然在想,台上的他们在演奏的时候,脑中想的是什么?台下的我们在听的时候脑中又想的是什么? 我记不得有好些时间我的脑中是什么东西,这一段段的空白,夹杂在丝丝清晰的思考之中,折磨着我。。。。i think ,and i need to know。。。。。three doors three keys 。。。。。

jazz的演出是一开始一段旋律,然后是即兴发挥,然后有以旋律结束,而这一次,是不断的向前推进。。。。我不是很理解,不过从我听的 amstrong的 玫瑰人生,ms是法语,以前写过的。。。就是这样重复的。。。。live 有个好处,可以看得清他们每个人的神情,之间的配合,上半场的时候在后面站着,靠在墙上,看对面的窗帘,在阳光的照射下,外墙的藤投在帘上的影子,随风摇曳;break后,做在前面,看得更加清晰,然后,直到最后,都很沉默,我想脑中还是时时的响起那些声响,好音乐而不求甚解。。。。如此而已

break的时候,四处转悠,拿了几张jz的宣传单,看了下周五有coco zhao 的专场。。想去。。。。要了一瓶水,解渴之后,开始品茶,品酒。。。那个调酒的看到我,居然问:are you a musician? 我真的想搞音乐的么?  sigh。。。。。后来他就向我不断吹嘘他的酒,问他要了两次,一次 红的,一次白的,感觉 白的比较舒服,不过cohiba以为白的太淡了。。。yaonv去搞到了顾忠山的qm ,坐在前排等待开始的时候,想一些东西,默默明明的。。。很沉默。。。maybe next time i can say more. 一个很可爱的外国小男孩,在上面打鼓,开心的。。。

出来后,在莫干山路四处逛,看了一些画展,一些艺术展,人很少,适合来看展览,想起5.4去上博,人真是多。。。sigh 到一个书吧去了,还有大库。。。很沉默,yaonv 与 cohiba 在聊着,风渐起,有些冷,沉默着,喜欢上了jazzblue。。。。喜欢上这样的一个地方

================================================

晚上,到常熟路,whisk,cherry 立刻尖叫。。。。真的很好吃么。。。不过没有吃到甜品,sigh......

挺好吃的,慢慢的慢慢的,躺在那里,很累很舒服的。。。。。

可惜还是要回寝室,还有project,还要提交。。。。

wv a busy day

Friday 11 May 2007

寓言&&面试&&抗战二十年

忽然想到一个很老的童话,忽然想起其中的一段,像是一段寓言。。。。
从前有一个恶魔,被神封印在一个瓶子里;
在第一个一千年,他立下誓言,如果谁把他从瓶子里救出来,他将会让他享尽世上的荣华,可是没有人来救他
在第二个一千年,他又立下誓言,如果谁把他救了,他就满足那个人的三个愿望,可是又一千年过去了。。。
在第三个一千年,他于是立下誓言,如果谁把他救了,他就把那个人杀掉。。。
============================

今天在joke版看到了麦兜的复旦清真版:)
一个mm在窗口与服务生的对话。
mm:一份刀削烩面
服务生:没有刀削面了
mm:那羊肉炒饭吧
服务生:没有羊肉了
mm:那有刀削牛肉面吗?
服务生:没有刀削面了
mm:那。。。新疆羊肉面
服务生:没有羊肉了
mm:。。。 。。。
==============================
今天去google面试了。。。过程还是很曲折的,自己也还是很紧张的,结果还是可以接受的,只是,毕竟,还是要等待。。。。
1:30的面试,早上6:00左右就醒了,脑子像爆炸了一般,赖到8:30起来,最近睡得一直不好,脑子里总归是被一些事情郁结着,无法把情绪很好的排解。。。sigh,也没法子,生活毕竟要继续,我不后悔。。。起来后,决定洗个澡,刷个牙,剃个胡子,脑中感觉清醒了一些。。。不想吃东西,在bbs上逛了一下,把成绩单和简历放到u盘中,准备打印,10点多了,头很晕了。。。很想躺倒什么都不要管。。。jessg去上课了,thx jesse的函数让我算专业课绩点:)tony fang也穿着一条underware 就过来了,恩,ws的 (//哈,看到了不要打我,tony,hoho) richardxj去上软工之前祝我们面试顺利,恩,我得早点去了,他们都是4:30的,应该是最后一批,而我算是第一批的(根据面试的时候,放了四瓶水,应该是有四场的:)打开千千静听,开始听 beyond 的歌,《抗战二十年》 这一段时间都十分十分迷恋这首歌。。。恩,我要有信心。。。关机,出发,走之前又收到钱大叔的祝福,恩:) 去打印,去乘123,发现没有零钱了,跑到伍缘去买了一瓶水,上车了。。。恩,有信心。。。可是头很晕,很晕。。。很饿了。。。车上很晕,对自己一点信心都没有,有想吐的感觉,好容易到了终点站,发现离南京西路蛮远的。。。看着时间还早,赶紧找吃的。。。来到大城小店,里面有kfc,想找厕所,发现没有。。。再在商场也没有找到厕所,怒了,于是决定先去找面试地点,可是这是哪里呢?四处看去,发现了上海市政府,还有上博,恩,5.4来过,于是沿着路先到人民广场地铁站,出来一看,发现丽笙大酒店就在地铁站旁边,早知道就直接地铁过来了,sigh....不过呢找路的时候,还是吃了两串羊肉,太饿了,5元一串,好好吃啊,好好吃啊,我面试完了又跑去吃了一串,回味一下。。。。于是进了新世界,发现了原来某次我一个人来过这个地方的,当时忘记了什么时候,回到寝室的时候,才想起来,有一次欧阳自远过来复旦讲座,然后拿了几张浦东的一个什么展览的门票,哦。。。。动漫展。。。。。好像又不是。。。sigh,这个展览真失败。。。。记得去到那的时候,发现那些人就在门口免费发票。。。怪不得我拉不到人去呢。。。。一会看完展览就去南京路逛,上海书城,然后在新世界的麦当劳吃的东西。。。。好久远的往事啊,离题了,离题了。。。。还是先上厕所。。。然后去kfc,因为看起来kfc至少跟外面有玻璃墙隔着。。。。吃着过程中,头晕好了些。。。吃真是很重要的,收到wendy的加油短信,恩,又有人给我信心了!!!!吃完饭,感觉自己好了些,在位子上坐了一下,平静一下,想一想自己要说些什么,还是紧张。。。。看到对面有一对情侣,甜蜜的样子,sigh。。。。。于是上去了,12:40进丽笙大酒店,那电梯构造得很奇怪。。。一个电梯上8楼,只有8020以后的房间,又下来一次,再换个电梯上去。。。。于是见到了传说中的google面试人员。。。。
他们ms正从房间出来,看到我突兀的出现,第一句话“你是学生吧”,第二句“你怎么来的这么早”,第三句“我们先吃饭去,你吃饭没有,一起吃饭去吧”。。。。然后跟着他们下去,在一楼的大厅,跟一些面试的人聊了一下,然后后来了一个黑衣服的mm,下到大堂里,问“有面试的人来?在哪呢?得快点吃饭了”,sigh,ms得快点吃饭是他们一样的反应。我起来跟她打个招呼,没想到。。。后面就是她来面我。。。然后他们吃饭去了,我一个人在大堂等候。。。然后shengchen 大牛出现,两个人聊了一会,看到他们陆续的回来了,就一起上去了,发现已经有一些人出现了,然后是签保密协议。。。要写身份证号。。。没带身份证,然后一向不记号码。。。引来发协议的mm的净化。。。sigh,最后写了学生证号。。。。然后一个gg带我们过去面试,恩,是那个黑衣服的mm,人挺好的,不过我还是很紧张。。。sigh。。不过头晕的感觉好多了。。。。
于是首先就跟我说,不要把题目泄露到bbs上去。。。然后是自我介绍。。。英文。。。一塌糊涂。。。。T.T. 以后得写个自我介绍的东西,背好。。。。然后说一下自己的项目经历。。。。好紧张。。。我的声音都在发抖。。。mm一个跟我说,别紧张,最后看到没有效果,我跟她都笑了。。。。不过她居然知道ShARE,虽然只是提一下。。。。也没有深入说下去,于是就问问题了。。。题目就是数据结构的东西,sigh我一开始给的算法太sb了,不过她说,it can work。。。要是不能work那不是太废了吗,于是说更好的,好,就写了一个更好的,顺便解释了各种排序。。。慢慢的,不紧张了,恩,想题目了,然后好像还忘了她是面试官。。。T.T. 然后一个好一点的算法。。。我怎么就那么喜欢二分呢。。。。让她明白了,然后更好的。。。恩,好吧,我知道了。。。好吧,我很废。。。。最后跟她讨论了很久的复杂度,发现是我错了T.T. 然后写代码。。。略过略过。。。。我好紧张啊。。。代码写的一塌糊涂。。。最后没有时间了,问了我一个很简单的问题,简单到,我一开始还重复了一遍问题,然后才告诉她答案。。。。sigh 丢人啊。。。。ms mm 在我写代码的时候一直上gmail,不是应该看着我么,T.T. 我很帅的啊,我今天最帅了,恩....T.T. 然后面试结束了,mm送我出房间,希望她可以给我一个好的分数吧,sigh,不过也尽自己的能力了,最后拿了一支google的纪念笔,恩,8错8错,说明我还得继续加强个人魅力,至少让面试的mm在我写代码的时候欣赏我吧,哈哈哈哈。。。。。T.T. 好吧,我精神错乱了,只能等待了。。。。

Saturday 5 May 2007

C++ throw catch try方法

#include<iostream>
#include <string>
using namespace std;
class Person
{
int age;
string name;
public:
void setAge(int);
void setName(string);
};
class Error
{
public:
virtual void show()=0;
};
class nameError:public Error
{
public:
void show() { cout<<"name is error"<<endl; }
};
class ageError:public Error
{
public:
void show() { cout<<"age is error"<<endl; }
};
void Person::setAge(int a)
{
ageError ag;
if(a<0||a>100) throw ag;
this->age=a;
}
void Person::setName(string str)
{
nameError ne;
if(str=="exit") throw ne;
this->name=str;
}

int main(void)
{
Person p;
try
{
p.setAge(0);
p.setName("exit");
}
catch(Error &er)
{
er.show();
}
cout<<"hello world"<<endl;
return 0;
}

Friday 4 May 2007

上博 美国艺术三百年

上午看了一场及其郁闷的比赛,sigh 心情都不大好了。。。

天气阴沉沉的,11:30出发,与人约好在人民广场见,先吃午饭再去看展览....

乘轻轨,到中山公园换二号线到人民广场,兜了一个大圈子,到一点钟才到,sigh,迟到了。。。

···························

在来福士吃的饭,解决以前敲得bg,哈哈哈哈

略去。。。。。吃饭过程。。。。。

 

······························

 

到了上博,居然还要排队买票,还好不是很长,大概十个人左右的样子,一会就买到票了,票真的很便宜啊,学生票,五块钱,可以参观所有的展厅。

展览馆的管理也很松散,除了特展以外的其他展厅都可以拍照,不过呢,特展就是 主要的“美国艺术三百年”了。。。进去之后看到保安很凶的叫一个女孩放下相机。

 

一开始先去看 那个 美国艺术三百年 了,后悔啊,没有要那个电子讲解的东西。。。进去的时候,还看到一个很pp很pp 的外国mm。。。和我们几乎同时参观的,后来在三楼又见到了一次。好吧,还是说展览,一楼的展厅ms 都是 油画,一开始殖民地时期,都是一些人物话,可惜啊,画面上的女的都不漂亮,男的都不帅,小孩都不可爱。不过有一个 拿着弓箭的小男孩的发型蛮好玩的,基本上么,那个时期,流传下来的作品都是些贵族,殖民者的闲着无聊在家呆着,就叫画家来画画,画画自己,来当成传家之宝之类的,其他题材的很少。。。看着画展,同去的wendy说:这画画的人多累啊。。。我回答说:其实被画画的人更累,得坐着不动好几小时呢。。。后来嘛,就是华盛顿,还有一些独立战争的将军的画,有一张华盛顿的在历史书上出现过,另外一张是华盛顿壮年时的吧,站在战场上。。。可惜能看到明显凸起的肚子,破坏了美好形象啊,sigh

 

之后看到了印第安人的一张油画,一个苍老的男人。。。一个衰败的民族。又流连地扫过一些油画,ms 到了南北战争时期,有一张兵营的图片,两个战士,一蹲一站,目看远方,背景是一些兵,一个帐篷,似乎是结束了一场战争。。。后面还有一幅,蛮有意境的,一株枯木,在荒凉的大地斜立着,背景是橘红的天,空气似乎被扭曲了,然后看着,那枯木像是旗杆,而那空气幻化成国旗。。。一张苍凉的气息。

 

又扫过一些作品,ms 到了1900年的样子,有一张静物油画很不错,一扇紧闭的窗,那种很老很老的窗,似乎结满尘埃,又似乎将要推开。。。那后面的画框做成木头的样子,配合的很不错。。。然后一个展厅玩了,我抱怨不是三百年么,还有一百年呢,还是先看看别的展厅吧。。。于是一个一个的看,先是 青铜器,发现好多好多的酒器;然后是雕塑,都是佛像;还有陶瓷,有一套白瓷真的很好很好,不过清朝的陶瓷已经不喜欢了,感觉太俗;还有钱币,好多好多古钱,我要是有一个就爽了;还有书法,还有国画,还有家具,还有印章,还有少数民族服饰。。。。take many many photos

 

然后在二楼发现了美国剩下的一百年。。。一进去就是现代风格的了,sigh,看不懂,还有很多“无题”。。。把太多的元素挤压在一起,注重于形式。。。。不过还是有几张很灵的,有一幅是把一副好的城市的油画(or 照片)给加了噪音。。。有一副是有一些旧胶卷的效果。。。后面还有一些是雕塑吧,或者说是把一些东西摆在一起,透露出形式的冷冷的面具。。。

 

·········································

 

看完这个已经4:20了,发现速度真的挺惊人的,没有时间好好看看,蛮多跑马观花的,不过还是很好玩的:)

Thursday 3 May 2007

GDI+中GIF图片的显示

http://www.vckbase.com/document/viewdoc/?id=1535








一、GIF格式介绍


1.概述


  GIF(Graphics Interchange Format,图形交换格式)文件是由 CompuServe公司开发的图形文件格式,版权所有,任何商业目的使用均须 CompuServe公司授权。
  GIF图象是基于颜色列表的(存储的数据是该点的颜色对应于颜色列表的索引值),最多只支持8位(256色)。GIF文件内部分成许多存储块, 用来存储多幅图象或者是决定图象表现行为的控制块, 用以实现动画和交互式应用。GIF文件还通过LZW压缩算法压缩图象数据来减少图象尺寸。


2.GIF文件存储结构


  GIF文件内部是按块划分的,包括控制块( Control Block )和数据块(Data Sub-blocks)两种。控制块是控制数据块行为的,根据不同的控制块包含一些不同的控制参数; 数据块只包含一些8-bit的字符流,由它前面的控制块来决定它的功能,每个数据块大小从0到255个字节, 数据块的第一个字节指出这个数据块大小(字节数), 计算数据块的大小时不包括这个字节,所以一个空的数据块有一个字节,那就是数据块的大小0x00。 下表是一个数据块的结构:











































BYTE76543210BIT
0

块大小


Block Size - 块大小,不包括这个这个字节(不计算块大小自身)
1 Data Values - 块数据,8-bit的字符串
2
...
254
255

  一个GIF文件的结构可分为文件头(File Header)、GIF数据流(GIF Data Stream)和文件终结器(Trailer)三个部分。文件头包含GIF文件署名(Signature)和版本号(Version);GIF数据流由控制标识符、图象块(Image Block)和其他的一些扩展块组成;文件终结器只有一个值为0x3B的字符('';'')表示文件结束。下表显示了一个GIF文件的组成结构:




























































GIF署名文件头
版本号
逻辑屏幕标识符GIF数据流
全局颜色列表
...
图象标识符图象块                               
图象局部颜色列表图
                             基于颜色列表的图象数据
...
GIF结尾文件结尾

  下面就具体介绍各个部分:


文件头部分(Header)


GIF署名(Signature)和版本号(Version)

GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:"GIF";文件版本号也是由三个字节组成,可以为"87a"或"89a".具体描述见下表:











































BYTE76543210BIT
1''G''GIF文件标识
2''I''
3''F''
4''8''GIF文件版本号:87a - 1987年5月
        89a - 1989年7月
5''7''或''9''
6''a''

GIF数据流部分(GIF Data Stream)


逻辑屏幕标识符(Logical Screen Descriptor)

这一部分由7个字节组成,定义了GIF图象的大小(Logical Screen Width & Height)、颜色深度(Color Bits)、背景色(Blackground Color Index)以及有无全局颜色列表(Global Color Table)和颜色列表的索引数(Index Count),具体描述见下表:




















































BYTE76543210BIT
1逻辑屏幕宽度像素数,定义GIF图象的宽度
2
3逻辑屏幕高度像素数,定义GIF图象的高度
4
5mcrspixel具体描述见下...
6背景色背景颜色(在全局颜色列表中的索引,如果没有全局颜色列表,该值没有意义)
7像素宽高比像素宽高比(Pixel Aspect Radio)

m - 全局颜色列表标志(Global Color Table Flag),当置位时表示有全局颜色列表,pixel值有意义.
cr - 颜色深度(Color ResoluTion),cr+1确定图象的颜色深度.
s - 分类标志(Sort Flag),如果置位表示全局颜色列表分类排列.
pixel - 全局颜色列表大小,pixel+1确定颜色列表的索引数(2的pixel+1次方).


全局颜色列表(Global Color Table)

全局颜色列表必须紧跟在逻辑屏幕标识符后面,每个颜色列表索引条目由三个字节组成,按R、G、B的顺序排列。




















































BYTE76543210BIT
1索引1的红色值
2索引1的绿色值
3索引1的蓝色值
4索引2的红色值
5索引2的绿色值
6索引2的蓝色值
7...                              

图象标识符(Image Descriptor)
~~~~~~~~~~~~~~~~~~~~~~~~~
一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,图象标识符以0x2C('','')字符开始, 定义紧接着它的图象的性质,包括图象相对于逻辑屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小, 由10个字节组成:














































































BYTE76543210BIT
100101100图象标识符开始,固定值为'',''
2X方向偏移量必须限定在逻辑屏幕尺寸范围内
3
4Y方向偏移量
5
6图象宽度
7
8图象高度
9
10misrpixelm - 局部颜色列表标志(Local Color Table Flag)
置位时标识紧接在图象标识符之后有一个局部颜色列表,供紧跟在它之后的一幅图象使用;值否时使用全局颜色列表, 忽略pixel值。
i - 交织标志(Interlace Flag),置位时图象数据使用交织方式排列 (详细描述...),否则使用顺序排列。
s - 分类标志(Sort Flag),如果置位表示紧跟着的局部颜色列表分类排列.
r - 保留,必须初始化为0.
pixel - 局部颜色列表大小(Size of Local Color Table),pixel+1就为颜色列表的位数

局部颜色列表(Local Color Table)

如果上面的局部颜色列表标志置位的话,则需要在这里(紧跟在图象标识符之后)定义一个局部颜色列表以供紧接着它的图象使用,注 意使用前应线保存原来的颜色列表,使用结束之后回复原来保存的全局颜色列表。如果一个GIF文件即没有提供全局颜色列表,也没有提供局部颜色列表, 可以自己创建一个颜色列表,或使用系统的颜色列表。局部颜色列表的排列方式和全局颜色列表一样:RGBRGB......


基于颜色列表的图象数据(Table-Based Image Data)

由两部分组成:LZW编码长度(LZW Minimum Code Size)和图象数据(Image Data)。

































BYTE76543210BIT
1LZW编码长度LZW编码初始码表大小的位数,详细描述见LZW编码...
 

 



...
图象数据,由一个或几个数据块(Data Sub-blocks)组成

数据块

...

GIF图象数据使用了LZW压缩算法(详细介绍请看后面的『LZW算法和GIF数据压缩』),大大减小了图象数据的大小。图象数据在压缩前有两种排列格式:连续的和交织的(由图象标识符的交织标志控制)。连续方式按从左到右、从上到下的顺序排列图象的光栅数据;交织图象按下面的方法处理光栅数据:


创建四个通道(pass)保存数据,每个通道提取不同行的数据:
第一通道(Pass 1)提取从第0行开始每隔8行的数据;
第二通道(Pass 2)提取从第4行开始每隔8行的数据;
第三通道(Pass 3)提取从第2行开始每隔4行的数据;
第四通道(Pass 4)提取从第1行开始每隔2行的数据;


下面的例子演示了提取交织图象数据的顺序:













 通道1  通道2  通道3  通道4 
0   

basic instinct

好天气,看一部好电影,让心情像水一样流淌

 

好吧,又出现了小插曲。。。把茶壶的嘴给摔碎了,sigh

 

看basic instinct, 不明白,即使到了影片最后,还是有很多疑问sigh

 

也许她们都是凶手,也许都不是。。。

 

在某一瞬间,我还以为beth 和 cartherine 是合谋者。。。

 

可怜的 道格拉斯。。。

 

不过 这个电影的真空,倒确实是一部好电影的先决条件,把所以都说明白了,就没有意思了

············································

裙子和电影里的真空
贾谬 发布于:2006-09-13 14:31





引用网址http://www.mtime.com/my/109456/blog/296144/

   <<裙子和电影里的真空>>


警察局,警官,“这里不允抽烟。”

“你要起诉我在这里抽烟吗?”莎朗斯通在<<本能>>中说的这句台词,你也许不记得了,但你也许记得―――当时她是真空上阵,裙子里什么也没有,只有赤条条坦荡荡的身体。

最经典的镜头是莎姐在警官面前突然分开交叉的双腿,凝固了讯问室的空气和警官张开的嘴巴,也让无数观众想入非非。

看过<<本能>>之后,我就计划不再看毛片了,我喜欢这种想象力被放飞的感觉。



<<本能>>这整部影片,可以说多层次多角度地放飞了我的想象力和思维。

影片是从一个连环杀人案入戏的―――一个和市长有私交的摇滚乐手,双手被白丝巾绑在床上,赤裸的身体被冰锥刺出N个窟窿,显然是在做爱时被害的。

连环杀人案在美国已经算不上希罕,估计警方的卷宗也有几柜子了,影片<<七宗罪>>震撼过观众,新闻报道我们却已经见怪不怪。

和<<七宗罪>>不同,<<本能>>在影片开始就扯出了嫌疑犯,这也说明影片并不是要讲一个离奇的案子。当然如果你只满足于心弦绷紧,制片人也欢迎你去买电影票,导演态度我不知道。

就像今天的<<无极>>,人家陈导一直是很严肃很大气的,但如果你只想看热闹不想探究命运爱情自由等等也无所谓,关键是你掏口袋买票,关键是扩大中国电影的市场。

在等待揭晓凶手的过程中,影片已经给观众开了个大大的玩笑。

性商正常的人都会认为道哥会爱上莎姐,受过良好教育的人也会坚信,道哥不会因为私情置警察的神圣职责于不顾。所以,很多人期待着情节在爱与正义的冲突中紧绷绷地展开。

但是,在影片中部嫌疑转到另一个女人身上。还好,这个女人也和道哥上过床,而且为了道哥甘愿在工作上犯下小小的原则上的错误。

就在观众期待道哥细细地秀一下思想和情感的挣扎表演时,情节突然进入了高潮―――凶手杀了道哥的朋友兼同事胖警察。

这个胖子是影片中不多的暖色调,他因为朋友去和一个危险的女人上床而大动肝火,他在餐厅里指责朋友毫不避讳污言秽语向食客吐出舌头,他的愿望只是能得到全额退休金和一块镀金的精工表… …我一直不明白凶手为什么要杀他,他没和凶手上过床,他的破案水平也不会对凶手形成威胁。他是不是替道哥死的,凶手想杀道哥但她真的爱上了他,这个世界从来不缺替罪羊存在的理由。



当道哥干掉了曾经为了他甘愿做伪证的女同事,我松了一口气―――案子结束了,一部爱情片诞生了。

要命的是,女同事睡衣口袋里没有枪,而是一串见证过他们恋情的钥匙;更要命的是,女同事临死给道哥说了句哀拉吾又。

莎姐在床上问道哥以后怎么办,道哥说疯狂做爱像老鼠一样活着。这种对话很像发生在两个在逃犯身上,或者两个联合做了坏事的人。

但这只是感觉,甚至算不上猜测。影片给了我们太多不确定的东西,像裙子里的真空一次次放飞了观众的想象和思维。



而确定的真空恰恰给了我们丰富的可能性。这让我想起米兰昆德拉论述的小说的艺术。

堂吉诃德究竟是个浪漫骑士还是个解放全人类的红卫兵?包法利夫人究竟应该嘲笑还是值得同情?默而索为什么要干掉海滩上的阿拉伯人还送给尸体四颗子弹?昆德拉说小说的精神是复杂性,每部小说都在告诉读者:“事情要比你想象的复杂。”

可以说,<<本能>>这部影片漂亮地展示了小说的艺术。



每次道哥和莎姐缠绵到高潮,镜头切换的瞬间,一种可能性就变成清晰的影像进入我脑海―――道哥身上长满洞孔,鲜血染红了床单,白丝巾白丝巾,冰锥冰锥。

当我发现影片给我的镜头是道哥莎姐相拥而卧,我感觉到一种来自人性深处的温暖。但我始终无法阻止另一种可能性进入我的想象。

直到影片最后,当莎姐占据统治性的体位,当她拿出雪白的白丝巾,当她高速进入高潮,当她的双手探向床外,这时的道哥已经被绑在了床头甚至闭上了眼睛,那种可能性以更强烈的势头要去除我脑海和镜头间的距离。

结果依然是道哥莎姐相拥而卧,一种温暖结束了我颤抖的神经。

你以为这样人性中美好的东西就胜利了吗?爱情就这样胜利了吗?影片最后一个镜头是那把冰锥,请注意这把冰锥是在床下,在一个莎姐够不着的位置,在一个很显眼的不可能原来就在的位置。它是不是因为意外从床下掉下来的,如果没有这次意外,如果莎姐在高潮时抓到了这把冰锥… ….

我们不知道答案,就像我们不知道生活要把我们带往何方,就像我们不知道裙子里的内容。

Tuesday 1 May 2007

五一快乐

everyone

王子与公主的后来 【zt张佳玮】


 

给孩子讲故事是件苦差,因为他们对结局总不满意。当故事开始时活色生香的主角或生或死的演完戏码之后,他们还是会把一些讲述者自己都没在意的细节寻找出来,真诚的追问:“那后来呢?”如果你讲完一个最完美不过的故事——巫婆被扔进了白菜窖,黑心后妈皇后变成了黑夜枭,魔鬼被封进了瓶子扔进了大海,王子和公主十指相扣,接受百姓的婚礼祝福。“他们从此快乐的生活在一起了。”孩子还是会在满意叹嘘、俨然刚吃完奶油蛋糕的幸福表情之后,加一句:“后来呢?”
大多数讲故事的人都颇为善良,大多数给孩子听的故事结尾——除非有意为之——都并不令人哀伤。但总在某个时刻,你必须充当一个残忍的报幕者,用圆润的声调宣布一个幸福的结尾,然后预备回答:“以后嘛,他们就过着幸福的生活了……至于怎么幸福,这个可没法说了,书上也没有写呀。”把孩子们的不满足移到书本上。你很难不动声色的让孩子们明白,白雪公主和王子终成眷属之后的生活不像她被后妈不断谋害的过程那么有趣——至少对旁观者而言。聪明的故事讲述者总在最合适的时间画上句号,而将此后的漫长时间用一两句话来做结。这足够使人产生两种错觉。对乐观者来说,幸福是绵无绝期的。对悲观者来说,幸福是转瞬即逝的。因为故事在某个时间结束,未来则茫无可知。
把棋子、铅笔和地球仪放进写字台抽屉,然后开始读书架上某一些厚厚的书,并且推开大门,与那些日渐与自己一样高的人们一起游历——这是大多数孩子必经的旅程。随后——或迟或早——会发现鸟儿并不会说话,河马并不会发笑。宝剑、盔甲和仙人的神药并不都放在王子的脚边,供他随意挑选。恶魔不都是白痴,会被渔夫骗进瓶里。你见到的第一个灰姑娘并不总是乔装改扮的公主。你在草地里见到的绿色并不都是翡翠,有许多无非是螳螂。回过头来,记载着王子与公主的那一页已经被指尖翻烂,蜡笔所临摹的神话图景像旧照片一样泛出黄昏时刻云的颜色了。以前讲故事的人头发白了。
《射雕英雄传》中,周伯通对郭靖的人生自我介绍颇为满意。“你给我讲了个不错的故事。”郭靖傻孩子性子发作,回一句:“我说的都是真事,不是故事。”老顽童道:“那有什么分别?倘若一个人一生都是吃喝拉撒,我听得闷也闷死了。”很久以前,我外婆也喜好用带着无锡乡音的声调,讲她自己的故事。她记性不好,一个故事经常像长了翅膀一样,东游西荡,来来往往。有许多重复的人和事件,有许多相似的笑料。每当我对她海草一样纠结的故事予以疑问时,她会毫不犹豫的坚持自己的讲述。“是我讲还是你讲哪?”她不容置疑的说,随即又开始周而复始的讲述。许多时候,她一旦高兴便会结束一个故事。“呐,讲完了。”当我问她:“后来呢?”她就指指自己肥胖的身体说:“喏,就是现在这样。”
这种奇妙的扼杀“后来怎么样”的方法令我印象深刻。于是当我望着外婆时,常会想起她故事中那个年轻的女主角来。这种沧海桑田,和《泰坦尼克号》里头百岁上下的老太太女主角对电话骄傲说出“那图画中的美女就是我”效果类似。当老太太说出那骗了全世界海洋般眼泪的爱情故事时,你可以看到故事结束后八十多年后她的模样。而这八十年的时间隐藏在寥寥数句话中。“后来怎么样?”关于传世爱情的三天过去之后,便是整个另一故事了。
德国人出产哲学家和古典音乐家之余,同样不缺聪明的讲故事者。《格林童话》里有着灰姑娘之类的经典故事,而在最后,当讲述者说完“他们于是快快乐乐的在一起了。”还补充了一句“一直到死”。这是典型的德国人作风。就像一只手按住了琴键,没有余音。他们告诉你,曲子结束了,有人喜欢在余曲中跳舞,但他们却在提醒你,最后你总是得离场。
所以杨过和小龙女的故事,在他们十六年后相聚,惊鸿一瞥之后便再无下文,衣袂飘然没入行云之中。王子和公主们的“后来”总有一天会慢慢现出本来面目。有一天一切将会真相大白:被轻易击倒的魔鬼、及时赶到的白马王子,以及慈和善良的仙人。那时出外游历的孩子将长大,并且步履沉稳的走着,回想起小时候的故事书。那里面记载着完美的童话,记载着神仙眷属永不褪色的爱情,记载着不会老去、永享幸福的王子与公主。