sgw音视频开发面试

第一次去参加开发岗的面试,小结一下~

面试官问过的问题:

1.关于自己做过的项目:
我最近在做一个图像压缩的课题,简单跟他介绍了一下用到的算法,但很多都是直接移植别人的库,所以被问到细节的时候没说出来。

2.关于图像处理:
1)直方图在图像处理里面最重要的作用是什么?
(考官给的答案:增强图像的对比度)

灰度直方图的定义:灰度级的函数,描述图像中该灰度级的像素个数或该灰度级像素出现的频率。反映了图像灰度分布的情况。

灰度直方图只能反映图像的灰度分布情况,不能反映图像像素的位置,即所有的空间信息全部丢失。

直方图的应用:
a.数字化参数:判断一幅图像是否合理的利用了全部被允许的灰度级范围。一般一幅图应该利用全部或几乎全部可能的灰度级,否则等于增加了量化间隔,丢失的信息将不能恢复。

b.边界阈值选取(确定图像二值化的阈值):假定某图像的灰度直方图具有二峰性,则表明这个图像的较亮区域和较暗区域可以很好地分离,以这一点为阈值点,可以得到很好地2值处理效果(区分物体与背景)。

c.当物体部分的灰度值比其他部分的灰度值大时,可利用直方图统计图像中物体的面积。

d.计算图像的信息量H。

2)数字图像滤波有哪些方法?
均值滤波(邻域平均法)、中值滤波(消除独立的噪声点)、高斯滤波(线性平滑滤波,消除高斯噪声,对整幅图像进行加权平均,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到)、KNN滤波、高通滤波、低通滤波等。

3)图像可以提取的特征有哪些?
颜色、纹理(粗糙度、方向度、对比度)、形状(曲率、离心率、主轴方向)、色彩等。

4)Open CV?

5)深度学习与机器学习。

6)衡量图像重建好坏的标准有哪些?怎样计算?
SNR(信噪比)
PSNR=10*log10((2^n-1)^2/MSE)
(MSE是原图像与处理图像之间均方误差,所以计算PSNR需要2幅图像的数据!)
SSIM
(结构相似性分别从亮度对比度、对比度、结构3方面度量图像的相似性)

3.关于数据结构:
1)堆和栈的区别?(程序的内存分配)
一个由C/C++编译的程序占用的内存分为以下几部分:
(1)栈区(stack)–由编译器自动分配释放,存放函数的参数值、局部变量的值等。
(2)堆(heap)–一般由程序员分配释放,若程序员不释放,程序结束时间可能由OS回收。分配方式类似于链表。
(3)全局区(静态变量static)–全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和胃初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。
(4)文字常量区–常量字符串就是放在这里的,程序结束后由系统释放。
(5)程序代码区–存放函数体的二进制代码。

堆和栈的区别:
(1)申请方式:stack由系统自动分配;heap需要程序员自己申请并指明大小。
(2)申请后系统的相应:stack只要栈的剩余空间大于所申请上的空间,系统将为程序提供内存,否则将报异常提示栈溢出。heap首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统 ,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句才能正确的释放本内存空间。由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动地将多余的那部分重新放入空闲链表中。
(3)申请大小的限制:stack在windows下是向低地址扩展的数据结构,是一块连续的内存区域。windows下栈的大小是2M(在编译时就能确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。heap是向高地址扩展的数据结构,不连续的内存区域,这是由于系统是用链表来存储的空闲内存地址,自然是不连续的,而链表的遍历方向是由低地址向高地址。heap的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
(4)申请效率的比较:stack由系统自动分配,快,但程序员是无法控制的。heap由new分配,慢,但是方便。但是windows中最好用VirtualAlloc分配内存,他不是在堆,也不是在栈,是直接在进程的地址中保留一块内存,虽然用起来不方便,但是速度快,灵活。
(5)存储效率的比较:在栈上的数组比指针所指向的字符串(例如堆)快。

总结来说就是:
栈:去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
堆:就像是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

2)知道哪些排序方法?
排序分为内部排序和外部排序。
外部排序分为:插入排序(直接插入排序O(n^2)、希尔排序)、选择排序(简单选择排序、堆排序O(nlogn ))、交换排序(冒泡排序、快速排序)、归并排序、基数排序。

3)冒泡排序怎样排序?时间复杂度是多少?
冒泡排序的平均时间复杂度是O(n^2),最好情况是O(n),稳定。

4.关于C/C++:
1)写一个函数:memcpy将一块内存里存储的数据转移到另一块内存中。
void *memcpy(void *dest, const void *src, size_t count)
{
assert(dest != NULL && src != NULL);
char *tmp = dest;
const char *s = src;
while (count–)
*tmp++ = *s++ ;
return dest;
}

2)写一个函数:输入一个int型数字求它转化成二进制数中1的个数。

3)malloc/free与new/delete的区别和联系?
本质区别:
malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。对于用户自定义而言,malloc/free无法满足动态管理对象的要求,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。(由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。)

联系:
new/delete的功能完全覆盖了malloc/free,为什么C++保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放new创建的动态对象,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放malloc申请的动态内存,理论上讲程序不会出错,但是可读性很差。所以new/delete和malloc/free必须配对使用。
4)*与&的用法和区别(指针的用法)

5)怎样实现C和matlab混编?

5.其他:
1)DFT和FFT的区别?

2)Linus内核。

整个面试用时1.5小时,很多问题真的是都学过,但是真的想不起来了…面试完了考官说回去等消息~当时就知道自己应该是被刷了,今天是面试完第三天,上去查看了一下该岗位重新发布了招聘信息了~这次面试应该是gg了。不过还是学到了一些东西~感恩^^

你可能感兴趣的:(编程tips)