2011年2月28日星期一

什么是一顿优质的早餐

前几天很偶然地翻阅了一本杂志《时尚健康女士》2011第一期,有一个关于早餐的专题,觉得还不错,这里做一个非常简单的记录。
什么是一顿优质的早餐,其实很简单:

1.早餐要占全天能量的1/3
从能量供应的角度,早,中,晚餐的合理比例应为,30:40:30,也就是说,早餐的能量摄取应为1/3。其中,碳水化合物最好为50%,蛋白质为15%,脂肪为35%。

2.保证摄取3类以上的食物
谷类,蔬菜和水果,鱼肉,奶类和蛋类。
如果有以上几类中的3类,那么这样的早餐是达标的。

3.落实4种营养搭配原则
其实就是:有干有稀,有荤有素,有粗有细,有菜有肉。

中医专家推荐养生的早餐法则
1.早起不适合吃寒性水果
因为中医的观点,清晨,身体的阳气是和太阳一样逐渐生发的,吃寒性水果会抑制体内阳气生发。大多数水果是寒性的,例如香蕉,西瓜,李子等等。其实可以吃吃中性的苹果,热性的水果例如木瓜其实就很适合做早餐的搭配。
2.早餐的组合中如果有一碗粥,很养生

2011年2月12日星期六

将Qt Application Project改成Qt Library Project

很久没有写一些关于Qt的东西,今天介绍一个小方法将Qt Application Project 改成Qt Library Project。
换句话来说,如果原来使用的是Qt项目,生成exe,后来想要将这个项目生成DLL,那么简单的改变方法如下(在VS2008中):

在project的设置里(没有什么特别的步骤,唯一请注意第三部):

1) 定义一个macro 对于Qt,DLL export,写一个头文件(但是也是可以直接使用Q_DECL_EXPORT,类似和Qt的DLL project自动生成头文件一样。

#ifndef MYGLOBAL_H
#define MYGLOBAL_H 

#include <QtCore/qglobal.h> 

#ifdef MYLIB_LIB
# define MY_EXPORT Q_DECL_EXPORT
#else
# define MY_EXPORT Q_DECL_IMPORT
10 #endif 
11
12 #endif // MYGLOBAL_H 

2) 将Project的Configuration Tpye改成Dynamic Library (.dll)

3) 修改Prprocessor Definitions设定:
MYLIB_LIB
QT_DLL

4) linker-->Ouput File 改成生成.dll

5) 在我们想要export的class加入上面写的头文件
和一般dll export类似,只是我们这里使用的是我们定义的export的macro

1 class MY_EXPORT MainWindow : public QMainWindow 

 

附注
如果只是简单的使用__declspec(dllexport) ,而不是使用Qt的export DLL的macro,如果使用生成的DLL会出现类似这样的错误。
error LNK2001: unresolved external symbol "public: static struct QMetaObject const XXX::staticMetaObject"
非常简单来说,Qt的object比较特殊,不能直接通过常用的__declspec(dllexport)进行export。

2011年2月10日星期四

数字图像处理笔记(2)

继续记录Digital Image Processing一些重要的概念,关于图像解析度,以实用知识为主。

逐行扫描(Progressive scan):每一帧图像由电子束顺序地一行接着一行连续扫描而成,这种扫描方式称为逐行扫描。
隔行扫描(Interlaced scan):每一帧图像通过两场扫描完成则是隔行扫描,两场扫描中,第一场(奇数场)只扫描奇数行,而第二场(偶数场)只扫描偶数行。隔行扫描技术在传送信号带宽不够的情况下起了很大作用,逐行扫描和隔行扫描的显示效果主要区别在稳定性上面,隔行扫描的行间闪烁比较明显,逐行扫描克服了隔行扫描的缺点,画面平滑自然无闪烁。在电视的标准显示模式中,i表示隔行扫描,p表示逐行扫描。[1]

 

有用小常识:
a) 视觉惰性(视觉暂留特性):每秒换帧24次,人会产生连续感。
b) 图像的闪烁感:人在较低频率的光脉冲刺激下,会产生一明一暗的闪烁感,这是有光和无光在亮度感觉上的差别所致。把闪烁的频率提高到临界闪烁频率(45.8Hz)以上,由于视觉惰性的作用就感觉不到闪烁了。电影的帧频为24,其实也写成24p(电影胶片),利用光活门,使每帧画面闪亮两次,达到每秒闪亮48次,超过临界闪烁频率。
c) 场频率:如使用隔行扫描,就会有场频率一说,就是一帧图像分两场传输,常见的60Hz,50Hz对应的帧频率就是30,25。
d) 我们常见的1080i50就是1920×1080像素,每秒50个场的速度交织编码(25帧)[3]。
e) PAL和NTSC
50i(PAL):全名为逐行倒相 (Phase Alternating Line)。每秒25帧,隔行扫描的电视广播格式。[4]
60i(NTSC):属于同时制,每秒60/1.001场。但存在相位容易失真、色彩不太稳定的缺点。NTSC标准的帧幅为每秒30帧。[5]
f) 数字电视,传统的PAL和NTSC陆续被淘汰,取而代之的是数字电视,数字电视其实就是将画面信号经数位化处理后,变成一串数据资料,再经数位调变传送到家。
简单的说,数字电视的成功,主因是视频压缩技术的发展。国际统一的压缩标准是MPEG-2,在传统无线电视台600万赫兹频宽的电视频道中,可传送1080条水平扫描线的高画质电视(HDTV高清晰度电视)。它同时也提供杜比的AC3级高级音响效果。

 

高清的播放分辨率有 3 种:
768i (i 表示隔行扫描)
1080i(i 表示隔行扫描)
1080p(P 表示逐行扫描)

 

HDTV高清晰度电视(High Definition Television)的扫描格式共有 3 种[2]:
1280×720p
1920×1080i
1920×1080p
中国采用的 1920×1080i/50Hz。
全高清分辨率为1920×1080的高清信号。

例如,不做任何压缩:
高清640*480的彩色图像,每秒30帧,则一秒钟的数据量为:
640*480*24*30 = 221.12 M
NTSC视频信号720*480,每秒30帧,则一秒钟的数据量为:
720*480*24*30 = 248.83 M
高清1920x1080的彩色图像,每秒30帧,则一秒钟的数据量为:
1920*1080*24*30 = 1492992000 bit =  1.5 G
-->
必须对视频信号进行编码压缩[2]。

 

注意,我们有可能搞混的是
a)在描述数据传输时的计算如下(In some cases when used to describe data transfer rates bits/bytes are calculated as in the metric system as follows):
1 MB = 1,000,000 bits/bytes
1 kb = 1,000 bits/bytes
1 bit/byte

b)在描述数据储存是的计算如下(In the cases when used to describe data storage bits/bytes are calculated as follows):
1 byte = 8 bits
1 kilobyte (K / Kb) = 2^10 bytes = 1,024 bytes
1 megabyte (M / MB) = 2^20 bytes = 1,048,576 bytes
1 gigabyte (G / GB) = 2^30 bytes = 1,073,741,824 bytes
1 terabyte (T / TB) = 2^40 bytes = 1,099,511,627,776 bytes
1 petabyte (P / PB) = 2^50 bytes = 1,125,899,906,842,624 bytes
1 exabyte (E / EB) = 2^60 bytes = 1,152,921,504,606,846,976 bytes

附注:在数据通信中, 1 kilobit 是 1000 bits。它通常用于测量是在一秒钟两个通信点之间传输的数据量。千比特每秒,通常缩写为Kbps。

 

下一篇笔记将关于,数据冗余,编码压缩。

 

参考资料:
[1] 逐行扫描与隔行扫描: http://baike.baidu.com/view/115294.htm
[2] 数字图像处理(第2版),Rafael C.Gonzalez / Richard E.Woods,电子工业出版社
[3] 高清晰度电视: http://zh.wikipedia.org/zh-cn/高清晰度电视
[4] PAL制式:http://zh.wikipedia.org/zh/PAL制式
[5] NTSC制式:http://zh.wikipedia.org/zh/NTSC制式

2011年2月8日星期二

数字图像处理笔记(1)

最近的一些研究涉及了数字图像处理。这里我准备开一个小小的系列,放入我最近的一些学习的笔记。


Digital Image Processing是一个很有趣的领域。接下来我按照我的喜好,记录一些重要的概念。

我们大概都知道,在计算机中,静态的图像有两种表达形式:
矢量图,vector based image
位图,bit mapped image,(位图里又有灰度图(grap scale image),彩色图(color image))

矢量图,顾名思义,也就是可以用计算机的指令来描述的,图像中的每一的元素都可以使用数学表达式来实现。所有一个矢量图会由很多的数学表达式来进行描述。我们常常使用最简单的visio就可以做矢量图,当然了adobe illustrator是一个做矢量图的利器。
矢量图有很多优点,1.可以进行不失真的缩放,2.可以容易的移动复制,甚至旋转,3.矢量图产生的数据量比较小。
矢量图的一个很明显的缺点是使用场合有所限制,因为很多复杂的图像无法使用数学表达式来描述。

位图,计算机中最广泛使用,其实就是一幅图由很多的像素(也可以说是由像素矩阵)组成的。
每一个像素pixel其实在计算机里就是由一定长度的数字值来表示它的颜色和亮度。如果单位面积内的像素越多,那么分辨率就越高,所显示的图像就会接近于真实物体。
如果图像的深度越高,或是图像的分辨率越高,那么位图的大小就越大。
色彩深度,色彩深度又叫色彩位数,即位图中要用多少个二进制位来表示每个点的颜色,是分辨率的一个重要指标,例如16位(增强色),24位和32位等。
例子:
例如一个图像,RGB三个分量,每个8位,一共就是24位,像素的深度为24,每个像素就是2的24次方就是16777216的一种,其实人是无法分辨这么多颜色的。

位图常用的编码方式有:
RGB,红、绿、蓝三原色的光学强度。
CMYK,用青、品红、黄、黑四种颜料含量来表示一种颜色

常常还有Alpha通道,也就是增加像素的透明度信息。

 

我们常常见到的图像格式有:
BMP(Bitmap Image File or Device Independent Bitmap (DIB) file format or simply a Bitmap)
GIF(Graphics Interchange Format)
PNG(Portable Network Graphics)
JPEG(Joint Photographic Experts Group),附带提一下它是基于Discrete Cosine Transform离散余弦变换,转换到频率空间,JPEG有选择地选择数据来压缩文件,会丢弃一些数据,使用是有损压缩。

参考资料:
http://zh.wikipedia.org/zh-cn/%E5%83%8F%E7%B4%A0
http://zh.wikipedia.org/zh/%E4%BD%8D%E5%9B%BE

http://zh.wikipedia.org/zh/Jpeg
http://zh.wikipedia.org/zh/Bmp
http://zh.wikipedia.org/zh/Png
http://zh.wikipedia.org/zh/GIF

2011年2月2日星期三

年末随笔 -- 我也来谈谈“真正的学习”

前几天,我看了武志红的一篇文章《真正的学习》。看完之后真是非常有感触。
里面谈到了顿悟,模仿学习永远是跟在别人的后面,而顿悟,却永远是崭新的。即便你顿悟到的一个发现可能是无数人都发现的,但对你而言,这是崭新的,而且真的是你自己发现的。

其实我一贯成绩不佳,特别是高中尤其差,高中的时候几乎从来没有完成过作业,我其实非常讨厌做题,做的也非常慢,高中的时候几乎一半的作业要么没有写,要么就是抄的。对于我无法理解的知识,我是无法通过记住题型,或做大量的练习掌握。而且很多知识,如果我不知道有什么用,其实我更本就不想学。高中的物理我是学的极烂的,我永远搞不懂例如那些什么小车啊,上面有小球啊,推来撞去的计算。但是凡是我知道的东西,1是靠慢慢理解它的本质,2是靠悟出来的。但是我掌握的知识,无论是什么时候总是可以信手拈来。这也许就是理解本质的学习,和悟出的知识的好处吧,也许永远不会体现在分数上面。

后来到了德国,遇到了几个很好的教授,他们就是先告诉你这个知识以后有什么用,工业上有什么东西是用了这个技术,先给你一个最直观的概念和描述,然后在从最本质的公式,以及实验推出来这个知识,这就是本质的学习,学的是什么呢,就是学事物的本质。以前读研究生,其实很多精深的知识,是非常难通过“悟”来理解的,然而确是可以通过本质的学习达到真正的掌握。

然而慢慢去理解它的本质,其实远比靠悟出来的知识少了那份成就感。但是理解本质的学习也是真正的学习的一种,上面提到我的高中物理很差,但到了大学物理我继续通过“本质的学习”,我的大学物理就学得很好,其实这是因为,越到高深的知识越需要高层次的学习,也就是需要“理解本质的学习”。我现在号称在读博士,博士不仅需要“理解本质的学习”同时也需要一些“悟出知识”,这样才有可能到达“创造知识”的阶段。悟出知识,其实书创造知识的一个准备阶段,或是可以说是一个训练的方法。

我个人认为的学习的"档次":
模仿学习 << 理解本质的学习 << 悟出知识

我个人认为的进阶:
学透了之后--->“创造知识”

上面说过很多精深的知识很难通过悟来掌握,因为过于“精深”。然而,编程确可以通过“悟”来学习,学习编程语言的过程,其实是一个绝佳的悟的过程,我还是比较愚笨的,以前学指针和类的时候,很是一头雾水,比起其他同学来说,学的非常慢,但是突然有一天,脑子里突然间有一个“啊哈”的感觉,哇,原来如此,顿悟一下,突然间发现编程的世界是如此的广阔,这个广阔的天地是自己发现的,自己会迫不及待得想要在这个自己创造的新天地里施展一番手脚。这就是顿悟的乐趣。也是学习编程的乐趣。顿悟之后,这个知识似乎已经融入自己的血液,有一天有一个朋友问我说,哇,你的面向对象的设计和使用得非常好,看不出来你只有两年编程经验,我的回答是,类的设计和使用的很多要点其实是我自己“悟”出来的,呵呵,这是悟出知识的好处。

 

------ ------ ------ ------

最后祝大家,新年快乐,健康如意。这里没有假期,大年三十还是要上班,呵呵。很想念国内的家人朋友,唉,每逢佳节....今天随手写一些东西吧,用类似微博的方式。

正如工作了才体会工作不易,其实无论工作生活,每个人都有自己的辛酸之处,网上有一句话说的很好,每个人的幸福其实是活在其他人的眼里。

年纪大了,常常也会得到一些生活的感触,如何让自己生活得更快乐一些,其实也就是爱自己的生活,爱关心你的人,爱自己的工作,常常感恩。

问问自己,去年真正学到了什么,其实不是什么所谓的高深的知识,而是简单的四个字,活在当下,去年的博客中我也常常提到这个。如果能够真正的活在当下,听听自己的内心,唤醒真我,这样才可以从自己的心智牢笼里挣脱出来。如同《活在当下》这本书中谈到的,在我的开悟之旅中,我也正在学习不认同自己的头脑,不再把心智的内容看得那么认真了,其实我们的自我感并不依附它而存在。

摘录《活在当下》一段原文:
当下之外一无所有你可曾在当下之外,经验过、做过、思想过、或感觉过任何事吗?你认为你以后会吗?任何事有可能发生或存在当下之外吗?答案不言自明,不是吗?过去不曾发生过什么;它发生在当下。未来不会发生什么;它会发生在当下。你认为的过去,是一个记忆的轨迹,是一个储存在心智里的前任当下。当你记起过去时,你重新启动了一个记忆的轨迹——而且,你现在就在制造轨迹。未来是一个想象的当下,一个心智的投射。当未来到的时候,它就是当下。当你想到未来时,你是在当下想的。过去和未来显然没有它们自己的实相。正如同月亮本身不发光,它只能反射太阳的光一样。过去和未来也一样,只是永恒的现在的光、它的力量、和它实相惨淡的反射而已。它们的实相是向当下“借贷”来的。