凉面总结之TCL图像工程师面试

TCL宣讲会之后第二天就喊我去面试了,然而前几天的我还在玩游戏,并没有好好准备,自然是凉了,做过的项目的技术细节很多都没能说的上来。痛定思痛,来一波公开处刑!


全景图像融合的原理?

因为JD上写的是手机图像相关的开发&调试,数图课设刚好做过这个,本来是一个不错的加分项,然而面试的时候只讲到特征点检测,后面基本口胡 - -!

在OpenCV中,全景图像融合分为两步:图像对齐和图像融合,一般流程是:①特征点检测,目前有比较多的特征点检测的方法,比如FAST,ORB,SIFT等,各有优劣势。在多幅图像中检测特征点及其描述子。②使用这些特征点来计算单应矩阵并估计相机内外参数。单应矩阵可以将一个射影平面映射到另一个摄影平面上。③使用光束平差法来精细化相机参数。④使用波形矫正来消除波形效应,因为拍摄过程中有可能出现上下抖动的情况。⑤根据单应矩阵、内外参数以及波形矫正矩阵来对图像进行几何变换,完成图像对齐的过程。⑥图像对齐之后,一般还要对边缘进行融合过渡。简单的方法是简单的加权过渡,效果比较好的方法是使用拉普拉斯融合。⑦亮度归一化(曝光补偿),使整体画面亮度保持一致。

OpenCV stitcher pipline

OpenCV 单应矩阵应用:全景图像融合原理

双目视觉机器人里你用的是张正友标定法,请问张正友标定法的原理?

如果能说上一些细节,那自然是很好,但现场只是笼统地说“用数学上的办法”得到畸变参数,噗。。这个项目是我做的最有代表性的,没讲清楚就很尴尬了。

相机标定的目标是得到相机的内外参数,来矫正相机本身的畸变。内参数包括x轴和y轴方向的焦距和光心,外参数是每个视图的旋转矩阵和平移向量。畸变包括切向畸变径向畸变。通过计算内外参数,可以估计到畸变参数,以对相机进行矫正。

张氏标定法一般流程:①获取多个不同视角的参照物的图像,这里一般使用的是标准的棋盘格。②检测棋盘格上的角点,使用这些角点来计算每个视图的单应矩阵,并使用最大似然估计的优化方法来得到内外参数。③使用内外参数来估计畸变参数,包括3个径向畸变参数和2个切向畸变的参数。④根据畸变参数,重映射得到矫正后的图像。OpenCV中的标定函数中会通过多次迭代来优化标定效果。

《Learning OpenCV3》ch18:相机模型与标定

立体视觉的实现原理?

立体视觉的目标在于使用两个或多个摄像头同时获取视图,来得到物理世界中的三维坐标点。在双目视觉中,得到三维坐标点的方法是使用三角测量原理,它假设双目摄像头完全平行并对齐且没有畸变,则可以使用相似三角形的原理来得到物理坐标点。

但实际情况中,需要进行双目标定来计算内外参数并矫正,方法跟一般标定类似(角点检测,计算单应矩阵等)实现数学上的正向对齐。此外,要使用三角测量原理需要要得到像素点的视差,得到视差的方法是进行立体匹配,在OpenCV中匹配算法包括BM和SGBM等。最后,根据两个摄像机的内外参数来构造重投影矩阵,重投影矩阵可以根据视差将视图上的二维点映射到三维点上,实现立体视觉。

《Learning OpenCV3》ch19:双目标定与立体匹配

霍夫变换原理?

霍夫变换是一种在图像中检测特定形状的一种方法,它首先需要进行边缘检测,并通过在参数空间中进行投票累计(并求取局部最大值)的方式来进行形状检测。比如直线有截距和斜率两个参数,圆有圆心坐标和半径共三个参数,霍夫变换即是在这些参数的基础上进行形状检测的。在OpenCV中,霍夫直线变换会将直线方程转换为极坐标的形式,霍夫圆变换会通过霍夫梯度法的方式得到候选圆心,来提高算法的运行速度。

高斯滤波原理?应用场合?

高斯滤波基本操作,但可以稍微扩展一下,尤其是可以扯一扯傅里叶变换和频率域滤波去噪。

图像噪声大部分属于高斯噪声,高斯滤波可以有比较好的去噪效果,对其他种类的噪声也有一定的抑制效果。类似的滤波有中值滤波,一般用于处理椒盐噪声。如果要在去噪时尽量保持边缘信息,可以使用双边滤波,这种滤波方法考虑了邻域信息。以上提到的滤波都是在空间域中进行的,图像去噪也可以在频率域中进行。对图像进行傅里叶变换之后再使用带通滤波器,可以抑制一些出现在特定频段上的噪声,比如莫尔波纹。

OpenCV 频率域处理:离散傅里叶变换、频率域滤波
OpenCV 图像滤波:双边滤波算法

项目里摄像头的驱动是使用什么协议?IIC通信协议的组成?

没碰单片鸡好多年,面的图像居然问起嵌入式,给大佬低头 - -!

IIC协议是一种用于微控制器和外围设备进行通信和控制的协议。它由数据线SDA和时钟SCL构成的串行总线组成,能够进行双向传送,是半双工通信方式。

HALCON项目里的分割阈值你是怎样选取的?(otsu阈值分割原理?)

我当时说是在直方图里随便选个阈值就行了,不过其实不用那么耿直,可以扯一扯otsu。

Otsu是一种自动选取阈值进行分割的方法。它首先计算图像归一化后的直方图,并选取一个阈值进行类间方差的计算。通过穷举的方法计算所有阈值取值的类间方差,类间方差最大时所选取的阈值就是otsu认为的最佳阈值。

简历上你写着你有C语言和C++各个平台的开发经历,请问单片鸡、arduino、PC这些环境下C/C++的编译器有哪些?

万万没想到可以这样问的。。直接挠挠头说不记得了。

对于带操作系统的平台,有适用于它的通用C/C++编译器,可以为各种处理器编译。Windows系统下一般使用的是微软的MSVC,Unix-Like(Linux)一般使用的是GCC(gcc和g++)。对于不带操作系统的处理器或者控制器(裸机),有各自的专用编译器,比如8051单片鸡一般使用的是Keil公司的Keil CX51,arduino的编译器也叫arduino,arm平台(包括Cortex-M、Cortex-R、Arm7等内核的处理器和控制器)使用的是armcc

一个写好的程序怎么给另一个程序调用?打包方法?

那自然是打包成DLL(动态链接库)或者LIB(静态链接库)了。面试官问我怎么做,我想当然地说用VS工具就行了。想想他应该是想知道下我对Linux环境是否熟悉吧,毕竟Linux莫得天下第一IDE。

Windows环境下可以使用VS工具进行打包,比较方便。Linux环境下我一般是使用cmake编译工具,在CMakeList中指定编译成动态链接库(后缀.so)或者静态链接库(后缀.a)的形式,就可以进行打包;也可以用gcc/g++直接敲命令的方式完成。

反思

去了好几家大公司的面试和宣讲会,人均华工硕士(哪来那么多的华工硕士,沃日)。当然抛开学历来说,竞争者们的确要比我厉害许多,自愧不如,尤其今年竞争更加激烈了。精神领袖毛主席说过:抛弃幻想,准备斗争。再玩游戏怕是要回家继承家产咯~~


愿乘风破浪会有时

你可能感兴趣的:(凉面总结之TCL图像工程师面试)