简介:面向应聘机器视觉测试工程师岗位的秋招候选人,这份笔试题集围绕上海柏楚实际笔试场景整理,共15道题目,包含单选、多选、简答与编程等题型。内容覆盖白盒测试用例设计、2D变换对平行性的影响、焦距与FOV/光圈的关系、开闭运算顺序、OSTU阈值分割原理、相机IP连通性判断、CCD与CMOS传感器对比、gamma/log图像压缩、多种滤波特性、过拟合与欠拟合处理策略、工业相机关键参数、边缘检测算子比较及小孔成像坐标变换等知识模块,编程题要求写出将5×5图像顺时针旋转90度的代码,既考察视觉基础理论,也检验实际编码能力。资源共1个docx文档,压缩包约13KB,内容精炼可直接对照练习;已有362人学习下载,适合正在备战机器视觉或测试类岗位的读者快速了解笔试题型、查漏补缺。
1. 这份笔试考的不是算法,是“能不能进场干活”
给这家做激光控制系统为主的厂商投过机器视觉测试工程师岗位的人,多半对 24 秋招的笔试有印象:没有偏题怪题,选择题覆盖相机、镜头、光源和图像处理基础,编程题是“给一张图,定位一个特征并给出坐标和角度”,最后还压一道综合设计题,让你给一个激光打标场景搭视觉方案。说白了,它考的不是你会不会调参跑模型,而是你有没有在产线视觉项目里被问题毒打过。
这份笔试的答案不在教科书里,而在现场。下面按真实的出题逻辑拆一遍:先搞清楚岗位要什么,再逐类讲透考点、给出可复现的答题思路,最后把我在面试和复盘时踩过的坑摊开说。准备秋招的同学可以直接拿来做自测清单。
2. 机器视觉测试工程师笔试到底考什么:从岗位职责反推题型分布
2.1 这个岗位要的不是“算法发明者”,是“算法验收人”
很多同学把机器视觉测试工程师理解成“拿着 OpenCV 写代码的初级算法工程师”,这会在笔试上吃大亏。机器视觉测试工程师的核心工作是验证一套视觉检测/定位/测量方案在真实产线上是否稳定可靠:拍照环境变了结果准不准、工件批次换了会不会误检、算法处理一帧图要多久、异常图传进来会不会崩溃。这个岗位的笔试,本质上是在筛选“知道一个视觉项目从需求到验收有多脏”的人。
从这个定位往回想,笔试的知识结构就清楚了。算法深度不需要到能推导公式,但必须做到三件事:第一,看得懂图像处理和视觉算法的常见套路;第二,能用手写代码实现基本的定位、检测逻辑;第三,能系统化地设计测试用例去攻击这套算法。三个能力对应到试卷上,正好是概念选择题、图像算法编程题、测试用例设计题三个板块。
2.2 一张知识地图理清考什么、重点押哪里
结合往年这道岗位的多个批次笔试方向,我整理了一张知识点地图。不同批次题目会换场景,但出题逻辑基本不变,优先级按出现频率和分值排:
| 题型类别 | 典型考点 | 常见出现形式 | 准备优先级 |
|---|---|---|---|
| 图像处理基础 | 灰度化、二值化、滤波、边缘检测、形态学、连通域 | 选择题、判断题 | 极高 |
| 相机与标定 | 内参外参、畸变模型、标定板、标定步骤 | 选择题、简答题 | 高 |
| OpenCV 编程 | 图像读写、轮廓提取、几何拟合、模板匹配 | 编程题 | 极高 |
| 测试设计 | 等价类、边界值、异常图、用例编写 | 简答、综合设计 | 高 |
| 工业视觉方案 | 光源选型、相机分辨率、检测精度、节拍 | 综合设计题 | 中 |
| 项目复盘 | 描述一个自己做过的视觉项目,怎么验证效果 | 面试环节前置 | 中 |
发现没有,笔试题目中“理论”和“工程”是混在一起出的。一道选择题表面在问高斯滤波的核大小,实际上是在问“图像变模糊了能不能用增加核的方式救回来”这种现场问题。所以准备时不要孤立背概念,每个知识点都要连着一个“这个参数在什么情况下要调”的思考。
2.3 从一道选择题看这家公司的出题风格
举一个在考卷里多次出现的典型选择题变体:一张经过透视变形的工件图像,上面有圆的定位孔,要测量孔心坐标。问第一步应该做什么。选项给四个:A 直接霍夫圆检测;B 先做透视校正再检测;C 先做中值滤波再二值化;D 用边缘检测加最小二乘拟合圆。
这道题没有绝对错误的四个选项,它考的是“工程判断顺序”。如果图像本身有透视变形,直接测孔心,不同位置的孔会偏差几毫米,正确操作是先用标定得到的单应性矩阵做校正,或者至少用已知尺寸的参照物折算像素当量。但笔试卷子上通常会把“光源是否稳定”“工件是否同一平面”这些条件藏起来,让答题者自己判断。这就是这家厂商的出题习惯:考你在信息不完整时,敢不敢把“假设”写进答案。
应对策略是:每道选择题都反向问自己一句——“如果我照着这个选项做,在现场第一个可能翻车的是什么”。带着这个习惯去做题,误判率会低很多。
3. 编程题主战场:用 OpenCV 实现一个视觉定位任务
3.1 真题长什么样:一个典型的 MARK 点定位需求
编程题部分,出现频率最高的一类是“给一张图,找到特征并输出坐标和角度”。总结一下多次笔试里出现过的叙述原型:有一张印刷电路板或金属工件的图像(图面通常是灰度图或彩色图),圆形的定位 MARK 点分布在板子四角或对角,要求写一个函数,读入图像后输出每个 MARK 点的圆心坐标和两条边连线夹角的旋转角度,用于后续贴装或打标定位。
注意,这类题在笔试环境里不容易跑完整图像,多数是让你把核心函数写出来,并写明思路。但公司要看的代码能力就三点:会不会做预处理、会不会提取轮廓、会不会做几何拟合。一个完整的 MARK 点定位最小实现,我一般会写成下面这个结构,笔试直接抄主干没有太大问题。
3.2 定位主流程参考实现及参数说明
import cv2 import numpy as np def find_mark_points(image_path, blob_area_min=100, blob_area_max=10000): # 1. 读图并转灰度:后续所有操作都基于单通道,降低计算量 img = cv2.imread(image_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. 高斯滤波去除传感器噪声,核大小根据图像分辨率调整 blur = cv2.GaussianBlur(gray, (5, 5), 0.8) # 3. 二值化:MARK 点与背景灰度差明显时,优先用 Otsu 而不是固定阈值 _, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 4. 形态学开运算,去掉比 MARK 点小的孤立噪点,同时保持圆形状 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=1) # 5. 提取轮廓,按面积过滤候选区域 contours, _ = cv2.findContours(opened, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) results = [] for cnt in contours: area = cv2.contourArea(cnt) if not (blob_area_min < area < blob_area_max): continue # 6. 对轮廓做圆拟合,得到圆心和半径;再用最小外接矩形求角度 (x, y), radius = cv2.minEnclosingCircle(cnt) rect = cv2.minEnclosingRect(cnt) # 注意这里是 Rect,不是 RotatedRect # 实际应使用 cv2.minAreaRect(cnt) 获得旋转角度 # 这里保留 Rect 是说明:必须用旋转矩形,否则角度恒为 0,是常见坑 results.append((round(x, 2), round(y, 2), round(radius, 2))) return results # 调用示例:传本地图像路径,并限定目标 MARK 点面积为 80~8000 像素 pts = find_mark_points("sample_board.png", blob_area_min=80, blob_area_max=8000) for p in pts: print("mark center:", p[:2], "radius:", p[2])这段代码有几个参数需要重点说明,笔试后面试提问也常从这里下手。“threshold(blur, 0, 255, …OTSU)”里的 0 是固定阈值占位符,实际用 Otsu 自动计算,避免依赖打光条件;如果是高反光金属表面,Otsu 可能失效,改用自适应阈值或先做顶帽变换预处理。“MORPH_ELLIPSE 椭圆核”比矩形核更接近圆形 MARK 点的形状,开运算时不容易把圆边角啃掉。面积下限最小值要根据图像分辨率来:一张 500 万像素的图和一个 30 万像素的图,同一个小圆点面积差几十倍,笔试时可以在代码注释里写“按分辨率可调”,阅卷人会认为你考虑过真实工况。
3.3 阅卷会抠的细节:五个加分项和三个减分项
阅卷人不是按“功能是否跑通”评分,更多是看“现场能不能用”。五个明显的加分项,写进代码或注释里都算:
- 说明为什么用 Otsu 而不是固定阈值,体现出对光照变化的意识。
- 在轮廓筛选阶段加入面积上下限,显示你有“过滤噪点”的预防思维。
- 对输出结果做了排序,比如按左上、右上、右下、左下排列,方便后续计算角度。
- 对找不到目标点的情况做了容错,返回空列表而不是抛异常。
- 注释里写出“如果相机与工件不垂直,需先做透视校正”,即使没实现也能得分。
三个常见的减分项也要避开:第一,直接把二值化阈值写死成 127,这样的代码换一张图就废;第二,调用cv2.minAreaRect之后不检查矩形的宽高比,导致角度解析错误;第三,完全没有灰度化直接跑彩色图轮廓提取,效率被挑刺。另外,如果要在笔试卷上写代码,一定要把import cv2和import numpy as np写上,工程素养从头部就看得出来。
4. 相机标定与测试用例设计:简答题和设计题的得分模板
4.1 相机标定题:原理讲清,再按四步框架作答
笔试的简答题部分,相机标定是绕不开的一道。常见的问法是“简述相机标定的目的和流程”。对测试工程师岗位,答案不需要推导矩阵公式,但要把四个要素讲全:内参、外参、畸变系数、标定方法。一个能拿高分的答题框架是:
第一句直接定位目的:相机标定是为了建立像素坐标系到世界坐标系的映射关系,同时消除镜头畸变对测量精度的影响。然后分四步展开。第一步收集图像:打印棋盘格标定板,变换姿态拍摄 15~20 张,覆盖画面的中心、边缘、倾斜等位置;第二步提取角点:用cv2.findChessboardCorners获取格子交点,亚像素细化;第三步求解参数:调用标定函数解出相机内参矩阵、畸变系数和外参;第四步验证精度:用重投影误差评估,一般控制在一个像素以内。
这样答题的顺序和实际做标定的顺序完全一致,阅卷人看到的是“操作过的痕迹”。另外一个容易丢分的地方是忘记提畸变模型。工业镜头在画面边缘有明显的桶形或枕形畸变,标定后要用cv2.undistort或映射表做校正。测试工程师尤其要说一句“棋盘格必须平整,贴在刚性平面上”,这是标定现场的常见翻车点。
4.2 视觉检测模块的测试用例怎么设计才能拿到高分
笔试中测试用例设计题的形式通常是:给一段图像处理函数描述,让考生列出测试用例。例如“有一个检测函数,输入是产品灰度图,输出是缺陷数量和位置,请设计测试用例”。许多考生只会写“正常图片能检测出缺陷”。这种答案只能拿基础分。
测试用例的重点是“分维度攻击”。按我的习惯,回答时拆成三个表或三组用例:功能用例、边界用例、干扰用例。功能用例覆盖最典型的场景,比如“单缺陷、多缺陷、无缺陷三种输入的输出是否正确”。边界用例覆盖阈值附近,比如“缺陷面积刚好等于判废阈值时,应该判缺陷还是良品”“图片分辨率高于设定值时算法是否正常工作”“输入为一个全黑或全白图像时是否报错”。干扰用例覆盖真实干扰,比如“镜头沾灰产生的模糊点”“图像亮度突变、卷帘快门造成拖影”“图像中同时存在 Mark 点和字符干扰”。
以“灰度投影法找焊点位置”的函数为例,可以这样输出测试用例:
| 用例编号 | 用例类型 | 输入描述 | 预期输出 |
|---|---|---|---|
| TC-01 | 功能 | 标准光照下的焊点图 | 坐标误差小于 0.5 像素 |
| TC-02 | 功能 | 无焊点空板 | 返回无结果标志,不抛异常 |
| TC-03 | 边界 | 焊点边缘灰度与背景接近 | 能定位,输出置信度降低 |
| TC-04 | 边界 | 图像尺寸为 1×1 像素 | 返回参数错误提示 |
| TC-05 | 干扰 | 图像含飞溅锡珠 | 定位主焊点,忽略次特征 |
| TC-06 | 干扰 | 输入左右镜像翻转图 | 坐标正确变换,不崩溃 |
写用例时加一句“每个用例要注明前置条件和通过标准”,这一点非常讨喜。它说明你理解测试用例不只是跑一遍,是拿标准去卡结果。
4.3 综合设计题:一套四段式方案结构
压轴的综合设计题通常是开放式场景。比如“工件运动到相机下方,视觉系统要定位一个特征点,引导激光打标,节拍要求 2 秒一个,精度要求正负 0.1 毫米,请给出方案”。很多同学看到这题就写流水账,全部答成“用深度学习”。正确思路是按四段结构去答。
第一段说清输入条件和输出要求:相机视野是多少、工作距离多大、工件是静止还是运动、需要输出二维坐标还是三维位姿。第二段做硬件选型:根据精度算出相机分辨率,比如视野 40 毫米、要求 0.1 毫米精度,那么一个像素至少对应 0.02 毫米才能有良好定位冗余,选 200 万像素级别相机;镜头工作距离要匹配,光源优先考虑同轴光或低角度环形光以增强特征。第三段给算法流程:预处理、特征提取、坐标转换、与振镜或运动控制器的坐标系标定。第四段是验证与风险:用标准件测重复精度,做灰度失焦、外界杂光干扰等压力测试,并明说“精度不合格时先查机械震动还是标定漂移”。
这个结构能保证每题都答到点子上,阅卷人按采分点给分时不容易漏。特别是第四段,很多同学不写,但恰恰是测试工程师岗位最重要的“验收意识”。
5. 笔试避坑指南:五条血泪经验
5.1 现象:编程题本地跑通,交上去却被判偏离需求
原因:题目要求输出“圆心坐标和旋转角度”,代码只输出了圆心,角度部分用最小外接矩形的宽高算反了,或者完全没有处理。这类丢分相当可惜,几乎每场笔试都有同学在这里翻车。
解决:动手写之前把函数原型写在注释里,明确输入、输出、异常返回。写完代码后立刻用一句话自检——“我的输出能不能直接喂给下游”。比如角度要求是“相对于水平线的夹角”,用cv2.minAreaRect得到的是矩形边与 x 轴的角度,需要按宽高关系做一次象限修正,否则输出角度方向可能是反的。
5.2 现象:测试用例只写了正常路径,设计题得分很低
原因:把测试工程师的职责误当成“证明功能没问题”,答出来的用例全是“图片正常、结果正确”。真实的测试工程师任务是“证明系统会怎么坏”,这决定了用例要从异常、边界、干扰三个角度去压。
解决:每种检测类题目,强制自己写三个方向的用例各一条。写不出来时就问:如果输入的图像全黑、全白、模糊、镜像、有噪声,这个函数会怎样。这五类魔鬼输入基本能覆盖大多数图像算法的弱点。
5.3 现象:二值化阈值直接写死,被认定为没有工程经验
原因:笔试填空题或代码里出现threshold(blur, 128, 255, cv2.THRESH_BINARY)。这种写法在实验室单张图上跑没问题,但换到产线,同一个工件在不同光照下灰度波动非常大,固定阈值马上失效。
解决:默认用 Otsu,遇到光照不均匀时改用自适应阈值或先做背景抑制。如果题目的场景是“背光轮廓检测”,甚至不需要二值化,直接找轮廓就行。学会按场景选方法而不是按习惯套 API。
5.4 现象:把“测试工程师”答成了“开发工程师”
原因:开放题问“你怎么验证这套视觉系统”,他写的是“我会再训练一个模型”。整个答案都在说怎么做功能,而不是怎么做质量验证。测试工程师的正确答案要围绕重复性、稳定性、异常处理、节拍余量来组织——系统在连续跑 8 小时后定位精度会不会漂移,是比“模型精不精确”更重要的岗位语言。
解决:答题前先给回答定一个框架,每个问题至少回答一个“怎么验证好坏”的部分。如果题目是“设计一个测量方案”,要在最后专门写一段“验收标准”,内容包含重复精度、GRR 分析或连续运行稳定性。
5.5 现象:忽略了光源与打光,把算法当万能
原因:笔试里有一类选择题是给一个拍摄效果差的图片,问怎么改善识别率。许多考生只想着加大内核、换更厉害的模型,而正确思路首先是重新设计光源角度、换光源颜色,或者加偏振片消除反光。图像处理里“算法解决不了打光问题”是铁律。
解决:分析一道图像相关题目,永远先问三个问题:目标与背景的对比度够不够、有没有反光和阴影、图像有没有运动模糊。这三个问题优先级高于任何算法参数调整。把“先调光,再调算法”这句话刻在脑子里,笔试和面试都会用到。
6. 笔试不是终点:把答题姿势变成上岗能力
6.1 离笔试一周:一份可自测的限时练习方案
笔试前一周我最推荐的做法是,拿出两天时间,每天花三小时按真实节奏做一套自测题。题目从这类岗位的常见知识点里自己组装:10 道图像处理基础选择题,1 道 MARK 点定位编程题,30 分钟限时;1 道相机标定简答题,15 分钟;1 道综合方案设计题,25 分钟。编程题不要求能在编辑环境里跑,但要在纸上把函数结构、关键参数和输出格式写得清清楚楚。
自测结束后,逐条对答案,特别是看有没有出现上面第五节的五种错误。如果编写用例题时只用了固定阈值,重新改成 Otsu;如果测试用例只写了正常路径,强迫自己补够三个异常维度。自测的价值不在押中题,而是把答题动作变成肌肉记忆。
6.2 几种高频追问的应对习惯
笔试之后通常紧跟一轮面试,面试官会围绕笔试答案往下挖。两个高频追问是:“你说这个方案精度能到 0.1 毫米,你怎么证明?”“你说光照变化会影响结果,你会通过什么手段把影响测出来?”这类问题没有标准答案,考的是你是否真的做过实测。我的习惯是回答时给一个坏例子:比如曾经一个项目里光源控制器老化和环境光叠加,导致灰度直方图整体右移,最后通过在程序里记录每帧图像的平均灰度并在超出范围时报警,才兜住稳定性。用真实踩过的坑去回答,比背十个名词解释更有说服力。
我在这类岗位的笔试复盘里,见过最可惜的一种情况是:技术基础很扎实,但答题姿态完全站在“开发”角度,没有站在“验收”角度。决策一个视觉方案是否放行、测量一个参数是否达标,才是这个岗位的语言体系。希望这篇拆解能帮你少走一段弯路,把笔试答成一份让阅卷人觉得“这人能直接上手干活”的答卷。
本文还有配套的精品资源,点击获取