You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ARKit开发识别并计数相同麻将牌的iOS应用?

解决ARKit识别多张相同麻将牌的方案

方案1:为相同麻将牌创建带微小差异的参考图像

ARKit的图像检测依赖参考图像的唯一性,你可以给每张相同的麻将牌添加微小的、不影响视觉识别的标记(比如边缘加极细的不同颜色线条,或者在牌角做微小的凹凸标记),然后将这些带标记的麻将牌分别添加到ARReferenceImage库中。这样ARKit会把它们识别为不同的目标,从而统计数量。

方案2:利用ARAnchor的跟踪特性结合空间位置区分

即使参考图像相同,你可以通过检测新出现的锚点(ARImageAnchor)的空间位置,判断是否是新的麻将牌,而不是重复识别同一个:

  • 维护一个已检测锚点的数组,存储每个锚点的位置信息
  • 每次新检测到ARImageAnchor时,计算它与数组中已有锚点的距离
  • 如果距离超过设定阈值(比如5cm,根据实际麻将牌大小调整),则判定为新的麻将牌,数量加1,并将该锚点加入数组

示例代码片段:

var detectedAnchors: [ARImageAnchor] = []
let distanceThreshold: Float = 0.05 // 5厘米

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let imageAnchor = anchor as? ARImageAnchor else { return }
    
    // 计算与已有锚点的距离
    let isNewCard = detectedAnchors.allSatisfy { existingAnchor in
        let distance = simd_distance(existingAnchor.transform.columns.3, imageAnchor.transform.columns.3)
        return distance > distanceThreshold
    }
    
    if isNewCard {
        detectedAnchors.append(imageAnchor)
        print("当前识别到的麻将牌数量:\(detectedAnchors.count)")
        // 更新UI显示数量
    }
}

注意:这种方法需要确保ARKit能稳定跟踪每个锚点的位置,避免因视角变化导致位置计算误差,你可以适当调整距离阈值来适配场景。

方案3:结合机器学习模型进行实例分割

如果不想修改麻将牌本身,可以使用Core ML结合实例分割模型(比如自定义训练YOLO实例分割模型,针对麻将牌),在ARKit的画面流中检测并区分每个相同的麻将实例。步骤如下:

  • 收集不同角度、光照下的麻将牌图片(包括多张相同牌同时出现的场景)
  • 使用LabelMe等工具标注每个麻将实例
  • 训练实例分割模型(比如YOLOv8)并导出为Core ML格式
  • 在ARKit的会话委托中,获取摄像头画面帧,传入模型进行检测,统计实例数量

这种方法的优势是不需要修改物理麻将牌,识别精度依赖模型训练质量。

内容的提问来源于stack exchange,提问作者Bill Chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:18:19