其核心流程如下图所示:
mermaid
flowchart TD
A[输入图像] --> B[预处理]
subgraph B [预处理]
B1[灰度化]
B2[滤波降噪]
B3[二值化]
B4[透视校正]--> B5[提取ROI]
end
B --> C[识别花色与点数]
subgraph C [识别花色与点数]
C1[模板匹配法]
C2[轮廓/几何分析法]
C3[机器学习法]
end
C --> D[输出结果]
WePoker最新版下面我们来详细讲解每一个步骤:
目标是从摄像头或相机拍摄的原始图片中,将扑克牌区域清晰地分离出来,并为其后的识别做好准备。
1. 灰度化:将彩色图像转换为灰度图像。这样可以减少计算量,因为颜色信息对于识别点数花色通常不是必需的。
2. 滤波降噪:使用高斯模糊、中值滤波值滤波等方法,消除图像中的噪声干扰,使画面更平滑。
3. 二值化:选择一个合适的阈值,将灰度图像转换为纯粹的黑白图像(例如,白色背景、黑色前景)。这是非常关键的一步,因为它能突出目标的轮廓。
4. 边缘检测与轮廓查找:使用如Canny等边缘检测算法,找到图像中图像中所有物体的边界。然后通过查找轮廓的算法,找出所有封闭的轮廓。
5. 扑克牌区域定位:
* 在所有找到的轮廓中,根据面积、长宽比(扑克牌有固定的比例,约2.5:3.5)和凸性(轮廓是否近似为凸多边形)进行筛选。
* 找到最可能是扑克牌矩形的轮廓。通常会用一个矩形框出这个轮廓。
6. 透视校正:如果扑克牌在图像中是倾斜或带有透视效果的,需要通过透视变换将其“拉直”,矫正为一个标准的正面矩形图像。这确保了后续识别的准确性。
在定位并矫正了扑克牌主体后,我们需要在其内部定位到表示点数和花色的区域,并进行识别。
1. 兴趣区域定位:
* 点数ROI:通常在扑克牌的四个角上。可以根据牌面的大小,在左上角划定一个小矩形区域,这个区域就包含了点数和花色。
* 花色ROI:在点数符号的旁边或下方。同样可以划定一个更小的区域。
2. 识别方法:
识别ROI内的内容主要有以下几种主流方法:
* 原理:预先制作好所有可能出现的点数(A, 2, 3, ..., K)和花色(♠️, ♥️, ♦️, ♣️)的标准模板图片(同样是二值化的)。
* 过程:将提取将提取到的ROI图像(例如,左上角的数字区域)与所有的数字模板进行比对。计算它们之间的相似度(如计算像素差异)。选择相似度最高的那个模板,作为识别结果。
* 优点:实现简单,在光照均匀、牌面设计固定的情况下速度快、准确率高。
* 缺点:对图像的尺度、旋转、光照变化敏感。如果牌的品牌不同,设计有细微差别,可能需要多套模板。
* 原理:不直接比对像素,而是分析ROI内图形的形状特征。
* 过程:
* 在ROI内再次查找轮廓,找到代表数字或花色的独立图形。
* 计算这些轮廓的特征,例如:轮廓面积、周长、Hu矩(一种对平移、旋转和缩放不敏感的轮廓特征)、顶点数量等。
* 例如:数字“8”中间会有两个洞(轮廓内部有孔),而数字“1”则没有;红桃♥轮廓的凸性特征很明显。
* 优点:比模板匹配更耐缩放和旋转,计算量相对较小。
* 缺点:特征设计需要技巧,对于复杂或相似的形状(如方块♦和红桃♥在二值化后轮廓可能相似)可能区分度不够。
* 原理:这是目前最先进和鲁棒的方法。
* 传统机器学习:使用SVM(支持向量机)、KNN等分类器。需要先手动提取HOG(方向梯度直方图)等特征,然后送入分类器进行训练。
* 深度学习:使用卷积神经网络(CNN)。收集大量各种角度、光照、不同设计的扑克牌图片,标注好它们的点数和花色,直接训练一个端到端的神经网络模型。
* 过程:将整个扑克牌图像或ROI区域直接输入训练好的模型,模型会直接输出点数和花色的分类结果。
* 优点:准确率极高,抗干扰能力强(能处理倾斜、光照不均、不同设计等问题),无需复杂的预处理和特征工程。
* 缺点:需要大量的数据集进行训练,模型训练过程复杂,计算资源要求高。
* 实时性:在扑克牌机器人、自动发牌机等应用中,识别速度必须在几十毫秒内完成。因此代码需要高度优化,通常采用C++。
* 光照条件:环境光的变化是最大的挑战。强光下会过曝,阴影下会太暗。解决方法包括:使用自适应二值化算法、增加辅助光源、在图像预处理阶段进行光照均衡等。
* 多种牌型:世界上有成千上万种不同设计的扑克牌。一个商业级的识别系统需要能够兼容多种常见牌型,这通常需要通过机器学习方法来保证泛化能力。
* 遮挡与重叠:如果牌被手或其他物体部分遮挡,或者多张牌重叠在一起,会增加定位和识别的难度。
扑克牌识别是一个综合性的计算机视觉任务,它完美地结合了图像处理(预处理、定位)、模式识别(模板匹配、特征分析)和机器学习/深度学习等技术。其基本原理是:先找到牌,再找到牌角的关键信息区域,最后将这个区域内的图案与已知的模板或特征进行比对,从而得出点数和高色。
随着深度学习技术的发展,现代的扑克牌识别系统越来越倾向于使用端到端的CNN模型,以实现更高的准确率和更强的环境适应性。