这一年也大概读了六十多本书吧,大概每周读一本书。今年经过努力学习、研究和实践掌握了不少的新技术和领导和管理方法。
长话短说,对我而言2017年最重要的三件事情:
- 我们家老二出生
- 公司的产品的产品化,虽然走不少弯路
- 对团队的培训,团队慢慢显示出了极强的战斗力
今年很多挑战都完成得不错。希望明年能和团队一起继续努力和进步,把公司和公司的产品做得更好。继续努力学习做两个娃的好爸爸,能多一点时间陪陪家人。
H-Li 一个电子工程师的博客。若无特别说明,此处文章皆为原创,网友转载本博客文章请保留出处。
INTER_NEAREST 最近邻插值,是最快的method并且创建blocky images并选择1个pixel去替代几个pixels,这样做得到图像的结果效果比较差。
INTER_AREA 也是一个快速计算方法,它取几个pixels的平均值,所以它比较适合缩小图像,而不是放大图像。
INTER_LINEAR 使用双线性的插值去改变图像尺寸,组成几个pixels在一起(在很多情况下是比较好的选择,但是计算速度比较慢)。
INTER_CUBIC 使用的是双三次的插值,但是计算机量比较大,所以运行速度慢,而且有时候结果看起来比较好,有时候比较差。
sprintf(smem_options_transcode,"#transcode{venc=x264{preset=ultrafast,tune=zerolatency},acodec=none}:rtp{mux=ts,dst=127.0.0.1,port=5004}");
在Qt中使用QWebView播放flash文档(swf格式),需要加入NPSWF32.dll这个plugin,如果使用plugin要使用下面代码,去允许使用plugin:
QWebSettings *settings = QWebSettings::globalSettings();
settings->setAttribute (QWebSettings::PluginsEnabled, true);
但是如果还是无法显示flash文档,其实原因是Qt无法找到正确的plugin路径,需要使用类似以下代码,告诉Qt正确的含有NPSWF32.dll的plugin路径:
QString path = QDir::currentPath() + "/webplugins";
qputenv("QTWEBKIT_PLUGIN_PATH", path.toLocal8Bit());
最近的带的项目陷入了软件开发的危机,原因是陷入自家写的库造成的泥沼越来越深。
最近几年带的大的软件项目都是使用自家写的库,工具库utils,开发库commDev,核心库core,api库,可视化库viz等等。当然了使用自家的库开发软件有时候非常有效率,但是自家开发库的升级以及维护绝对是一个大问题,维护超过5万行程序本身就是一个大问题,而且这几年来因为项目压力,常常直接将很多东西放入核心库core里,导致核心库臃肿不堪,而且关于库的使用的实例程序以及接口或者api更本做不到时常更新,有很多文档已经四五年了,更本无法使用,所以导致最最大的痛苦是教新人使用我们的库。更为恐怖的是核心库对其他外部库的依赖越来越多,从OpenCV,Boost到现在的至少10个以上的第三方库,但是核心库更本也没有根据外部库进行更新,至今核心库还在使用OpenCV2.0。更为痛苦的是自家写的库还是使用VS2008进行编译,因为实在太大,以至于没有人有勇气进行修整,并使用最新的编译器进行编译。
现在实在受不了了,我终于决定重写核心库,并且放弃工具库utils,开发库commDev,api库,可视化库viz。新的核心库只有两个依赖OpenCV和Qt这两个第三方库的巨无霸。放弃的工具库utils,开发库commDev,api库,可视化库viz,全部使用Qt代替。新的核心库就叫CoreLite,只依赖于最新的Qt5.3和OpenCV2.49,保持绝对的精简,而且可以根据Qt和OpenCV的升级进行编译,而且使用VS2012进行开发和编译,希望能做到根据OpenCV更新的频率进入版本更新。
目前想到的就是这些了,以后在重新的过程中,如果还有什么想法,我希望能写下来记录一下,期望可以用一个星期将新的核心库改写完成。
最近遇到一个问题,在一台机器上使用VS 2008编译的程序无法在其他机器上运行,马上想到了以前提到过的关于Side-by-Side问题, 但是安装了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,所以程序就无法运行了。
解决的方法就是使用在release模式下编译,或者如下图所示,修改C++ Project的Property里的Linker-->Debugging选项页,将Generate Debug Info修改成No,将Debuggable Assembly改成No Debuggable attribute emitted,原来如下图a所示,修改后如下图b所示:
现在再编译一次,查看一下新生成的DLL的Manifest可以发现Microshoft.VC90.DebugCRT的依赖已经没有了,现在程序应该可以在其他机器上运行了。
最近开始使用Emgu CV,也就是在.NET可以使用的OpenCV,Emgu CV是一个.Net的wrapper。使用从C++转到C#中写OpenCV代码,开始时候还真的很不习惯,以下将简单整理一下最近的一些笔记。
如何将Grayimage转换到Matrix<float>,注意rows cols和height width的关系:
Image<Gray, float> img = new Image<Gray, float>("c:\\test_image.jpg");
int rows = img.Height;
int cols = img.Width;
Matrix<float> tmp_matrix= new Matrix<float>(rows, cols);
CvInvoke.cvConvert(img, tmp_matrix);
如何显示图:
//The name of the window
String win1 = "Test Window";
//Create the window using the specific name
CvInvoke.cvNamedWindow(win1);
Image<Bgr, Byte> img = new Image<Bgr, Byte>("c:\\test_image.jpg");
CvInvoke.cvShowImage(win1, img.Ptr);
//Wait for the key pressing event
CvInvoke.cvWaitKey(1);
//Destory the window
CvInvoke.cvDestroyWindow(win1);
如何画一个正方形在图上:
Rectangle box = new Rectangle(121, 57, 75, 97);
Image<Bgr, Byte> img = new Image<Bgr, Byte>("c:\\test_image.jpg");
img.Draw(box, new Bgr(Color.DarkOrange), 2);
如何计算一个积分图integral image,在C++中我们可以使用integral(frame, imageIntegral, CV_32F),在C#中可以这样做:
Image<Gray, double> cvImageIntegral = null;
cvImageIntegral = frame.Integral();
如何计算标准差,标准差就是方差的算术平方根,反映组内个体间的离散程度,标准差与期望值之比为标准离差率。
Matrix<float> mat = ... // your input matrix
MCvScalar average = new MCvScalar();
MCvScalar std = new MCvSaclar();
CvInvoke.cvAvgSdv(mat, ref average, ref std, IntPtr.Zero);
以下设定最好是使用Intel network chipset的网卡,并确保使用最新的驱动
我们要做的就是optimize bandwidth,improve efficiency
在Win7下选择Local Area Connection → 鼠标右键,点选Properties → 点击Configure → 选择Advanced Tab
1. set interrupt moderation rate to extreme
2. set maximize jumbo packets
3. maximize number of receive buffers
4. disable power saving on the network card
如果要使用real-time特性,那么需要我们的网卡支持。据我的测试(五台不同的笔记本,一台台式机),所有使用Intel芯片的网卡都支持real-time,其他的芯片组都不支持。网上据说Realtek 的部分芯片组支持,但是我没有测试过。
理论上系统允许我们使用所谓的"incompatible"网卡,但是real-time特性会被限制,而且无法对其安装TwinCAT的real-time Ethernet驱动。
总结最好就是使用EtherCAT "Compatible" 网卡,最简单的方法就是选择带有Intel芯片的网卡。