tag:blogger.com,1999:blog-69762913932240660382024-02-21T15:37:05.963+01:00H-LiH-Li 一个电子工程师的博客。若无特别说明,此处文章皆为原创,网友转载本博客文章请保留出处。H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.comBlogger218125tag:blogger.com,1999:blog-6976291393224066038.post-75012091363385041072017-12-31T01:07:00.001+01:002017-12-31T01:10:50.846+01:002017年小结和往年一样在,2017年年底小结一下本年的情况。<br />
<br />
这一年也大概读了六十多本书吧,大概每周读一本书。今年经过努力学习、研究和实践掌握了不少的新技术和领导和管理方法。<br />
<br />
长话短说,对我而言2017年最重要的三件事情:<br />
<br />
<ul>
<li>我们家老二出生</li>
<li>公司的产品的产品化,虽然走不少弯路</li>
<li>对团队的培训,团队慢慢显示出了极强的战斗力</li>
</ul>
<br />
今年很多挑战都完成得不错。希望明年能和团队一起继续努力和进步,把公司和公司的产品做得更好。继续努力学习做两个娃的好爸爸,能多一点时间陪陪家人。<br />
<br />
<br />
H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-55482503864895010502016-12-26T00:41:00.000+01:002016-12-26T00:44:36.779+01:002016年小结和往年一样,在2016年年底的小结一下本年的情况。<br />
<br />
a. 业余活动<br />
<br />
根据在豆瓣上的记录,在2016年我总共读了10本书,但有些书没有记录,大多数都是计算机和机器人方面的书籍,大概也读了10本,读书的明显太少了。观影:20部,大部分都是在汉莎来回德国中国途中看的。如果有空,我还喜欢看看皇马还有曼联的比赛,开始看曼联的比赛因为我最喜欢的穆里尼奥去了曼联。欧洲杯看了不少比赛,特别是葡萄牙队的,他们夺冠很励志。因为回国创业,呆在北京的时间不少,我买了不少小米的产品,这是我最2016年喜欢的品牌,在国内我也是支付宝,微信,京东的忠实用户,非常喜欢国内方便的网上支付和网络购物的优秀体验。2016居然没有写博客,但我实现了2015年底定下的目标,写了一本技术科普书,在年中出版了,而且书中部分章节也刊登在一份不错的商业杂志上。<br />
<br />
b. 旅游<br />
<br />
因为工作的关系回了7次北京,在国内还去了天津三次,济南两次,上海一次,但是都是在公司或者合作伙伴那里埋头苦干,12月份陪了父亲去了一次颐和园,算是14年前的故地重游。12月份和女儿和老婆还有岳母去了西班牙的Fuerteventura,呆了一个星期,算是唯一的一次度假。对了,2016年在国内和欧洲品尝了不少美食。<br />
<br />
c. 工作<br />
<br />
国内的公司在今年3月底正式成立,在公司上投入了绝大部分的精力。在北京认识了大量新朋友,结交了不少行业内的大牛。9月份代表公司在汉堡参加的展览会。11月18日顺利地完成了公司的第一轮融资。2017年公司的主力产品完成了5次迭代,5月份搭建好了公司实验室,11月份完成公司办公室的装修,也搭建好了公司基于云端的IT环境。在和公司一起成长的过程中,学习了大量的知识,获取的许多经验,得到了很多见识,我希望未来可以把这些东西整理起来,也写一本书。2016年花了很多时间,讨论公司的发展,定好了公司的文化,包括Vision,Mission和Value。<br />
<br />
d. 生活<br />
<br />
更加进入了父亲的角色,2016年12月底又要搬家,因为女儿需要更大的空间,还有为了迎接未来的宝宝。<br />
<br />
2016年对我来说是一个充满挑战的一年,我认为绝大部分的挑战我都完成的很好,但是也有一些不足的地方。<br />
<br />
2017年,希望新公司一切都顺利吧,核心团队建设完成,公司年中能够成功完成新一轮的融资,并且产品上市。如果时间允许的话,我希望可以再写一本书。H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-15534446575634589802015-12-31T20:04:00.002+01:002015-12-31T20:05:21.748+01:002015年小结和往年一样,在2015年的最后一天分几个部分小结一下本年的情况。<br />
<br />
a. 业余活动<br />
<br />
根据在豆瓣上的记录,在2015年我总共读书:25本,平均:14.44天读一本书,读书的时间明显太少了,因为今年很少坐火车,对我来说坐火车的时候是阅读的最好时间。观影:62部,平均:5.82天看一部电影。2015年博客也写的非常少,只有5篇。2月份3月份,我和老婆喜欢上骑自行车,常常每天骑30到60公里。没事的时候,我还喜欢看看皇马还有切尔西的比赛。<br />
<br />
<br />
b. 旅游<br />
<br />
虽然去的地方很多,特别是北德去了不少地方,但是都是一天内的走马观花的看看,但是几乎没有真正的旅游。柏林连续去了3次,但是都是公事。2月份回了趟中国,给一家公司做培训。<br />
<br />
<br />
c. 工作<br />
<br />
今年彻底从研究所辞职不干了。因为精力有限,退出了一家和以前校友共同合股的公司,将所有的股份都转让了,在这家公司的创业过程中没有赚到任何钱,还搭上了大量的精力,但是收获都很多,经验和眼光都得到很大的提升。一整年都集中精力在做自己的公司的事情,拿到了一些天使投资,正还在筹备做一家科技创业的公司,准备明年初在国内成立,2015年底真是非常忙。6月份花了一个月的时间将机器人的部分控制系统编写完成。7月份,努力了一个月将博士论文的一个部分的代码重写,加入了新的东西。博士论文还是有一搭没一搭的做着。8月份做了一个简单的演讲介绍了一下进度,博士论文还差一个重要的部分需要研究,但是因为实在太缺时间了,不知道什么时候可以最终完成。8月份准备了一个项目的实物演示。9月份带着这个项目的实物演示在德国参加了一个小型展览会,我们的展台很受瞩目,得到了一些小小的进步,增强了我对我们现在做的项目的信心。10月到11月,两个月将所有时间都用在我们国内成立公司的各种事情上。<br />
<br />
<br />
d. 生活<br />
<br />
2015年对我来说最大的事情和最大的成就是,我的女儿年底出生了,我终于升级成爸爸了。因为老婆工作的关系,我们在北德的一个小城租了一个小房子,4月份我花了一个月的时间买家具,进行简单的装修,我们的小房子才终于可以住起来很舒服了,我们一年中有一半的时间住在那里,那里还是挺舒服的,城市不大但是挺漂亮的。<br />
<br />
<br />
<br />
2015年对我来说是一个很折腾又很欢乐的年,搬家,长时间的编程,大量的机器人调试,准备新公司,迎接家庭新成员。<br />
<br />
2016年,希望新公司一切都顺利吧,可以完成我的博士论文,然后抽时间写一本中文的技术书,这件事已经想了很久了,希望明年可以做到。<br />
H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-62666574708308006032015-07-15T18:18:00.001+02:002015-07-15T18:22:05.624+02:00最好的"关于什么是回调函数"问题的解答今天在翻stackoverflow,看到一条解答,差点笑喷,实在牛逼,史上最好的关于什么是回调函数<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Callback的解释(<a href="http://stackoverflow.com/questions/2139812/what-is-a-callback">links</a>),如果你熟悉,</span><span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.3999996185303px;">Carly Rae Jepsen的<a href="https://youtu.be/fWNaR-rxAic">Call me maybe</a>这首歌。</span></span><br />
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg81MGgE0hJ8zBqM0_RkgoMNDKMRzAU-Lp0B921EB4kTaAlSNt5nQalzcg1YUhzlYgctjA2IMBL7gky2Bk0VRHwt7s8Er681749O6qxfpUWGwYN8vL7wjO9vEVK3sR5MxejoeGmiWuHsdri/s1600/callback.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="497" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg81MGgE0hJ8zBqM0_RkgoMNDKMRzAU-Lp0B921EB4kTaAlSNt5nQalzcg1YUhzlYgctjA2IMBL7gky2Bk0VRHwt7s8Er681749O6qxfpUWGwYN8vL7wjO9vEVK3sR5MxejoeGmiWuHsdri/s640/callback.png" width="640" /></a></div>
<div>
<span style="color: #252525; font-family: sans-serif;"><span style="font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-41804104679089253962015-05-12T00:09:00.000+02:002015-05-12T00:15:01.824+02:00关于C#连接local database的方法今天就上一图 关于C#连接local database的方法,这图中包括了代码和VS 2012上如何找到Connection String的方法。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUcRVPS-z-g-THTYy2hhfcVYvnQY61Ik8bw5UJHoWUVYbvm2g7xnb7sFna2HJVnewHYctiLydv7G-FUJe_jZPvEUQGG32BmYEgk-wQMBPn3b98qD-4epZ8HQdRm6X0yI4BS9reE7m0IZVR/s1600/Connect_local_sql_vs2012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUcRVPS-z-g-THTYy2hhfcVYvnQY61Ik8bw5UJHoWUVYbvm2g7xnb7sFna2HJVnewHYctiLydv7G-FUJe_jZPvEUQGG32BmYEgk-wQMBPn3b98qD-4epZ8HQdRm6X0yI4BS9reE7m0IZVR/s640/Connect_local_sql_vs2012.png" width="640" /></a></div>
<br />H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com1tag:blogger.com,1999:blog-6976291393224066038.post-12786884098794249162015-05-11T00:52:00.000+02:002015-05-11T00:54:23.125+02:00使用Emgu CV不要忘记加入OpenCV Libs记录一个小经验。使用的是Emgu CV 2.410版本,如果编译CameraCapture这样的小程序,我们需要Emgu.CV.dll,Emgu.CV.UI.dll和Emgu.Util.dll加入Project的Reference中去。这样就可以执行这个小程序。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidrYdur94wY3BivjzEoou_x5M9zZDX1JS5J8dmwf4wSCd2Cf_uJYORAWLUd2u765UbwkIDzulgV4oIh6d7IStsUiTPnO9Yl0rqoWXGCDLOKm0MKs7Mpr5ibIQH3KrY-DwEMsK90_y1yo2G/s1600/2015-04-29_214738.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="115" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidrYdur94wY3BivjzEoou_x5M9zZDX1JS5J8dmwf4wSCd2Cf_uJYORAWLUd2u765UbwkIDzulgV4oIh6d7IStsUiTPnO9Yl0rqoWXGCDLOKm0MKs7Mpr5ibIQH3KrY-DwEMsK90_y1yo2G/s320/2015-04-29_214738.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgK3wi3fbTKLE6M2xfkDE5L3e5jKn8AnKsnN2GX31Lv2X_p8mD2HyIJVJIw-kvQ6vewpJn021L0O1iQmMNXaIs6lhrJv1MlOUZiKHIZMlGOHTfjyPX-h-3jmye4y7z7bbL8ri9PrevBUns/s1600/2015-04-29_203357.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="105" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgK3wi3fbTKLE6M2xfkDE5L3e5jKn8AnKsnN2GX31Lv2X_p8mD2HyIJVJIw-kvQ6vewpJn021L0O1iQmMNXaIs6lhrJv1MlOUZiKHIZMlGOHTfjyPX-h-3jmye4y7z7bbL8ri9PrevBUns/s200/2015-04-29_203357.png" width="200" /></a></div>
<br />
有时候在VS2012中运行编译后的程序有可能会出现上图所示这个问题,可能的原因 1. 没有OpenCV Libs,如果编译成x86,我们就需要把x86的目录放入Debug和Build生成exe的文件夹里面,可以x86这个文件夹从C:\Emgu\bin里面找到。2 也有可能设置Debug和Build的路径问题,只需要确认是否正确设置就可以了。<br />
<br />
H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-64794438410092178412015-05-06T11:43:00.000+02:002015-05-06T11:44:15.718+02:00C++中的vector快速拷贝今天编程中发现新写的程序运行速度很低,经过一番查找才发现是的vector拷贝的效率问题。<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
//[1] 方法1<br />
vector<double> vec = vec_src;</double><br />
<br />
//[2] 方法2<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
vector<double> vec(vec_src);</double><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
//[3] 方法3<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
vector<double> vec(vec_src.size());</double><br />
std::copy( vec_src.begin(), vec_src.end(), vec.begin() );<br />
<br />
// 使用的是OpenCV的方法用来测试运行的时间<br />
double t = (double)getTickCount();<br />
t = ((double)getTickCount() - t)/getTickFrequency();<br />
// some codes<br />
cout << "Times passed in milli seconds: " << t * 1000 << endl;<br />
<br />
方法3最快,在我的笔记本上用VS2012在32bit中居然比第一种和第二种方法快近10倍,当然了也可以使用memcpy,但是其效率不会比std::copy高多少。H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com1tag:blogger.com,1999:blog-6976291393224066038.post-85575029451705243502014-12-31T13:32:00.002+01:002014-12-31T13:36:28.217+01:002014年小结在2014年的最后一天分几个部分小结一下本年的情况.<br />
<br />
a. 业余活动<br />
<br />
刚刚看了阅读DNA对我在豆瓣上的记录统计:<br />
我在2014年共读过58本书,五星好书11本,11月最勤快读了20本,平均:6.28天读一本书.<br />
大概是这个数吧,有时候忘记统计了,有时候想起来的时候一个月把前几个月读过的书都在豆瓣上加上,其实11月没有读20本.平均:6.28天读一本书,大概一个星期读一本书,速度不快不慢.刚刚好,刚刚发现其实在2012年,我也是读了58本书.除了专业的书,2014年我个人比较推荐的五星好书为<房噬>和<费雪论创富>.看来如果即使今年工作很忙的阶段,每个星期读一本书还是可以保证的,把每周零散的看书的时间集成在一起大概有3个小时.<br />
<br />
看了46部电影,其中五星电影4部,9月最消遣看了9部,平均:7.91天看一部电影.大部分在家看的,到电影院大概10几次吧,平均每个月一次.只有四部我评为5星<星际穿越><布达佩斯大饭店><纸牌屋 第二季>.加上没有记录的美剧,平均起来的时间,大概也就是每个星期看一部电影看一集美剧,大概每周不到3小时.<br />
<br />
读书看片大概是我比较重要的业余消遣,读书其实很多时候读的还是工作上的专业书.大概每周花6个小时来读书看片.加上每周2个小时左右的运动.这个8个小时就是我平时最重要的业余消遣活动.<br />
<br />
对了,2014年博客写的也不多,加上这篇才12篇,每月一篇,都是一些技术上的简单记录.希望2015年能有更多的时间来写博客.<br />
<br />
b. 旅游<br />
<br />
真正的旅游就是2014年春天到西班牙的Teneriffa呆了一个星期吧,满满的美好记忆.其他都是很多很多的德国境内的短途旅游,大多数都是去不同的城市工差办事.<br />
<br />
c. 工作<br />
<br />
简单提一下2014工作的情况吧:<br />
一个已经做了3年的项目2014年有一个比较大的突破,终于做出了一个可以使用,用户满意的前端版本,从9月底开始了用户使用测试,进行的不断的迭代和纠错,现在用户有了一个相对不错的稳定的硬件平台和相对应的软件.后端程序还是有很多东西需要进一步开发,2014年开发后端程序的时候走了不少弯路,经历了许多方向性错误,经过不停的修正,经历了一个无比痛苦的过程,现在终于走上的正轨,希望在2015年初有一个稳定的后端版本可以推出.个人目标为2015年中可以彻底结束这个项目.<br />
<br />
二月底成立了一家新公司.2014年7月艰难地开始一个筹划很久的项目,这个项目年底得到一个小的投资,正式开始.有可能2015年2月前可以得到一个比较大的投资.<br />
<br />
2014年可以说是艰苦积累的一年,2015年项目上了轨道,应该会更忙,有可能会经常出差,希望一切顺利吧.<br />
<br />
d. 生活<br />
<br />
总体上都还行吧,老婆6月底毕业,年底请岳母来德国玩了3个月,生活中的一些新的计划也在有条不紊的进行.H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-39530696294852010492014-12-23T23:26:00.002+01:002014-12-23T23:27:17.840+01:00关于CLR的runtime的一个小记录如果在.NET项目中使用Common Language Runtime Support (/clr)编译C++项目,如下图所示,如果<b>使用VS2012</b>会默认使用,.NET framework 4.5:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSnznj4SlFGqKrrymbIbuo_ECTaIQHegJHDG8tJOd0mPw2LPRn2t4KV7I7OquYYHZb2_unSFUD2anK3xsZ5XerDh53_KO8GCKHk6zEdxT4jZ4-sM1K_BUM9ubjW0kxRK2Ib4QIcLTiwRAn/s1600/targeted+freamwork.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSnznj4SlFGqKrrymbIbuo_ECTaIQHegJHDG8tJOd0mPw2LPRn2t4KV7I7OquYYHZb2_unSFUD2anK3xsZ5XerDh53_KO8GCKHk6zEdxT4jZ4-sM1K_BUM9ubjW0kxRK2Ib4QIcLTiwRAn/s1600/targeted+freamwork.jpg" height="116" width="320" /></a></div>
<br />
<br />
如果我们使用引用这个通过CLR编译的dll,查看它的属性,也会发现,如下图所示的,这个dll的Runtime Version是v4.0319。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5yI-w9H_6DAEbA2KafkYjcsPQZgVJvxA2ytdbNp68WMG3Z8FdLo1eVVVY40_S1kxvXsysoXaBPhhz2a_iSWyJ7FFiHOJ0vAzfUdzHZbt5EJcpi0-y_1pZ08VvvBaD5DrJrq7j7YbLdllK/s1600/property.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5yI-w9H_6DAEbA2KafkYjcsPQZgVJvxA2ytdbNp68WMG3Z8FdLo1eVVVY40_S1kxvXsysoXaBPhhz2a_iSWyJ7FFiHOJ0vAzfUdzHZbt5EJcpi0-y_1pZ08VvvBaD5DrJrq7j7YbLdllK/s1600/property.jpg" height="170" width="320" /></a></div>
<br />
<br />
如果我们的项目使用的<b>不是.NET framework 4.5</b>,使用上面所述的CLR编译的项目中的namespace就会出现下面的报错:<br />
Error<span class="Apple-tab-span" style="white-space: pre;"> </span>492<span class="Apple-tab-span" style="white-space: pre;"> </span>The type or namespace name 'XXX' could not be found (are you missing a using directive or an assembly reference?)<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
最简单的解决的方法就是修改我们项目的Target Framework,将其改为4.5就可以了。<br />
<br />
H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-89333739490115590122014-09-11T20:50:00.002+02:002014-09-11T20:53:38.440+02:00使用QNetworkAccessManager下载文件的一个问题今天发现一个问题,使用Qt的QNetworkAccessManager进行下载,将其放入一个QPushButton的clicked()的slots,但是无法正确执行下载文件,想了半天,还是没有搞明白,最后在stackoverflow在找到这个问题的解决方法,才明白,因为QNetworkAccessManager是非同步的,它需要一个event loop去开始下载,而我们执行clicked()这个slots,它会给一个control back给event loop,但是QNetworkAccessManager以及被销毁了,没有时间去做QNetworkAccessManager的下载文件。<br />
<br />
解决方法:如果加入一个QMessageBox,这样就会启动另一个event loop在这个slot里面,这样QNetworkAccessManager就会有机会完成下载文件这个工作。<br />
<br />
链接:<br />
http://stackoverflow.com/questions/7870017/how-can-i-download-file-from-the-internet-in-qt<br />
H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-46768661708752437312014-09-08T00:00:00.000+02:002014-09-08T00:00:01.061+02:00OpenCV放大或者缩小图像的速度使用OpenCV放大或者缩小图像,我们比较熟悉的是下面的function:<br />
cv::resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )¶<br />
http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html<br />
关于它的Interpolation method(插值方法),其中:<br />
<br />
<blockquote class="tr_bq">
INTER_NEAREST 最近邻插值,是最快的method并且创建blocky images并选择1个pixel去替代几个pixels,这样做得到图像的结果效果比较差。<br />INTER_AREA 也是一个快速计算方法,它取几个pixels的平均值,所以它比较适合缩小图像,而不是放大图像。<br />INTER_LINEAR 使用双线性的插值去改变图像尺寸,组成几个pixels在一起(在很多情况下是比较好的选择,但是计算速度比较慢)。<br />INTER_CUBIC 使用的是双三次的插值,但是计算机量比较大,所以运行速度慢,而且有时候结果看起来比较好,有时候比较差。</blockquote>
<br />
非常简单地,不完全正确地说,在速度上:<br />
INTER_NEAREST > INTER_AREA > INTER_LINEAR > INTER_CUBIC<br />
但是放大或者缩小图像后的效果上一般而言INTER_LINEAR是相对最好的。<br />
<br />
其实,也可以使用Opencv的cv::pyrUp(使用Gaussian 金字塔分解对输入图像向上采样)和cv::pyrDown(使用 Gaussian金字塔分解对输入图像向下采样),关于使用这两个function去放大或者缩小图像,具体信息可查阅下面链接:<br />
http://docs.opencv.org/doc/tutorials/imgproc/pyramids/pyramids.html<br />
但是cv::pyrUp和cv::pyrDown的运算速度其实也并不高。H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-71323106291807581832014-09-07T15:32:00.001+02:002014-09-07T15:33:34.910+02:00libVLC进行memory stream延迟问题最近我使用libVLC进行在server端进行memory stream,出现了一个问题,client端得到的视频有7秒的延迟。类似以下帖子提到的问题:<br />
http://stackoverflow.com/questions/19604815/main-input-error-and-delays-when-libvlc-stream-images-in-memory<br />
<br />
为了找到错误我打开以下的参数:<br />
"--verbose=2", // Be much more verbose then normal for debugging purpose<br />
这样可以得到更多的debug信息。<br />
我得到这样的信息:main warning: late buffer for mux input<br />
<br />
经过查阅发现,正确的解决方法就是,在transcode里设置venc=x264{preset=ultrafast,tune=zerolatency}这样的参数:<br />
<br />
<blockquote class="tr_bq">
sprintf(smem_options_transcode,"#transcode{venc=x264{preset=ultrafast,tune=zerolatency},acodec=none}:rtp{mux=ts,dst=127.0.0.1,port=5004}");</blockquote>
<br />
这样延迟可以控制在3秒以内,当然了,可以使用其他的方法进一步减少延迟,譬如在client端减少caching的数值等等。<br />
<br />
解决方法参考:<br />
https://forum.videolan.org/viewtopic.php?f=4&t=95364<br />
H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-41222665617900555552014-08-19T15:10:00.001+02:002014-08-19T15:10:49.889+02:00Qt Webkit 加入新的plugin路径 <p>在Qt中使用QWebView播放flash文档(swf格式),需要加入NPSWF32.dll这个plugin,如果使用plugin要使用下面代码,去允许使用plugin:</p> <blockquote> <p>QWebSettings *settings = QWebSettings::globalSettings();</p> <p>settings->setAttribute (QWebSettings::PluginsEnabled, true);</p> </blockquote> <p>但是如果还是无法显示flash文档,其实原因是Qt无法找到正确的plugin路径,需要使用类似以下代码,告诉Qt正确的含有NPSWF32.dll的plugin路径:</p> <blockquote> <p>QString path  = QDir::currentPath() + "/webplugins";</p> <p>qputenv("QTWEBKIT_PLUGIN_PATH", path.toLocal8Bit());</p></blockquote> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-25194900483504234532014-08-12T22:39:00.001+02:002014-08-13T11:18:38.562+02:00设置GigEVision相机使用固定IP如果使用Stemmer Imaging的CVB软件,可以在Camera的Properties里面设定: <br />
在GigEVisionTransportLayer里面: <br />
GevCurrentIPAddress 169.254.1.10 <br />
GevCurrentSubnetMask 255.255.0.0 <br />
GevPersistentDefaultGateway 0.0.0.0 <br />
GevIPConfiguration PersistenIP<br />
在UserSets里面,将上面的设置储存,下次启动相机的时候上面的设置将会被使用: <br />
User Set Default Selector UserSet1 <br />
set User Save-->Execute<br />
如果要加快计算机接上GigEVision相机后找到相机的速度 <br />
也可以将计算机的Lan Adapter设成固定的IP <br />
譬如说: <br />
IP address: 169.254.200.9 <br />
Subnetzmake: 255.255.0.0 <br />
Standardgateway: 放空<br />
<br />
<br />
关于自动专用IP寻址的介绍:<br />
我们上面使用的是Automatic Private IP Addressing (from 169.254.0.0 - 169.254.255.255) 它们的subnet mask value 是 255.255.0.0。其实是Windows 计算机自动专用IP寻址(APIPA)是DHCP故障转移机制。自动专用IP 寻址(APIPA) 协议,就是, 当无DHCP 服务器时,通过APIPA, DHCP 客户端可自动配置IP 地址和子网掩码。<br />
<br />
The Internet Assigned Numbers Authority (IANA) has reserved 169.254.0.0 through169.254.255.255 for Automatic Private IP Addressing. As a result, Automatic Private IP Addressing provides an address that is guaranteed not to conflict with routable addresses.<br />
<div>
<br /></div>
<br />
<br />
关于使用私有IP的介绍: <br />
<a href="http://zh.wikipedia.org/wiki/%E4%B8%93%E7%94%A8%E7%BD%91%E7%BB%9C">http://zh.wikipedia.org/wiki/%E4%B8%93%E7%94%A8%E7%BD%91%E7%BB%9C</a> <br />
在互联网的地址架构中,专用网络是指遵守RFC 1918和RFC 4193规范,使用私有IP地址空间的网络。私有IP无法直接连接互联网,需要公网IP转发。与公网IP相比,私有IP是免费的,也节省了IP地址资源,适合在局域网使用。私有IP地址在internet中不会被分配。<br />
<br />
<a href="http://lh5.ggpht.com/-Y6VIijySbtA/U-p7ghDsDBI/AAAAAAAACqY/NBf6-vOUH6c/s1600-h/private-IPv4-addr%25255B4%25255D.gif"><img alt="private-IPv4-addr" border="0" src="http://lh3.ggpht.com/-v6hVkfmtJxg/U-p7iFJAO4I/AAAAAAAACqg/06_9Lt51yfE/private-IPv4-addr_thumb%25255B2%25255D.gif?imgmax=800" height="224" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="private-IPv4-addr" width="666" /></a>H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-25408954027291740272014-08-05T23:37:00.001+02:002014-09-07T15:34:16.220+02:00使用MP4Box对MP4视频文件加入Chapters<span id="docs-internal-guid-5f5130f3-a818-d15b-e914-c38fd1032bf7"></span><br />
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span id="docs-internal-guid-5f5130f3-a818-d15b-e914-c38fd1032bf7"><span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">今天我尝试着使用FFmpeg对MP4视频文件加入Chapters(</span><span style="color: #333333; font-family: Arial; font-size: 13px; line-height: 19.5px; white-space: pre-wrap;">片段,</span><span style="color: #333333; font-family: Arial; font-size: 13px; line-height: 1.5; white-space: pre-wrap;">段落,章节),这样可以在播放视频的时候直接跳到不同的片段,使用FFmpeg经过多次尝试均不成功,经过一番搜索,发现MP4Box这个免费工具,它可以非常轻松的完成我的需要。</span></span></div>
<span id="docs-internal-guid-5f5130f3-a818-d15b-e914-c38fd1032bf7">
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">先下载并安装MP4Box: </span><a href="http://www.videohelp.com/tools/mp4box" style="text-decoration: none;"><span style="color: #1155cc; font-family: Arial; font-size: 13px; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://www.videohelp.com/tools/mp4box</span></a><span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> ,我使用的是MP4BOX_GPAC.Framework.Setup-0.5.0这个版本。</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">然后写一个关于例如下面所示的的Chapter设置文档,保存成txt格式。</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">CHAPTER1=00:00:00.000</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; line-height: 1.5; white-space: pre-wrap;">CHAPTER1NAME=Chapter 001</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">CHAPTER2=00:01:10.222</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">CHAPTER2NAME=Chapter 002</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">CHAPTER3=00:02:00.70</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">CHAPTER3NAME=Chapter 003</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">最后使用以下命令行,使用VLC打开生成的test.mp4文件,就可以发现文档中包含了3个片段。</span></div>
<div dir="ltr" style="line-height: 1.5; margin-bottom: 8pt; margin-top: 15pt;">
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><b>MP4Box -add my_video.mp4 -chap chapters_file.txt test.mp4</b></span></div>
<div>
<span style="color: #333333; font-family: Arial; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
</span>H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-16009802164393778652014-06-25T14:36:00.001+02:002014-06-25T14:36:28.048+02:00重新写一个精简的核心库<p>最近的带的项目陷入了软件开发的危机,原因是陷入自家写的库造成的泥沼越来越深。</p> <p>最近几年带的大的软件项目都是使用自家写的库,工具库utils,开发库commDev,核心库core,api库,可视化库viz等等。当然了使用自家的库开发软件有时候非常有效率,但是自家开发库的升级以及维护绝对是一个大问题,维护超过5万行程序本身就是一个大问题,而且这几年来因为项目压力,常常直接将很多东西放入核心库core里,导致核心库臃肿不堪,而且关于库的使用的实例程序以及接口或者api更本做不到时常更新,有很多文档已经四五年了,更本无法使用,所以导致最最大的痛苦是教新人使用我们的库。更为恐怖的是核心库对其他外部库的依赖越来越多,从OpenCV,Boost到现在的至少10个以上的第三方库,但是核心库更本也没有根据外部库进行更新,至今核心库还在使用OpenCV2.0。更为痛苦的是自家写的库还是使用VS2008进行编译,因为实在太大,以至于没有人有勇气进行修整,并使用最新的编译器进行编译。</p> <p> <br />现在实在受不了了,我终于决定重写核心库,并且放弃工具库utils,开发库commDev,api库,可视化库viz。新的核心库只有两个依赖OpenCV和Qt这两个第三方库的巨无霸。放弃的工具库utils,开发库commDev,api库,可视化库viz,全部使用Qt代替。新的核心库就叫CoreLite,只依赖于最新的Qt5.3和OpenCV2.49,保持绝对的精简,而且可以根据Qt和OpenCV的升级进行编译,而且使用VS2012进行开发和编译,希望能做到根据OpenCV更新的频率进入版本更新。</p> <ul> <li>新的库CoreLite的第一个tag就是CoreLite290,使用和OpenCV一样的文档结构。 <br />\build\include <br />\build\x86 (\build\x86\vc11\bin, \build\x86\vc11\lib) <br />\sources\modules\</li> <li>新的库使用Qt的QThread。</li> <li>控制Class的总数,只包括Qt或OpenCV无法提供的一些特性,例如Producer-Comsumer-Data Sink结构。</li> <li>带几个实例。</li> <li>保证库的可读性,使用Qt的api的写作标准。</li> <li>最大程度保证库的可维护性,其实就是要保持精简。</li> </ul> <p>目前想到的就是这些了,以后在重新的过程中,如果还有什么想法,我希望能写下来记录一下,期望可以用一个星期将新的核心库改写完成。</p> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-36685017383726404802014-06-14T15:57:00.001+02:002014-06-14T15:57:31.027+02:00VS 2008编译的程序部署的一个问题解决<p>最近遇到一个问题,在一台机器上使用VS 2008编译的程序无法在其他机器上运行,马上想到了以前提到过的<a href="http://hanyionet.blogspot.de/2011/06/side-by-side.html">关于Side-by-Side问题</a>, 但是安装了Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)后程序还是无法运行,而且没有什么错误信息。然后使用Windows里的Computer Management里的Event Viewer的Windows Logs发现这个程序无法运行的原因在于其调用的一个动态链接库DLL。然后我查看了一下这个DLL的Manifest,原来多了一个Microshoft.VC90.DebugCRT的依赖,如下图所示。如果我们在机器上没有安装VS 2008当然就会没有Microshoft.VC90.DebugCRT的依赖需要的msvcm90d.dll,msvcp90d.dll,msvcr90d.dll,所以程序就无法运行了。</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPHqvvhOnYeKBMPaCXIuz-wwfm6VGzVicYclP6fZgNG7OvYoNOkjmI6pSgAzgkk-iD2zwNplDQknIhnJ_SCYF4rq2HQ92ufA-eoeuciRQxw3EzisKa27R-WJDhwjrb6QMQkk4hvJwZBot4/s1600-h/manifest_vs2008_debug%25255B2%25255D.jpg"><img title="manifest_vs2008_debug" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="manifest_vs2008_debug" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvMiXG5nOqU6EreZCnpu9codl3bIG9PlNUeVpbk1OrZq1Siy1FnNhogD9d0YB8x3Si97QPg8bMT8_zlPDQ29lywICEt8EJoDED5O4_DPay7hw5h4n7AFyHDtdBOpGBEol9YU1Q6_zb1Cn7/?imgmax=800" width="242" height="244" /></a> <br />解决的方法就是使用在release模式下编译,或者如下图所示,修改C++ Project的Property里的Linker-->Debugging选项页,将Generate Debug Info修改成No,将Debuggable Assembly改成No Debuggable attribute emitted,原来如下图a所示,修改后如下图b所示:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD1xYrp2PZa_tkOB64nJaZlevQcg_j7F94q-niHeGmldLv3ymfss7AKAoug8lUNwW6a8AepUcd5badU5tXAlhHYv-3ab14DGLuOBi58W3lT89PyfxAT66Q52uEoSXc02kJ1ChpnKPl_gHu/s1600-h/debuggable_assembly_debug_mode%25255B2%25255D.jpg"><img title="debuggable_assembly_debug_mode" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="debuggable_assembly_debug_mode" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4BgtRZtlEQ-xyzPhcRN1ljZtOAj_w-n0_GdG4OE2v5yWewwcYWBKzMc7OXZTZEBoCxSd5GMPiUmHfJWPsT23IAiV0CBxvjM2li966NTNOwxKOWCK6alHYIbiOfk9Jd1V2Y_mKztND_FVk/?imgmax=800" width="244" height="169" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGBQcZHE0x4h4DON-nm0bkt_dlfcjJYjtwVIn5T_6CbaYvE8wzBrqDmiF4Ioc11RiNwO1Q5I0DLkoo-spiFnbSnQfsoKbdX8Lgo5ziGaHvZ-JUZzWzYMO6MVcyGtQgsmYCnBl-r95eFLjL/s1600-h/debuggable_assembly_release_mode%25255B2%25255D.jpg"><img title="debuggable_assembly_release_mode" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="debuggable_assembly_release_mode" src="http://lh3.ggpht.com/-Bn_mxsbd06M/U5xUwln4HQI/AAAAAAAAClc/rexR9Ss7glM/debuggable_assembly_release_mode_thumb.jpg?imgmax=800" width="244" height="169" /></a></p> <p>现在再编译一次,查看一下新生成的DLL的Manifest可以发现Microshoft.VC90.DebugCRT的依赖已经没有了,现在程序应该可以在其他机器上运行了。</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNBmpXq-lpSq8KOybzAt4DcCIoU27wfOpB6GKkWPEmqBIJB40b0lokNhkMtnLXfieD6SPCGdmVQ8VD06UPMv9-tR2J_Bt-NbApnDQ61pp0S-NlAIKj35YLacH1v2Sa_jgL1RQtBng_HchM/s1600-h/manifest_vs2008_release%25255B2%25255D.jpg"><img title="manifest_vs2008_release" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="manifest_vs2008_release" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj2f601K4wiPa7oUdUmYr_Kr3liXyBo4hiGYbnsz2IiXy1ooyY7iHsfk7QMejt3EHaa7bQ61VOsvgNHAYCbJEYggNBF3X9ugvK_Ou2ZVRbq1-vP2UU4s3G5pHrmSKtUeBhZTRuMJju7jVj/?imgmax=800" width="244" height="178" /></a></p> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-39776326435861742212014-01-27T00:46:00.001+01:002014-01-27T00:46:50.565+01:00Emgu CV使用1<p>最近开始使用Emgu CV,也就是在.NET可以使用的OpenCV,Emgu CV是一个.Net的wrapper。使用从C++转到C#中写OpenCV代码,开始时候还真的很不习惯,以下将简单整理一下最近的一些笔记。</p> <p><strong>如何将Grayimage转换到Matrix<float>,注意rows cols和height width的关系</strong>:</p> <blockquote> <p>Image<Gray, float> img = new Image<Gray, float>("c:\\test_image.jpg"); <br />int rows = img.Height; <br />int cols = img.Width; <br />Matrix<float> tmp_matrix= new Matrix<float>(rows, cols); <br />CvInvoke.cvConvert(img, tmp_matrix); <br />        </p> </blockquote> <p><strong>如何显示图</strong>:</p> <blockquote> <p>//The name of the window <br />String win1 = "Test Window"; <br />//Create the window using the specific name <br />CvInvoke.cvNamedWindow(win1); <br />Image<Bgr, Byte> img = new Image<Bgr, Byte>("c:\\test_image.jpg"); <br />CvInvoke.cvShowImage(win1, img.Ptr); <br />//Wait for the key pressing event <br />CvInvoke.cvWaitKey(1); <br />//Destory the window <br />CvInvoke.cvDestroyWindow(win1); <br />            <br /></p> </blockquote> <p><strong>如何画一个正方形在图上</strong>:</p> <blockquote> <p>Rectangle box = new Rectangle(121, 57, 75, 97); <br />Image<Bgr, Byte> img = new Image<Bgr, Byte>("c:\\test_image.jpg"); <br />img.Draw(box, new Bgr(Color.DarkOrange), 2);</p> </blockquote> <p><strong>如何计算一个积分图integral image</strong>,在C++中我们可以使用integral(frame, imageIntegral, CV_32F),在C#中可以这样做:</p> <blockquote> <p>Image<Gray, double> cvImageIntegral = null; <br />cvImageIntegral = frame.Integral();</p> </blockquote> <p><strong>如何计算标准差</strong>,标准差就是方差的算术平方根,反映组内个体间的离散程度,标准差与期望值之比为标准离差率。</p> <blockquote> <p>Matrix<float> mat = ... // your input matrix <br />MCvScalar average = new MCvScalar(); <br />MCvScalar std = new MCvSaclar(); <br />CvInvoke.cvAvgSdv(mat, ref average, ref std, IntPtr.Zero);</p></blockquote> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-69778095283530546082014-01-08T22:41:00.001+01:002014-01-08T22:41:11.753+01:00优化网卡用于machine vision<p>以下设定最好是使用Intel network chipset的网卡,并确保使用最新的驱动</p> <p>我们要做的就是optimize bandwidth,improve efficiency</p> <p>在Win7下选择Local Area Connection → 鼠标右键,点选Properties → 点击Configure → 选择Advanced Tab</p> <p>1. set interrupt moderation rate to extreme</p> <p>2. set maximize jumbo packets</p> <p>3. maximize number of receive buffers</p> <p>4. disable power saving on the network card</p> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-29172942313666553362013-12-26T00:15:00.001+01:002013-12-26T00:22:38.357+01:00TWINCAT 3使用记录4: EtherCAT "Compatible" 网卡<p>如果要使用real-time特性,那么需要我们的网卡支持。据我的测试(五台不同的笔记本,一台台式机),所有使用Intel芯片的网卡都支持real-time,其他的芯片组都不支持。网上据说Realtek 的部分芯片组支持,但是我没有测试过。</p> <p>理论上系统允许我们使用所谓的"incompatible"网卡,但是real-time特性会被限制,而且无法对其安装TwinCAT的real-time Ethernet驱动。</p> <p>总结最好就是使用EtherCAT "Compatible" 网卡,<strong>最简单的方法就是选择带有Intel芯片的网卡。</strong></p> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-86699077744333006922013-11-28T00:04:00.001+01:002013-11-28T00:04:31.153+01:00转换QImage到FFmpeg的internal YUV format<p>今天正巧有时间,在家里修改并整理一下我3年前写的视频播放和储存代码。FFmpeg更新非常快,突然发现我还在使用2011年09月23日的FFmpeg版本。最新版本已经到了2.1.1(<a href="http://ffmpeg.zeranoe.com/builds/win32/dev/">http://ffmpeg.zeranoe.com/builds/win32/dev/</a>),刚刚下载了,试着编译以前写的代码,发现很多API都变了,无法编译了,懒得再进行调整了,放弃使用新版本了,新的特性暂时用不到。我将2011年09月23日的FFmpeg版本作为项目的标准lib,打包上传到服务器上,还有SVN里。</p> <p>刚刚在修改“转换QImage到FFmpeg的internal YUV format的方法”,这个方法是从QtFFmpegWrapper项目抄来的,<a href="https://code.google.com/p/qtffmpegwrapper/">https://code.google.com/p/qtffmpegwrapper/</a>。我发现,我刚刚写的新代码中使用的是QImage::Format_RGB888,如果直接使用这个方法转换的frame就会不正确,是黑白的而且尺寸也不对,想了一下,其实只需要将ffmpeg::sws_getCachedContext这个API里的Source PixelFormat 改成<strong>PIX_FMT_RGB24</strong>就行了,简单而言只要注意将QImage的PixelFormat和AVFrame的PixelFormat正确对应就行了,具体代码如下面所示。</p> <blockquote> <p><font size="2">void convertImage_sws(const QImage &img) <br />{ <br />   // Check if the image matches the size <br />   if(img.width() != getWidth() || img.height() != getHeight()) <br />   { <br />      printf("Wrong image size!\n"); <br />      return false; <br />   } <br />   if(img.format() != QImage::Format_RGB32 && img.format() != QImage::Format_ARGB32 && <strong><font color="#ff0000">img.format() != QImage::Format_RGB888</font></strong>)     <br />   { <br />      printf("Wrong image format\n"); <br />      return false; <br />   }</font></p> <p><font size="2">   //img_convert_ctx = ffmpeg::sws_getCachedContext(img_convert_ctx, getWidth(), getHeight(), <br />      // ffmpeg::PIX_FMT_BGRA, getWidth(),getHeight(), ffmpeg::PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);</font></p> <p><font size="2">   img_convert_ctx = ffmpeg::sws_getCachedContext(img_convert_ctx, getWidth(), getHeight(),  <strong><font color="#ff0000">ffmpeg::PIX_FMT_RGB24</font></strong>,  getWidth(), getHeight(), <strong><font color="#ff0000">ffmpeg::PIX_FMT_YUV420P</font></strong>,  SWS_BICUBIC,  NULL,  NULL,  NULL);</font></p> <p><font size="2">   if (img_convert_ctx == NULL) <br />   { <br />      printf("Cannot initialize the conversion context\n"); <br />      return false; <br />   }</font></p> <p><font size="2">   uint8_t *srcplanes[3]; <br />   srcplanes[0] = (uint8_t*)img.bits(); <br />   srcplanes[1] = 0; <br />   srcplanes[2] = 0;</font></p> <p><font size="2">   int srcstride[3]; <br />   srcstride[0] = img.bytesPerLine(); <br />   srcstride[1] = 0; <br />   srcstride[2] = 0;</font> <br /><font size="2">   ffmpeg::sws_scale(img_convert_ctx, srcplanes, srcstride, 0, getHeight(), ppicture->data, ppicture->linesize);</font></p> <p><font size="2">   return true; <br />}</font></p></blockquote> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-77004575225735318462013-11-26T16:37:00.001+01:002013-11-26T16:38:01.092+01:00开始使用C++/CLI编程<p>一直以来一直是使用C++和C#,最近接触了C++/CLI并开始使用它编写程序,已经写了两三千行程序,使用C++/CLI对一个C++和C#程序员来说简直是轻而易举,C++/CLI也会给我们带来很多好处,有了C++/CLI对于.NET平台上的C++来说就是多了一个非常好用的武器,C++在.NET平台中得到极大的补充,所谓“C++/CLI”是静态C++对象模型到CLI的动态组件对象编程模型的捆绑。简而言之就是如何用C++在·NET中编程,而不是C#或Visual Basic,它实现了ISOC++和.NET的无缝连接。像C#和CLI本身一样符合ISO标准。微软的.NET的基础CLR(Common Language Runtime,通用语言运行时)就是CLI的一个实例。 <br />百度百科,维基百科: <br /><a href="http://baike.baidu.com/view/459502.htm?noadapt=1">http://baike.baidu.com/view/459502.htm?noadapt=1</a> <br /><a href="http://zh.wikipedia.org/wiki/C%2B%2B/CLI">http://zh.wikipedia.org/wiki/C%2B%2B/CLI</a></p> <p>以下内容转载自《C++/CLI in action》</p> <p>The Common Language Infrastructure (CLI) is an architecture that supports a dynamic language-independent programming model based on a Virtual Execution System.</p> <p>The role of C++/CLI</p> <p><a href="http://lh5.ggpht.com/-C1BYpmUMZ7o/UpTAGcjjceI/AAAAAAAABwI/ip1FnNixDJ4/s1600-h/role%252520of%252520c%25252B%25252B%252520cli%25255B2%25255D.png"><img title="role of c cli" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="role of c cli" src="http://lh3.ggpht.com/-9X1nUG4swC0/UpTAHAJK_eI/AAAAAAAABwM/2IRdDnl5IwU/role%252520of%252520c%25252B%25252B%252520cli_thumb.png?imgmax=800" width="244" height="106" /></a></p> <p>C++ has been paired with language extensions before, and the result hasn’t always been pretty. Visual C++ 2005 is the first version of a Microsoft C++ compiler that has implemented the C++/CLI specification. This means three things for the C++ developer: <br />■ C++ can be used to write applications that run on the .NET Framework. There is no need to learn a totally new language or to abandon all the C++ knowledge and experience built up through years of coding. <br />■ C++/CLI lets developers reuse their native C++ code base, saving the agony of having to rewrite all the existing code to enable it to run on the .NET Framework. <br />■ C++/CLI is designed to be the lowest-level language for the .NET Framework. For writing purely managed applications, it’s your most powerful choice; or, as I like to say, “C++/CLI actually lets you smell the CLR (Common Language Runtime).” </p> <p> <br />C++/CLI. C++ with some additional keywords and semantics that support .NET <br />One of the core aspects of the CLR is a unified type system called the Common Type System (CTS). The CTS defines the model followed by the CLR for the declaration and usage of CLI types.</p> <p><a href="http://lh4.ggpht.com/-oRnevXWvlE8/UpTAHlPp_1I/AAAAAAAABwY/laorY2GvMwU/s1600-h/hierarchy%252520of%252520NET%252520framework%25255B3%25255D.png"><img title="hierarchy of NET framework" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="hierarchy of NET framework" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVRZZzbBlGR91bAi5pBBljO8PZ0uQRHrT9jEhKcmoOqwKM6QzNHYAs4o4G1rVxGnngMP3h7VtItVImjSi4dBQRTXEzjJzMB1mSyvZ2OxZcUPCkWoRozkKTHwaO7dt2fmV7vovhOUA7nsPn/?imgmax=800" width="363" height="263" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiyycnEn4rcsQimTEZc5NZ5FlqqwGLrG5oPpkjiLZcmYKpr1VN9EpCfpNiaegd4AUIsLQng-DmDcJDZE_4FDTvrVdL1QzNXz47OU_JqbGBipVyRISKMUzPKUM_2a_UA_p-BYlqS3Dzq1sn/s1600-h/The%252520common%252520language%252520specification%25255B3%25255D.png"><img title="The common language specification" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="The common language specification" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9N0cE-Bk0C6zJTRxx4l4vYHNtYbZZ1UH2qpyW7rB3S8DdSxnoI6PtaFiG6woetc3w446mZNBoZzv8-SSsj2VqC1gqHKT7lNbW-ju28blpyj0hIWIoT7vwqgKH9dO20NgnfxTB2FgN4hz4/?imgmax=800" width="177" height="179" /></a></p> <p>What is the .NET Framework? <br />The .NET Framework provides an abstraction layer on top of the native operating system that allows applications compiled into a special intermediate language called Microsoft Intermediate Language (MSIL) to run under a managed environment— where both execution and memory are managed by various parts of the framework. Its two primary components are the Common Language Runtime (CLR) and an extensive Base Class Library (BCL). The CLR is responsible for the execution of .NET applications, inducing memory management through its built-in Garbage Collector (see the section on memory management for more information), whereas the BCL provides various hierarchical class libraries for creating rich user interfaces (UIs), both for the desktop and for the Web—accessing data, security, web services, and many more commonly-performed programming chores.</p> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com1tag:blogger.com,1999:blog-6976291393224066038.post-50053277588469636062013-11-25T23:53:00.001+01:002013-11-25T23:57:38.188+01:00Ubuntu 12.04无法进GUI mode,无法login解决方法<p>Ubuntu 12.04 出现 autolaunch error 而且直接booting进入command line,根本无法进GUI mode。如果运行sudo startx会出现类似xauth: error in locking authority file .Xauthority的报错,以下是简单的解决方法:</p> <p>先删除所有的.Xauthority files</p> <p>sudo rm -f .Xauthority*</p> <p>然后sudo startx</p> <p>如果还有问题</p> <p>重新安装gnome-desktop-environment</p> <p>sudo apt-get install aptitude (如果没有装aptitutde)</p> <p>sudo aptitude install gnome-desktop-environment</p> <p> </p> <p>####</p> <p>如果进入GUI的login界面,但是无法使用login的password进入系统:</p> <p>按CTRL+ALT+F1 然后log in 再运行:</p> <p>sudo chown -R $USER:$USER $HOME</p> <p>→ 然后重启就可以了</p> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-66773067637441716262013-11-22T23:56:00.001+01:002013-11-22T23:56:13.411+01:00TWINCAT 3使用记录3:建立在PC和slave devices之间的连接<p>如果发现Scan你的EtherCAT Devices出现这样的报错:</p> <p><a href="http://lh6.ggpht.com/-8jBqgv52F7Y/Uo_g_30na5I/AAAAAAAABvE/qdbed2OpP6o/s1600-h/no-io-devices-found2.png"><img title="no io devices found" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="no io devices found" src="http://lh3.ggpht.com/-knLFKaRO2YY/Uo_hAhN5b3I/AAAAAAAABvI/MyJT0zCiNH0/no-io-devices-found_thumb.png?imgmax=800" width="207" height="158" /></a></p> <p>就是有可能没有装上TwinCAT EtherCAT的驱动。</p> <p>在VS2010或2012里TwinCAT -> Show Realtime Compatible Devices可以找到,如下图所示:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6vwTAzSIveD7bhaHG-MniBcRE_opENTRj5pIgwK4RZjVddQrYg0knYlursEZnLdo2c6sf_erFexSYkIGls7q4jSswZakSW_cHBUb3lE6H9eYSke4dapVO7_ty4lWu5hhNoimrJUB_1axG/s1600-h/show-rt-ehernet-devices3.png"><img title="show rt ehernet devices" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="show rt ehernet devices" src="http://lh3.ggpht.com/--h_HGZg4su8/Uo_hBmqJgNI/AAAAAAAABvY/FXbmhBROgNo/show-rt-ehernet-devices_thumb1.png?imgmax=800" width="313" height="223" /></a></p> <p>其实就是启动C:\TwinCAT\3.1\System里的TcRteInstall.exe,下图就是这个工具的界面,只需要点击几下鼠标就可以安装好TwinCAT 实时Enternet Adapters。</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI8GbfwvLo8LT6jwo4Ti7eAdSzElu36cgiNEnVkQbB65ZiU-rPApmCio_QmwOzGRL_m4MjCgTM4QfikDHx6kGVK0I6SQBBXWKHEeQRjfFeCUZiQLebenjnorGB3SukAkrjjsmgWDs0C-fR/s1600-h/Installation-of-RT-Ethernet-Adapters%25255B1%25255D.png"><img title="Installation of RT Ethernet Adapters" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="Installation of RT Ethernet Adapters" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPztopX_Yq5tjIWGl34rqULrR02osjJ8zkKwuWEZVAarRa4lyhQtxkDmUn21e7wmUqkcmcfXe7RQjTLz_x9GA3jjZK90fWiG4ipRbtmFmp2CNNBU8dTUNcoLg4o-04C-s8AsLGwEDnbu4I/?imgmax=800" width="449" height="308" /></a></p> <p>也有可能有些Ethernet adapter无法装上驱动,使之可以连接EtherCAT device,我有一台Sony的笔记本就无法装上驱动。如果顺利安装后,就可以Scan到连接的设备,并进行连接,注意:在Config Mode才可以进行实时Scan设备,而Run Mode不可以。</p> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0tag:blogger.com,1999:blog-6976291393224066038.post-10690443657167870872013-11-21T23:32:00.001+01:002013-11-21T23:34:25.052+01:00TwinCAT 3使用记录2:ADS介绍<p>今天简要地介绍一下ADS和一个简单的实际例程。ADS就是Automation Device Specification,通过使用Beckhoff的ADS接口可以和一些virtual Automation Device或者是Windows的程序相连。如果安装了TwinCAT3可以在C:\TwinCAT\AdsApi\TcAdsDll\Lib\找到TcAdsDll.lib,这就是我们需要的ADS的lib文件。对于ADS接口,最重要的操作就是READ和WRITE了,以下是API的说明。</p> <blockquote> <p><font size="1">long __stdcall AdsSyncWriteReq(    AmsAddr*    pServerAddr,    // Ams address of ADS server <br />                             unsigned long    indexGroup,        //    index group in ADS server interface <br />                             unsigned long    indexOffset,    // index offset in ADS server interface <br />                             unsigned long    length,            // count of bytes to write <br />                             void*                pData                // pointer to the client buffer <br />                            );</font></p> <p><font size="1">__declspec( dllexport ) <br />long __stdcall AdsSyncReadReq( AmsAddr*    pAddr,                        // Ams address of ADS server           <br />                             unsigned long        indexGroup,        //    index group in ADS server interface <br />                             unsigned long        indexOffset,    // index offset in ADS server interface <br />                             unsigned long        length,            // count of bytes to read <br />                             void*                pData                // pointer to the client buffer <br />                            );</font></p> </blockquote> <p>先启动TwinCAT XAE(VS 2010)也就是VS 2010,新建一个TwinCAT的Project。在SYSTEM里的License选项里可以点击“Activate 7 Days Trial License”,然后会出现以下的对话框,填入生成的Code就完成了注册,用于开发,我们可以一直“Activate 7 Days Trial License”并可以使用TwinCAT 3的完整功能。</p> <p><a href="http://lh3.ggpht.com/-IRuWtp30Iy8/Uo6J3wHJq5I/AAAAAAAABto/i09VOjc314Y/s1600-h/enter%252520security%252520code%25255B2%25255D.png"><img title="enter security code" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="enter security code" src="http://lh3.ggpht.com/-aPkAdGsuHiU/Uo6J4Sl_IJI/AAAAAAAABtw/pYK44lJOzqg/enter%252520security%252520code_thumb.png?imgmax=800" width="244" height="99" /></a></p> <p>如果我们使用了Beckhoff的EtherCAT的IO模块,并通过Ethernet线和PC相连,我们可以将这个设备和TwinCAT相连,在Solution Explorer里的I/O一栏里,展开它,点击Devices,点鼠标右键,点选Scan就可以连接我们的EtherCAT I/O模块了,如下图所示,也可使用工具栏上的Scan图标。</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP8ZbPlR10qm_Qemw12a7vUikWNDXYZmRQDqL9sLZSXan-yN-MsuaUnb-Ho5SwzNk284cDR4E-Zb0Ouivynfqn28k2BLI0-l3sy6Kf_7JSE50EGpcLSc-29zm5AcQ7v9059PIw8n0BE3OL/s1600-h/scan_devices%25255B2%25255D.png"><img title="scan_devices" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="scan_devices" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEC7mZXKvdWLze_5J-5EqmlNJ38bBwlFqC1z5Pj9elDg3UUYfLop50-hDg9P4OaWrVJi_cgVCaIzHvDUEeZjpXOi7eE8TbgqjHY0_j_XK5PJAruGh_edLw9REMg5azg2Exvxf7J9OHe9bL/?imgmax=800" width="244" height="128" /></a></p> <p>如果发现有正确连接,就会出现下图的对话框。</p> <p><a href="http://lh3.ggpht.com/-vzeGKiuNYPw/Uo6J5kDiSBI/AAAAAAAABuA/D-uLX2F-oMc/s1600-h/IO%252520devices%252520found%25255B2%25255D.png"><img title="IO devices found" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="IO devices found" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi__8K6pyH6OM2YJEBl1UsiFz_h9B0z6jsG1IS6YbT5i8kayWkgMI8A6gQ5HuzFQAFqbPdeYlW4ukyw0y_88kirTctBC6EyFtMp1KWSOMRtba7S1_6rkLNi0wOM-SC-R6BemneKWz1n2rkP/?imgmax=800" width="244" height="132" /></a></p> <p>点选OK,我们就是Active Free Run了。然后在Solution Explorer会看到Device的信息,如下图所示。</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBGwhShWGK7mRmE-ECwr_z1OIQs9H-e5uqqzjDRwhUpHxjZRvi9VD-R5KQrntkoe7B110r6Z29-QA_jnoU0V4CQjfKEH5wpcKuDJRQCxut-9O3fee7Bnv8H_sAVqLq8WyrW7NAlIMDT7No/s1600-h/device%252520ethercat%25255B2%25255D.png"><img title="device ethercat" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="device ethercat" src="http://lh5.ggpht.com/-4UCue-VBTgM/Uo6J6ykrTVI/AAAAAAAABuc/-UBWTmREB4o/device%252520ethercat_thumb.png?imgmax=800" width="177" height="244" /></a></p> <p>如果我们点选譬如Term 2 (EL2004),并展开它,就会看到这个模块的Channel,如果点击其中一个Channel就会看到上面的I/O,点击这个I/O就会在Variable这个Tab里找到ADS info,如下图所示。</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1LwBh-c_FZO2Xugmpe3YK09drT_4AQk_mHHlQr1Q4hQVUSNs4o0yHZcutEqbCj44x5aCNu63RQaEQDgujVxotq8pSsijEP0XOn86LsiXIPEf4A6Ga_Nb1a5cUsiDPO8bWaHd1OS9f7bG/s1600-h/ads%252520infos%25255B4%25255D.png"><img title="ads infos" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="ads infos" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh9shQ3EDKXquML4aIRNC4exEoNmgL92gj7MmYEyE4yIdot3sNw_AAbbHvylpnYHChtT2MuLoxkbQDoXUb85isppjgNcGzmYoZ6CezKnANbq-7op8ecLsglGHPYH2CBPN_73tapqjLUGCg/?imgmax=800" width="611" height="74" /></a></p> <p>接下来我们就要使用这个ADS Info,并使用上面提到的API对其进行读和写。我们可以在以下链接中找到SAMPLE2(写)和SAMPLE3(读),这两个例程使用了SOFT PLC,提供的PLC可以加载到TwinCAT Project里,这里我们不使用PLC而是直接使用我们上面已经连接好的I/O模块:</p> <p><a href="http://download.beckhoff.com/download/Software/TwinCAT/TwinCAT3/Samples/TC1000-ADS/ADS/C/">http://download.beckhoff.com/download/Software/TwinCAT/TwinCAT3/Samples/TC1000-ADS/ADS/C/</a></p> <blockquote> <p><font size="1">#include <iostream> <br />#include <windows.h> <br />#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsDef.h" <br />#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h"</font></p> <p><font size="1">using namespace std; <br />void main() <br />{ <br />  long     nErr, nPort; <br />  AmsAddr  Addr; <br />  PAmsAddr pAddr = &Addr; <br />  DWORD    dwData;</font></p> <p><font size="1">  // Open communication port on the ADS router <br />  nPort = AdsPortOpen(); <br />  nErr = AdsGetLocalAddress(pAddr); <br />  if (nErr) cerr << "Error: AdsGetLocalAddress: " << nErr << '\n'; <br /><strong><font color="#ff0000">  pAddr->port = 11;</font></strong></font></p> <p><font size="1">  // Read the vlaue of the user, who has to be written to the PLC <br />  cout << "Value: "; <br />  cin >> dwData;</font></p> <p><font size="1">  //Port: 11, IGrp: 0x3040010, IOffs: 0xC10000D1, Len: 1 <br /><font color="#ff0000"><strong>  nErr = AdsSyncWriteReq( pAddr, 0x3040010, 0xC10000D1, 0x1, &dwData );</strong></font> <br />  if (nErr) cerr << "Error: AdsSyncWriteReq: " << nErr << '\n';</font></p> <p><font size="1">  // Close the communication port <br />  nErr = AdsPortClose(); <br />  if (nErr) cerr << "Error: AdsPortClose: " << nErr << '\n'; <br />}</font></p> </blockquote> <p>例程中的代码只需进行两处的改动(红笔处),就可以将我们输入的Data通过ADS接口传递给我们的EtherCAT I/O模块,这里使用的port of ADS server,index group in ADS server interface,index offset in ADS server interface,count of bytes to write,就是我们在上图看到的我们读到的ADS info。对于Read的例程SAMPLE3我就不多加描述了,就是使用AdsSyncReadReq这个API,然后给其相对应的ADS info就行。</p> H-Lihttp://www.blogger.com/profile/13925171437546085791noreply@blogger.com0