OpenCV相关案例

📅 2026/6/30 8:24:31
OpenCV相关案例
一、答题卡填涂图像预处理cv2.imread()读取本地答题卡图片r 原始字符串避免路径转义报错image.copy()深拷贝原图后续绘图操作不会修改原始图片COLOR_BGR2GRAYOpenCV 默认 BGR 通道转为单通道灰度图降低运算开销 GaussianBlur(gray, (5, 5), 0)5×5 高斯核降噪消除拍照产生的颗粒噪点为边缘检测做铺垫 cv_show(blurred, blurred)封装函数展示降噪后的灰度图Canny(blurred, 75, 200)双阈值边缘检测75 为低阈值、200 为高阈值只保留有效物体边缘过滤细碎杂边cv_show(edged, edged)展示边缘检测结果图能清晰看到答题卡外框轮廓。cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] edged.copy()拷贝边缘图防止原图被修改 RETR_EXTERNAL只提取最外层轮廓过滤内部嵌套轮廓 CHAIN_APPROX_SIMPLE压缩轮廓点只保留拐点减少数据量 [-2]兼容 OpenCV 多版本取值统一取出轮廓列表。cv2.drawContours(contours_img, cnts, -1, (0, 0, 255), 3) 在拷贝图上绘制所有轮廓 -1代表绘制全部轮廓(0,0,255)红色线条3线条粗细。cv_show(contours_img, contours_img)展示绘制完全局轮廓的图像直观查看所有物体边缘。 docCnt None初始化试卷轮廓变量后续用来存储答题卡矩形四点轮廓。cv2.contourArea计算单个轮廓包围区域的面积 reverseTrue从大到小排序答题卡是画面最大矩形优先遍历 作用跳过小噪点轮廓优先匹配试卷外框。arcLength(c, True)计算闭合轮廓周长True代表轮廓闭合 approxPolyDP多边形拟合将不规则曲线轮廓简化为直线顶点 0.02 * peri拟合精度按周长比例动态调整适配不同尺寸试卷。reshape(4,2)将(4,1,2)格式的坐标转为 4 行 2 列标准坐标数组传入矫正函数 four_point_transform调用之前封装的透视变换工具输出正俯视答题卡 warped_new拷贝矫正后图像后续用于绘制对错标记不破坏原图 cv_show展示矫正完成的试卷。warped透视矫正后的灰度答题卡图像THRESH_OTSU自动计算最优分割阈值不用手动调参适配明暗不同的答题卡照片THRESH_BINARY_INV反向二值化填涂黑色区域变为白色空白纸张变为黑色方便后续轮廓提取[1]threshold返回二元组阈值、二值图取第二个元素为处理后的图像。输入二值图只提取最外层轮廓过滤内部嵌套小轮廓 压缩轮廓点节省内存[1]兼容 OpenCV4 版本直接取出轮廓列表。在矫正后的彩色答题卡上用绿色细线画出所有检测到的轮廓 -1代表绘制全部轮廓线条宽度 1 可视化所有圆圈、文字、污渍轮廓方便调试筛选条件。答题卡每题固定 5 个选项步长 5 分割轮廓列表 sort_contours 横向排序保证选项顺序 A→B→C→D→E 不混乱。生成全黑画布把当前选项圆圈填充白色形成掩膜 bitwise_and 仅保留圆圈内像素过滤外部干扰 countNonZero 统计白色像素像素值最大即为考生填涂答案。总分 正确题数 / 总题数 × 100 putText 在左上角打印得分 同时展示原始答题卡与自动阅卷结果图waitKey(0) 阻塞窗口按任意键关闭。二、背景建模MORPH_CROSS十字形卷积核3×3 尺寸 用途配合腐蚀 / 膨胀 / 开运算去除前景掩码噪点、填补细小孔洞优化运动物体轮廓。算法原理混合高斯模型自动建模静态背景区分前景运动物体与背景 输出二值掩码图白色像素代表运动前景黑色为静止背景 优势支持自适应光照变化适合监控、运动检测场景。cap.read()读取一帧视频画面返回标记ret与图像frame retFalse代表视频读取完毕跳出循环结束处理。createBackgroundSubtractorMOG2混合高斯模型自动区分静态背景与运动前景输出掩码图白色像素为运动物体黑色为静止背景原始掩码会存在大量细碎噪点。MORPH_OPEN 腐蚀 膨胀消除掩码中小白点噪点填补物体内部细小空洞 kernel为 3×3 十字结构元优化前景轮廓完整性。boundingRect获取轮廓外接矩形坐标、宽高 在原始彩色帧上绘制 2 像素粗绿色矩形直观标记检测到的运动物体。三、扇子抠图ROTATE_90_COUNTERCLOCKWISE内置常量实现整体图像逆时针旋转 90 度 展示预处理完成后的缩放 旋转图像。50 为低阈值150 为高阈值 梯度大于 150 直接判定为边缘50~150 之间仅保留与强边缘相连的线条 输出二值边缘图白色线条代表物体轮廓边缘。edges.copy()拷贝边缘图避免原图被修改 RETR_EXTERNAL只提取最外层闭合轮廓过滤内部细小嵌套轮廓 CHAIN_APPROX_SIMPLE压缩轮廓点只保留拐点减少内存占用 [-2]兼容 OpenCV 多版本统一取出轮廓列表。edges.copy()拷贝边缘图避免原图被修改 RETR_EXTERNAL只提取最外层闭合轮廓过滤内部细小嵌套轮廓 CHAIN_APPROX_SIMPLE压缩轮廓点只保留拐点减少内存占用 [-2]兼容 OpenCV 多版本统一取出轮廓列表。[max_contour]传入要绘制的轮廓列表 -1绘制全部轮廓255白色填充色 cv2.FILLED填充轮廓内部最终白色区域仅保留扇子区域其余全黑。bitwise_and图像按位与运算第三个参数mask为自定义掩膜 规则掩膜白色 (255) 区域保留原图像素黑色 (0) 区域全部置为黑色 作用仅保留扇子轮廓内的图像内容背景全部消除实现图像抠图。将抠图完成的扇子图像以 PNG 格式保存到项目根目录 PNG 支持透明通道适合单独保存分割后的目标物体。