22
12

经过一个多月时间的深思熟虑,我还是决定和团队的成员选择Mono作为我们的移动开发框架,理由有三个:C#太优美了;我们希望跨平台跨语言开发程序;为开源世界贡献力量。

我在2010年下半年开始参与ios应用的开发,现学了object-c,开发出了一个应用,当时公司还有团队在开发android的应用,2010年正直移动开发的爆发前夜。2011年的时候有同事聊过想一起出去做点事情,而移动互联网肯定是重点。于是开始着手做一些准备,无意间了解到了Mono的创始人开始创立自己的公司了,公司全力投入MonoTouch(Mono在很久以前也听说过)的研发,并且知道Mono for android正在开发中,很兴奋。我写信给Miguel de Icaza,咨询他关于他们产品的研发时间,他很快做了回复,并且说未来几个月时间就会推出产品。可惜后面公司变动,我去了百度,专注于LAMP下的开发。

2012年中,我辞掉百度的工作,开始热血沸腾的“创业”,中途历经挫折,差点“未成创业,已经失业”,最后找到一个避风港,继续编写代码。到今天,终于再次有机会做移动端的开发了。我最后还是选择了Mono!

29
11

[转]Emgu cv中的SIFT算法实现

0
归档:2012年11月分类:C#和.NET

SIFT算法大家都比较熟悉,网上的版本很多,刚开始接触时我主要研究的是C++,因为相对于C#,基于OPEN CV C++的SIFT算法资料更多,但是由于想要实现较为理想的界面效果,最终还是放弃了使用C++转而使用C#。

 

C#中SIFT算法主要分为三种:

1)脱离Emgu cv平台,完全手动实现所有SIFT算法函数,这样的程序虽然实现有些困难,但是完全可借助已有的C++程序做更改,而且这样做最大的好处就是对SIFT算法的原理有更深的理解。

2)实现时使用少量Emgu cv函数(例如影像的读取,灰度值获得等),但是大部分工作还是依赖于.net平台自行完成。

3)基本上程序完全借助于Emgu cv提供的接口,核心函数完全由Emgu cv提供。

 

前两类程序资源较多,大家也很容易下载,第三类程序资源相对较少,因此我今天简单为大家介绍第三类算法的实现方法,首先回顾一下SIFT算法计算步骤:

 

1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

使用Emgu cv实现上述步骤非常简单,程序如下:

//确定匹配图像

Bitmap bt1 = new Bitmap(@"C:\Users\GAOXIANG\Desktop\111.jpg");
Bitmap bt2 = new Bitmap(@"C:\Users\GAOXIANG\Desktop\222.jpg");

//将图像转为Emgu cv的处理格式

Image<Gray, byte> img1 = new Image<Gray, byte>(bt1);
Image<Gray, byte> img2 = new Image<Gray, byte>(bt2);

//使用Emgu cv探测图片特征点

SIFTDetector sift = new SIFTDetector();
var f1 = sift.DetectFeatures(img1, null);
var f2 = sift.DetectFeatures(img2, null);

到此已经获得了两张相片的特征点f1,f2,接下来就是将相互匹配的特征点相连:

for (int i = 0; i < f1.Length; i++)
{
double[] dist = new double[f2.Length];
int n = 0;
int index = 0;
for (int j = 0; j < f2.Length; j++)
{

//计算待比较特征点描述子的欧式距离
dist[n++] = diedai(f1[i].Descriptor, f2[j].Descriptor);
}

//排序,获得欧式距离最近点以及次近点
for (int k = 0; k < 2; k++)
{
for (int k1 = k+1; k1 < dist.Length; k1++)
{
if (dist[k] > dist[k1])
{
double temp = dist[k];
dist[k] = dist[k1];
dist[k1] = temp;

//记录最近点在相片2中的序列
if (k == 0)
{ index = k1; }
}
}
}

//若最近点与次近点比值小于阈值0.49,绘制特征点连线
if (dist[0]/dist[1] < 0.49)
{
PointF point1 = f1[i].KeyPoint.Point;
PointF point2 = f2[index].KeyPoint.Point;

Graphics g = this.CreateGraphics();
Pen p1 = new Pen(Color.Blue, 3);
g.DrawLine(p1, point1,  point2);//注意:point1,point2位置与具体控件,图像布局有关,请自行调整
}
}

//描述子距离计算函数

private double diedai(float[] p1, float[] p2)
{
double sub=0;
double sqrt=0;
for (int i = 0; i < p1.Length; i++)
{
sub += Math.Pow(p1[i] - p2[i], 2);
}
sqrt = Math.Sqrt(sub);
return sqrt;
}

via:http://blog.csdn.net/xiang__jiangsu/article/details/8116618

20
11

svn命令diff使用

0
归档:2012年11月分类:LAMP开发

名称

svn diff — 比较两条路径的区别。

概要

diff [-r N[:M]] [TARGET[@REV]...]
diff [-r N[:M]] --old OLD-TGT[@OLDREV] [--new NEW-TGT[@NEWREV]] [PATH...]
diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]

描述

显示两条路径的区别,svn diff有三种使用方式:

svn diff [-r N[:M]] [--old OLD-TGT] [--new NEW-TGT] [PATH...]会显示OLD-TGTNEW-TGT的区别。如果给定路径PATH,它会被看作OLD-TGTNEW-TGT的相对路径,输出也会限制在这些路径的区别上。OLD-TGTNEW-TGT可以是工作拷贝路径或者是URL[@REV]OLD-TGT缺省是当前工作目录,而NEW-TGT缺省是OLD-TGTN缺省是BASEM缺省时当前目录的版本,但如果NEW-TGT是一个URL,则默认是HEADsvn diff -r N设置OLD-TGT的修订版本为Nsvn diff -r N:M设置NEW-TGT的修订版本是M

svn diff [-r N[:M]] URL1[@N] URL2[@M]svn diff [-r N[:M]] --old=URL1 --new=URL2的缩写。

TARGET是一个URL,然后可以使用前面提到的--revision或“@”符号来指定N和M。

如果TARGET是工作拷贝路径,则--revision选项的含义是:

--revision N:M
服务器比较 TARGET@NTARGET@M

--revision N
客户端比较TARGET@N和工作拷贝。

(无--revision
客户端比较base和 TARGETTARGET

如果使用其他语法,服务器会比较URL1URL2各自的NM。如果省掉NM,会假定为HEAD

缺省情况下,svn diff忽略文件的祖先,只会比较两个文件的内容。如果你使用--notice-ancestry,比较修订版本(也就是,当你运行svn diff比较两个内容相同,但祖先历史不同的对象会看到所有的内容被删除又再次添加)时就会考虑路径的祖先。

别名

di

变化

是否访问版本库

获得工作拷贝非BASE修订版本的区别时会

选项

--revision (-r) REV
--old OLD-TARGET
--new NEW-TARGET
--extensions (-x) "ARGS"
--non-recursive (-N)
--diff-cmd CMD
--notice-ancestry
--username USER
--password PASS
--no-auth-cache
--non-interactive
--no-diff-deleted
--config-dir DIR

例子

比较BASE和你的工作拷贝(svn diff最经常的用法):

$ svn diff COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 4404)
+++ COMMITTERS	(working copy)

察看你的工作拷贝对旧的修订版本的修改:

$ svn diff -r 3900 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3900)
+++ COMMITTERS	(working copy)

使用“@”语法与修订版本3000和35000比较:

$ svn diff http://svn.collab.net/repos/svn/trunk/COMMITTERS@3000 \
http://svn.collab.net/repos/svn/trunk/COMMITTERS@3500
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)
…

使用范围符号来比较修订版本3000和3500(在这种情况下只能传递一个URL):

$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk/COMMITTERS
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)

使用范围符号比较修订版本3000和3500trunk中的所有文件:

$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk

使用范围符号比较修订版本3000和3500trunk中的三个文件:

$ svn diff -r 3000:3500 --old http://svn.collab.net/repos/svn/trunk COMMITTERS README HACKING

如果你有工作拷贝,你不必输入这么长的URL:

$ svn diff -r 3000:3500 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3000)
+++ COMMITTERS	(revision 3500)

使用--diff-cmd CMD -x来指定外部区别程序

$ svn diff --diff-cmd /usr/bin/diff -x "-i -b" COMMITTERS 
Index: COMMITTERS
===================================================================
0a1,2
> This is a test
20
11

svn命令delete使用

0
归档:2012年11月分类:LAMP开发

名称

svn delete — 从工作拷贝或版本库删除一个项目。

概要

svn delete PATH...
svn delete URL...

描述

PATH指定的项目会在下次提交删除,文件(和没有提交的目录)会立即从版本库删除,这个命令不会删除任何未版本化或已经修改的项目;使用--force选项可以覆盖这种行为方式。

URL指定的项目会在直接提交中从版本库删除,多个URL的提交是原子操作。

别名

del, remove, rm

变化

如果操作对象是文件则是工作拷贝变化,对象是URL则会影响版本库。

是否访问版本库

对URL操作时访问

选项

--force
--force-log
--message (-m) TEXT
--file (-F) FILE
--quiet (-q)
--targets FILENAME
--username USER
--password PASS
--no-auth-cache
--non-interactive
--editor-cmd EDITOR
--encoding ENC
--config-dir DIR

例子

使用svn从工作拷贝删除文件只是预定要删除,当你提交,文件才会从版本库删除。

$ svn delete myfile
D         myfile

$ svn commit -m "Deleted file 'myfile'."
Deleting       myfile
Transmitting file data .
Committed revision 14.

然而直接删除一个URL,你需要提供一个日志信息:

$ svn delete -m "Deleting file 'yourfile'" file:///tmp/repos/test/yourfile

Committed revision 15.

如下是强制删除本地已修改文件的例子:

$ svn delete over-there 
svn: Attempting restricted operation for modified resource
svn: Use --force to override this restriction
svn: 'over-there' has local modifications

$ svn delete --force over-there 
D         over-there
20
11

svn命令copy使用

0
归档:2012年11月分类:LAMP开发

名称

svn copy — 拷贝工作拷贝的一个文件或目录到版本库。

概要

svn copy SRC DST

描述

拷贝工作拷贝的一个文件或目录到版本库。SRCDST既可以是工作拷贝(WC)路径也可以是URL:

WC -> WC
拷贝并且预定一个添加的项目(包含历史)。

WC -> URL
将WC或URL的拷贝立即提交。

URL -> WC
检出URL到WC,并且加入到添加计划。

URL -> URL
完全的服务器端拷贝,通常用在分支和标签。

注意

你只可以在单个版本库中拷贝文件,Subversion还不支持跨版本库的拷贝。

别名

cp

变化

如果目标是URL则包括版本库。

如果目标是WC路径,则是工作拷贝。

是否访问版本库

如果目标是版本库,或者需要查看修订版本号,则会访问版本库。

选项

--message (-m) TEXT
--file (-F) FILE
--revision (-r) REV
--quiet (-q)
--username USER
--password PASS
--no-auth-cache
--non-interactive
--force-log
--editor-cmd EDITOR
--encoding ENC
--config-dir DIR

例子

拷贝工作拷贝的一个项目(只是预定要拷贝—在提交之前不会影响版本库):

$ svn copy foo.txt bar.txt
A         bar.txt
$ svn status
A  +   bar.txt

拷贝你的工作拷贝的一个项目到版本库的URL(直接的提交,所以需要提供一个提交信息):

$ svn copy near.txt file:///tmp/repos/test/far-away.txt -m "Remote copy."

Committed revision 8.

拷贝版本库的一个项目到你的工作拷贝(只是预定要拷贝—在提交之前不会影响版本库):

提示

这是恢复死掉文件的推荐方式!

$ svn copy file:///tmp/repos/test/far-away near-here
A         near-here

最后,是在URL之间拷贝:

$ svn copy file:///tmp/repos/test/far-away file:///tmp/repos/test/over-there -m "remote copy."

Committed revision 9.

提示

这是在版本库里作“标签”最简单的方法—svn copy那个修订版本(通常是HEAD)到你的tags目录。

$ svn copy file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/0.6.32-prerelease -m "tag tree"

Committed revision 12.

不要担心忘记作标签—你可以在以后任何时候给一个旧版本作标签:

$ svn copy -r 11 file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/0.6.32-prerelease -m "Forgot to tag at rev 11"

Committed revision 13.
16
11

数学学科分类(MSC标准)

0
归档:2012年11月分类:数海泛舟

MSC的顶级主题分类,但下面的几个分组并不是MSC分类的一部分,它们仅仅是为了能够更有条理地划分。

一、通用及基础

00: 通用,包括趣味数学,数学哲学,数学建模等。
01: 数学史 and 数学家传记。
03: 数理逻辑和数学基础,包括模型论,可计算性理论,集合论,证明论,代数逻辑等。

二、代数(及离散数学)

05: 组合数学
06: 序理论
08: 通用代数系统
11: 数论
12: 场论和多项式
13: 交换环和交换代数
14: 代数几何
15: 线性代数和多重线性代数;矩阵
16: 环论和结合代数
17: 非结合环和非结合代数
18: 范畴论; 同调代数
19: K-理论
20: 群论及推广
22: 拓扑群,李群和基于它们的分析

三、分析

26: 实变函数,包括导数和积分
28: 测度及其积分
30: 复变函数,包括复数中的近似值理论
31: 位势论
32: 多复变数和解析空间
33: 特殊函数
34: 常微分方程
35: 偏微分方程
37: 动力系统和遍历理论
39: 差分方程和泛函方程
40: 序列,级数, 发散级数
41: 近似值理论及其拓展
42: 调和分析,包括傅里叶分析,傅里叶变换,傅里叶级数,三角插值,和正交函数
43: 抽象调和分析
44: 积分变换,运算微积
45: 积分方程
46: 泛函分析,包括infinite-dimensional holomorphy,分布 (数学分析)中的积分变换
47: 算子理论
49: 变分法和最优控制;最优化(包括同源性整合理论)

四、几何(及拓扑学)

51: 几何学
52: 凸几何和离散几何
53: 微分几何
54: 一般拓扑学
55: 代数拓扑学
57: 流形
58: 全局分析和流形分析(包括infinite-dimensional holomorphy)

 五、应用数学(及其他)

60 概率论和随机过程
62 统计学
65 数值分析
68 计算机科学
70 力学(包括粒子力学)
74 变形固体力学
76 流体力学
78 光学, 电磁学
80 经典热力学, 传热
81 量子力学
82 统计力学,物质结构
83 相对论和万有引力,包括相对论力学
85 天文学和天体物理学
86 地球物理
90 运筹学,数学规划
91 博弈论,数学经济学,数学社会学 and 数学心理学
92 生物学和其他自然科学
93 系统论;控制论,包括最优控制
94 信息,通信,和电路
97 数学教育

16
11

svn命令blame使用

0
归档:2012年11月分类:LAMP开发

名称

svn blame — 显示特定文件和URL内嵌的作者和修订版本信息。

概要

svn blame TARGET...

描述

显示特定文件和URL内嵌的作者和修订版本信息。每一行文本在开头都放了最后修改的作者(用户名)和修订版本号。

别名

praise、annotate、ann

变化

是否访问版本库

选项

--revision (-r) REV
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
--verbose

例子

如果你希望在测试版本库看到blame标记的readme.txt源代码:

$ svn blame http://svn.red-bean.com/repos/test/readme.txt
     3      sally This is a README file.
     5      harry You should read this.
16
11

svn命令commit使用

0
归档:2012年11月分类:LAMP开发

名称

svn commit — 将修改从工作拷贝发送到版本库。

概要

svn commit [PATH...]

描述

将修改从工作拷贝发送到版本库。如果你没有使用--file--message提供一个提交日志信息,svn会启动你的编辑器来编写一个提交信息,见“config”一节editor-cmd小节。

提示

如果你开始一个提交并且Subversion启动了你的编辑器来编辑提交信息,你仍可以退出而不会提交你的修改,如果你希望取消你的提交,只需要退出编辑器而不保存你的提交信息,Subversion会提示你是选择取消提交、空信息继续还是重新编辑信息。

别名

ci(“check in”的缩写;不是“checkout”的缩写“co”。)

变化

工作拷贝,版本库

是否访问版本库

选项

--message (-m) TEXT
--file (-F) FILE
--quiet (-q)
--non-recursive (-N)
--targets FILENAME
--force-log
--username USER
--password PASS
--no-auth-cache
--non-interactive
--encoding ENC
--config-dir DIR

例子

使用命令行提交一个包含日志信息的文件修改,当前目录(“.”)是没有说明的目标路径:

$ svn commit -m "added howto section."
Sending        a
Transmitting file data .
Committed revision 3.

提交一个修改到foo.c(在命令行明确指明),并且msg文件中保存了提交信息:

$ svn commit -F msg foo.c
Sending        foo.c
Transmitting file data .
Committed revision 5.

如果你希望使用在--file选项中使用在版本控制之下的文件作为参数,你需要使用--force-log选项:

$ svn commit --file file_under_vc.txt foo.c
svn: The log message file is under version control
svn: Log message file is a versioned file; use '--force-log' to override

$ svn commit --force-log --file file_under_vc.txt foo.c
Sending        foo.c
Transmitting file data .
Committed revision 6.

提交一个已经预定要删除的文件:

$ svn commit -m "removed file 'c'."
Deleting       c

Committed revision 7.

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。