pure virtual function call,MFC怎么点击任务栏上的图标让隐藏的对话框?
在MFC向导自动生成的对话框类的源代码中,如果没有OnInitDialog()函数,需要手动向其中添加,具体方法如下:
1.在ClassView向导中右键单击弹出的对话框类名,选择AddVirtualFunction;
2.在弹出的对话框左边列表中选择OnInitDialog函数,并单击AddandEdit按钮;
3.在生成的OnInitDialog()函数中添加上述语句。或者在子窗口的OnInitDialog()里添加ModifyStyleEx(0,WS_EX_APPWINDOW);ShowWindow(SW_SHOW);
vrf原理?
VRF(VPN Routing and Forwarding)是一种虚拟路由技术,它可以在同一网络设备上创建多个虚拟路由表,每个虚拟路由表都可以独立地维护和处理路由信息,相互之间互不干扰。这种技术可以实现多租户网络隔离和安全性的提高,也可以提高网络的可伸缩性和灵活性。
VRF原理如下:
1. 创建虚拟路由表:在网络设备上创建一个或多个虚拟路由表,每个虚拟路由表都有自己的路由策略和路由信息,并且相互之间互不干扰。
2. 分配接口和IP地址:将每个虚拟路由表与特定的接口和IP地址绑定,以确保每个虚拟路由表都能够独立地处理数据包。
3. 配置路由:在每个虚拟路由表中配置适当的路由策略和路由信息,以确保数据包能够被正确地路由到目的地。
4. 数据包转发:当数据包到达网络设备时,根据目的IP地址和接口,将数据包路由到相应的虚拟路由表中,并根据虚拟路由表中的路由信息进行转发。如果数据包无法匹配到任何虚拟路由表中,则被丢弃。
通过VRF技术,不同的租户可以使用同一网络设备,但是它们的数据包在网络设备中是相互隔离的,可以提高网络的安全性和可伸缩性。VRF技术在企业网络和服务提供商网络中得到广泛应用。
对编程的要求有多高?
说到SLAM,许多人会提MATLAB,主要原因是大多数人本科阶段接触的都是MATLAB,所以希望之后研究SLAM也用它。
MATLAB确实有很多优点:语法简单,开发速度快,调试方便,功能丰富。然而,在SLAM领域,MATLAB缺点也很明显,主要是这三个:
1.需要正版软件(你不能实机上也装个盗版MATLAB吧);
2.运行效率不高;
3.需要一个巨大的安装包。
而相对的,C++的优势在于直接使用,有很高的运行效率,不过开发速度和调试方面慢于MATLAB。
不过光运行效率这一条,就够许多SLAM方案选择C++作为开发语言了,因为运行效率真的很重要。
同一个算法,如果拿MATLAB写的不能实现实时,而拿C++写的能实现实时的话,你说用哪个?
当然,MATLAB也有一些用武之地。我见过一些SLAM相关的公开课程,让学生用MATLAB做仿真,交作业,这没有问题,比如SLAM toolbox 。
同样的,比较类似于MATLAB的Python(以及octave)亦常被用于此道。它们在开发上的快捷带来了很多便利,当你想要验证一些数学理论、思想时,这些都是不错的工具。技多不压身,掌握MATLAB和Python当然是很棒的。
但是一牵涉到实用,你会发现几乎所有的方案都在用C++。 因为运行效率实在是太重要了。
那既然有心思学MATLAB,为什么不学好C++呢?
接下来说说C++大概要学到什么程度
用程序员的话说,C++语言比较特殊,你可以说自己精通了Java,但千万不要说自己精通了C++。C++非常之博大精深,有数不清的特性,而且随着时间还会不断变化更新。不过,大多数人都用不着学会所有的C++特性,因为许多东西一辈子都用不到。
作为SLAM研究人员,我们面对的主要是算法层面的开发,所以更关心如何有效地实现各种相关的算法。而相对的,那些复杂的软件架构,设计模式,我个人认为在SLAM中倒是占次要地位的。毕竟,用SLAM的目的是计算一个位置以及建个地图,并不是要去写一套能够自动更新的、多人网上对战功能的机器人大战平台。
你的主要精力可能会花在矩阵运算、分块、非线性优化的实现、图像处理上面;你可能对并发、指令集加速、GPU加速等话题感兴趣,也可以花点时间学习;你还可能想用模板来拓展你的算法,也不妨一试。
相应的,很多功能性的东西,比如说UI、网络通信等等,当你用到的时候不妨接触一下,但专注于SLAM上时就不必专门去学习了。
话虽这样说,SLAM所需的C++水平,大抵要高于你在书本上看到的那些个示例代码。因为那些代码是作者用来向初学者介绍语法的,所以会尽量简单。而实际见到的代码往往结合了各种奇特的技巧,乍看起来会显得高深莫测。
GeoTalks
研究SLAM,对编程的要求有多高?半闲居士·2016-11-22 19:16
说到SLAM,许多人会提MATLAB,主要原因是大多数人本科阶段接触的都是MATLAB,所以希望之后研究SLAM也用它。
MATLAB确实有很多优点:语法简单,开发速度快,调试方便,功能丰富。然而,在SLAM领域,MATLAB缺点也很明显,主要是这三个:
1.需要正版软件(你不能实机上也装个盗版MATLAB吧);
2.运行效率不高;
3.需要一个巨大的安装包。
而相对的,C++的优势在于直接使用,有很高的运行效率,不过开发速度和调试方面慢于MATLAB。
不过光运行效率这一条,就够许多SLAM方案选择C++作为开发语言了,因为运行效率真的很重要。
同一个算法,如果拿MATLAB写的不能实现实时,而拿C++写的能实现实时的话,你说用哪个?
当然,MATLAB也有一些用武之地。我见过一些SLAM相关的公开课程,让学生用MATLAB做仿真,交作业,这没有问题,比如SLAM toolbox 。
同样的,比较类似于MATLAB的Python(以及octave)亦常被用于此道。它们在开发上的快捷带来了很多便利,当你想要验证一些数学理论、思想时,这些都是不错的工具。技多不压身,掌握MATLAB和Python当然是很棒的。
但是一牵涉到实用,你会发现几乎所有的方案都在用C++。 因为运行效率实在是太重要了。
那既然有心思学MATLAB,为什么不学好C++呢?
接下来说说C++大概要学到什么程度
用程序员的话说,C++语言比较特殊,你可以说自己精通了Java,但千万不要说自己精通了C++。C++非常之博大精深,有数不清的特性,而且随着时间还会不断变化更新。不过,大多数人都用不着学会所有的C++特性,因为许多东西一辈子都用不到。
作为SLAM研究人员,我们面对的主要是算法层面的开发,所以更关心如何有效地实现各种相关的算法。而相对的,那些复杂的软件架构,设计模式,我个人认为在SLAM中倒是占次要地位的。毕竟,用SLAM的目的是计算一个位置以及建个地图,并不是要去写一套能够自动更新的、多人网上对战功能的机器人大战平台。
你的主要精力可能会花在矩阵运算、分块、非线性优化的实现、图像处理上面;你可能对并发、指令集加速、GPU加速等话题感兴趣,也可以花点时间学习;你还可能想用模板来拓展你的算法,也不妨一试。
相应的,很多功能性的东西,比如说UI、网络通信等等,当你用到的时候不妨接触一下,但专注于SLAM上时就不必专门去学习了。
话虽这样说,SLAM所需的C++水平,大抵要高于你在书本上看到的那些个示例代码。因为那些代码是作者用来向初学者介绍语法的,所以会尽量简单。而实际见到的代码往往结合了各种奇特的技巧,乍看起来会显得高深莫测。比方说你在教科书里看的大概是这样:
int main ( int argc, char** argv ) { vector<string> vec; vec.push_back("abc"); for ( int i=0; i<vec.size(); i++ ) { // ... } return 0; }
你看了C++ Primer Plus,觉得C++也不过如此,并没有啥特别难以理解的地方。然而实际代码大概是这样的:
嵌套的模板类(来自g2o的块求解器):
g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >::LinearSolverType* linearSolver = new g2o::LinearSolverDense<g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >::PoseMatrixType>(); g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >* solver_ptr = new g2o::BlockSolver< g2o::BlockSolverTraits<3,1> >( linearSolver ); g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );g2o::SparseOptimizer optimizer; optimizer.setAlgorithm( solver );
模板元(来自ceres的自动求导):
virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const { if (!jacobians) { return internal::VariadicEvaluate< CostFunctor, double, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9> ::Call(*functor_, parameters, residuals); } return internal::AutoDiff<CostFunctor, double, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Differentiate( *functor_, parameters, SizedCostFunction<kNumResiduals, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::num_residuals(), residuals, jacobians);}
C11新特性(来自SVO特征提取部分)
void Frame::setKeyPoints(){ for(size_t i = 0; i < 5; ++i) if(key_pts_[i] != NULL) if(key_pts_[i]->point == NULL) key_pts_[i] = NULL; std::for_each(fts_.begin(), fts_.end(), [&](Feature* ftr){ if(ftr->point != NULL) checkKeyPoints(ftr); });}
谜之运算(来自SVO的深度滤波器):
void DepthFilter::updateSeed(const float x, const float tau2, Seed* seed){ float norm_scale = sqrt(seed->sigma2 + tau2); if(std::isnan(norm_scale)) return; boost::math::normal_distribution<float> nd(seed->mu, norm_scale); float s2 = 1./(1./seed->sigma2 + 1./tau2); float m = s2*(seed->mu/seed->sigma2 + x/tau2); float C1 = seed->a/(seed->a+seed->b) * boost::math::pdf(nd, x); float C2 = seed->b/(seed->a+seed->b) * 1./seed->z_range; float normalization_constant = C1 + C2; C1 /= normalization_constant; C2 /= normalization_constant; float f = C1*(seed->a+1.)/(seed->a+seed->b+1.) + C2*seed->a/(seed->a+seed->b+1.); float e = C1*(seed->a+1.)*(seed->a+2.)/((seed->a+seed->b+1.)*(seed->a+seed->b+2.)) + C2*seed->a*(seed->a+1.0f)/((seed->a+seed->b+1.0f)*(seed->a+seed->b+2.0f)); // update parameters float mu_new = C1*m+C2*seed->mu; seed->sigma2 = C1*(s2 + m*m) + C2*(seed->sigma2 + seed->mu*seed->mu) - mu_new*mu_new; seed->mu = mu_new; seed->a = (e-f)/(f-e/f); seed->b = seed->a*(1.0f-f)/f;}
我不知道你们看到这些代码是什么心情,总之我当时内心的感受是:这怎么和教科书里的完全不一样啊!而且研究了半天发现人家居然是对的啊!
[我不是很擅长贴表情图总之你们脑补一下就好]
总而言之,对C++的水平要求应该是在教科书之上的。而且这个水平的提高,多数时候建立在你不断地看别人代码、码自己代码的过程之上。它是反复练习出来的,并不是仅仅通过看书就能领会的。特别是对于视觉SLAM问题,很多时候你没法照着论文把一套方案实现出来,这很大程度上取决于你的理论和代码功底。
所以,请尽早开始学习C++,尽早开始使用C++,才是研究SLAM的正确之道。
不要长期彷徨在自己的舒适区里犹豫不决,这样是没有进步的。(同样的道理亦适用于想研究SLAM但不愿意学习Linux的朋友们)
关于闭环检测的库,稍微列几个
1.DBoW系列
来自TRO12的一篇文章,里头用k-means++训练的字典树。与OpenCV结合紧密,原理亦比较简单。
GitHub - dorian3d/DBoW2: Enhanced hierarchical bag-of-word library for C++(https://github.com/dorian3d/DBoW2)
GitHub - rmsalinas/DBow3: Improved version of DBow2
(https://github.com/rmsalinas/DBow3)
2.FABMAP系列
用了Chow-Liu树,来自Cummins的一系列论文。作者自己提供过一个开源版本,OpenCV也有人实现了一个,所以一共两种。
FabMap原版(http://www.robots.ox.ac.uk/~mjc/Software.htm)
OpenCV:OpenFABMAP
(http://docs.opencv.org/2.4/modules/contrib/doc/openfabmap.html)
3.DLoopDetector
在DBoW2基础上开发的回环检测库(https://github.com/dorian3d/DLoopDetector)
建议从DBoW2或者DBoW3开始入手研究。原理和实现都相对简单一些,效果也比较好。
template中typename和class有什么区别?
从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别:
(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。
不能因为学过C就总觉得连C++中struct和class都区别很大,下面列举的说明可能比较无聊,因为struct和class本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于struct和class的错误认识:
(1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
(2)都可以有一大堆public/private/protected修饰符在里边;
(3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:Aa={1,2,3};不管A是个struct还是个class,前提是这个类/结构足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的构造函数。
(4)都可以进行复杂的继承甚至多重继承,一个struct可以继承自一个class,反之亦可;一个struct可以同时继承5个class和5个struct,虽然这样做不太好。
(5)如果说class的设计需要注意OO的原则和风格,那么没任何理由说设计struct就不需要注意。
(6)再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也只是个包装数据的语法机制。
最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
如果没有多态和虚拟继承,在C++中,struct和class的存取效率完全相同!简单的说就是,存取class的datamember和非virtualfunction效率和struct完全相同!不管该datamember是定义在基类还是派生类的。
如果不是为了和C兼容,C++中就不会有struct关键字。因此建议是:如果不需要与C兼容或传递参数给C程序,不要在C++中用struct。
注意class的datamember在内存中的布局可不一定是datamember的申明次序。C++只保证处于同一个accesssection的datamember按照申明次序排列。
struct所体现的是一种数据结构,而class则是体现OOP思想中的"封装"的特性~~~
还有一个区别:struct可以用{}赋初值,而class不行
比如声明如下:
structabc{intm1;floatm2;boolm3;}
可以这么构造对象:
abcabcInstance{1,1.0f,false};
struct:属性
class:属性+行为
注意:在VC6里,class可以与模板关键字typename互换,但是struct好像就不可以,编译好像通不过。对这个问题,我专门查了一些资料,发现网上确实有说struct不能用于模板关键字而class可以,这似乎应该是他们的一个不同了。然而,我又看了一下《深度探索C++对象模型》,在书的前几章(好像就是第一章)Lippman说:本来他的编译器是不支持将struct作为模板关键字的,但后来改变了,也就是说struct和class除了默认的访问属性外,其他场合下真正的完全一样了。对此,我认为这个按理说是这样的,但不同的编译器可能会有自己的处理,就像VC6那样。
class中有方法,
struct中没有.
class是一个扩展的struct
array(类型一样)->struct(类型可以不一致)->class(添加方法)
虽然两者都可以捆绑行为。
但是,理解不一样。
struct,就是对程序员全局可见的数据与方法。简化数据逻辑结构的设计。可以说是一种自定义的数据结构。
而class,则是将数据与方法封装,即让行为与数据一致。则是一种编程方法。即客观世界在代码世界中的体现。体现的是一种编程思想。
在C里面:struct不能包含函数,而class可以。
在C++里面:都可以有函数,默认情况下struct中变量是public,而class中是private
有一点不明白,class支持的继承和多态,struct也支持??
class在赋值运算符右边出现需要有定义的拷贝构造函数,而struct是默认的位拷贝.
但是一般从兼容C的角度考虑,struct里面只包含数据成员而不包含成员函数,这只是一个编程习惯问题。
驱动级鼠标键盘模拟有哪些?
驱动级鼠标键盘模拟主要是指通过软件模拟鼠标和键盘操作,以替代实际的硬件鼠标和键盘进行操作。以下是一些常见的驱动级鼠标键盘模拟方法:
AutoHotkey:一款免费的自动化脚本语言,可以模拟键盘、鼠标操作,支持自定义脚本,具有很高的灵活性和扩展性。
Input Director:一款可以在多个计算机之间共享鼠标和键盘的软件,可以在多个计算机上进行操作,实现鼠标和键盘的模拟。
Mouse Recorder Pro:一款免费的鼠标录制和回放工具,可以记录鼠标和键盘的操作,然后回放这些操作,从而实现鼠标和键盘的模拟。
Windows Input Simulator:一款免费的Windows API库,可以在Windows平台上模拟鼠标和键盘操作,支持多种编程语言,如C#、VB.NET等。
VJoy Virtual Joystick:一款免费的软件,可以将鼠标和键盘操作转换为虚拟游戏手柄的输入信号,从而实现鼠标和键盘的模拟。
需要注意的是,驱动级鼠标键盘模拟可能会被部分游戏和应用程序视为“外挂”而被禁止使用,因此在使用前应该了解相关的使用规定和风险。
还没有评论,来说两句吧...