| by msbeta | No comments

C++11新特性-std::make_tuple

std::tuple是C++ 11中引入的一个非常有用的结构,以前我们要返回一个包含不同数据类型的返回值,一般都需要自定义一个结构体或者通过函数的参数来返回,现在std::tuple就可以帮我们搞定。

1.引用头文件

2. Tuple初始化

std::tuple的初始化可以通过构造函数实现。

这种初始化方式要定义各个元素的数据类型,比较繁琐,C++11也提供了另外一种方式std::make_tuple。

3. std::make_tuple

这种初始化方式避免需要逐个指定元素类型的问题,自动化实现各个元素类型的推导。

完整例子一:

[……]

继续阅读

Read More
| by msbeta | No comments

私域流量和下沉中的互联网

私域流量这个词出现很久了,只是一直没有想明白,为什么一直以开放、共享著称的互联网在移动互联网时代突然走向割裂,每个企业都试图把用户圈在自己的城池之中,最突出、最典型的就是头条号、企鹅号、百家号、微信公众账号、大鱼号、抖音、微信短视频以及各大直播产品,这些产品内容互不相通,都在努力的打造属于自己的封闭流量;各个商户也在不遗余力的推广自家店铺的公众号,推出各种扫码打折优惠活动。

最近才想明白,这其实是互联网对人类社会的一次更大程度的重塑。互联网从出现以后就一直在重塑人类社会的生产关系,只不过早期的互联网承载的大多是信息。它极大的降低了信息传播的成本,很大程度上消除了人类知识和信息的隔阂。在这[……]

继续阅读

Read More
| by msbeta | No comments

车道线识别-相机校正(Camera Calibration)

1.准备

这里使用OpenCV提供的棋盘格方法进行标定。在黑白相间的棋盘格上,二维图像的角点很容易通过角点检测找到,而棋盘格标定板的方块尺寸和放置位置是已知的。因此可以通过不同角度的Camera图片标定相机的参数。

获取不同角度的标定图像:

2. 相机标定(Camera Calibration)

OpenCv的cv2.findChessboardCorners()可以检测棋盘格图片的内角点,它的输入是棋盘格的灰度(grayscale)图片和棋盘格内角点的个数,输出就是棋盘格的内角点坐标。

计算得到棋盘格的内角点(Image Points)之后,再结合已[……]

继续阅读

Read More
| by msbeta | No comments

应对非结构化的世界

世界是非完全结构化的,至少目前是这样…

程序追求的是结构化的、明确的输入,比如你要叫外卖,这时候你需要告诉APP,你要哪一家饭店的哪一种美食。这种详细而准确的信息就是结构化的信息。

但是你如果告诉一台智能音箱:我很难过,那么机器根本不会理解你的情绪,它所做的只能从已有的数据库中匹配到与难过相关的关键词,推送一些信息,而这些信息可能与你的需求大部分谬以千里。

程序员整天面对结构化的信息,与机器打交道,时间久了就会无意识的陷入确定化的陷阱,凡事都追求有理有剧,任何一个改变都会去寻找原因,并根据原因去尝试推导结果,如果没有推导出确切的结论,就难以下定决心去做决策。这对程序员来说,是[……]

继续阅读

Read More
| by msbeta | No comments

自动驾驶中的PID控制算法

PID控制算法是一个在工业控制应用中常见的反馈回路算法,它把收集到的数据和一个参考值进行比较,然后把这个差别用于计算新的输入值,从而使得整个系统更加准确而稳定。

PID控制算法由比例单元(Proportional)、积分单元(Integral)和微分单元(Derivative)三部分组成,通过这三个单元的增益${\displaystyle K_{p}}$,${\displaystyle K_{i}}$和${\displaystyle K_{d}}$来达到理想的控制效果。

PID主要适用于基本上线性,且动态特性不随时间变化的系统。

下面我们主要了解PID控制算法的细节及其在[……]

继续阅读

Read More
| by msbeta | No comments

Ubuntu 18.04安装微信和迅雷

由于开发需要,个人电脑上只安装了Ubuntu系统,但是很多软件并不支持Ubuntu系统,所以再网上找了很多安装微信和迅雷的方法。

1、XwareDesktop(迅雷)

XwareDesktop是网上讲的比较多的一款软件,不过作者已经弃坑了。项目的Github地址: https://github.com/Xinkai/XwareDesktop 。项目的资料比较完整,各个环节的问题和说明也比较详细。

由于作者长时间不维护了,最近的更新在五六年前。按照项目中Ubuntu编译打包安装之后,始终无法启动,所以放弃了。

2、Deepin wine for Ubuntu and[……]

继续阅读

Read More
| by msbeta | No comments

C++多线程编程-揪出高CPU占用的线程

在工程实践中,有很多对性能要求比较苛刻的场景,要求CPU的占用不能超过指定的阈值,以保证系统整体的实时响应。本文主要记录下如何抓出CPU占用高的线程。

假设有如下业务代码:

代码编译:

g++ cpu.cpp -o cpu -pthread -g

1.定位线程

使用top命令,定位高占用的进程。

$top
2988 xxx   20   0   32564   1860   1708 S  99.3  0.0  24:27.84 cpu         
20178 xxx   20   0 5067244 195804 118856 S   1.7[......]

继续阅读

Read More
| by msbeta | No comments

计算机视觉-Camera标定

1、像素坐标系与图像坐标系之间的关系

假设每一个像素在u轴和v轴方向上的物理尺寸为dx和dy

2、图像坐标系到相机坐标系

3、世界坐标系到相机坐标系

于是,从世界坐标系到像素坐标系的转换关系:

4、其他情况

考虑像素坐标系坐标轴不垂直的情况(实际相机由于制造工艺上的问题,导致物理成像坐标轴不是绝对垂直),如下图所示,假设O1在UV坐标系下的坐标为(u0, v0),像素的物理尺寸仍然为dx,dy,则有

矩阵形式如下:

世界坐标系与像素坐标系转换关系:

[……]

继续阅读

Read More
| by msbeta | No comments

计算几何-凸包(Convex Hull)

凸包(Convex Hull)是计算几何中的一个经典常用的算法。它解决的问题在于给定空间一堆离散的点,计算包含所有点的凸多边形。

凸的定义

凸是指图形内任意两点的连线都不经过图形内部。

计算凸包时要考虑一些特殊情况,比如凸包上多点重叠,凸包上多点共线,通常我们会倾向于用最少的点来描述凸包。

凸包算法伪代码

凸包算法C++实现

算法时间复杂度

由于做了一次排序算法的时间复杂度O(NlogN),两个for循环的时间复杂度为O(N),所以整体的时间复杂度为O(NlogN).

[……]

继续阅读

Read More
| by msbeta | No comments

数据结构与算法-计算二叉树的深度和最大宽度

在数据结构中,二叉树是一种非常基础的数据结构,无论是在面试中,或者实际应用中,都有非常普遍的用途。

1.数据结构定义:

2.二叉树的深度

二叉树的深度:

根结点所在的层数为1,根结点的孩子结点所在的层数为2,以此类推,深度是指所有结点中最深的结点所在的层数。

3.求解思路:

我们可以从根节点和左右子树来理解二叉树的深度。对于任意一棵非空二叉树,有如下四种情况:

1) 如果二叉树只有一个节点,它的深度是1;

2) 如果根节点只有左子树而没有右子树,那么二叉树的深度应该是其左子树的深度加1;

3)如果根节点只有右子树而没有左子树,那么二叉树[……]

继续阅读

Read More