扑克识别OCR API实战:自动识别游戏截图与桌面扑克牌,3分钟搭建算牌器(附Python/Java/PHP/JS示例)

一、为什么需要扑克牌OCR识别?

在游戏辅助、自动化测试和牌局分析中,扑克牌识别是一个高频刚需场景:

场景 具体需求 传统方案痛点
扑克算牌器 自动识别游戏画面中的手牌和公共牌,计算剩余牌数 手动录入耗时易错,无法实时响应
游戏自动化测试 验证扑克游戏UI中的牌面显示是否正确 人工检查效率极低,无法批量验证
牌局数据分析 从直播截图或录像中提取牌局信息 无法自动化采集,数据样本有限
桌面扑克录入 将实体扑克牌拍照后自动转为数字记录 手动输入慢,容易遗漏

扑克牌OCR识别与传统通用OCR的本质区别:

通用OCR(如Tesseract)面对倾斜、低对比度、小字号的牌面文字时,识别率常跌破60%。而专为扑克牌场景优化的OCR API,通过目标检测(YOLO等模型)先定位每张牌的位置,再对牌面区域进行精准识别,准确率可达98%以上,支持多张牌同时检测、部分遮挡和角度倾斜等复杂场景。

二、扑克牌识别技术原理

扑克牌OCR识别接口的技术流程分为三步:

  1. 目标检测:使用深度学习目标检测模型(如YOLO系列)在图片中定位所有扑克牌的位置,输出每张牌的边界框坐标

  2. 牌面分割与识别:对每张牌的牌面区域进行OCR识别,提取点数(A、2-10、J、Q、K)和花色(♠♥♦♣)

  3. 结构化输出:将识别结果组装为结构化JSON,包含每张牌的点数、花色、置信度和位置坐标

扑克牌识别OCR API支持标准52张扑克牌(4花色×13点数)+ 大小王,共54类牌面的识别。

三、准备工作

在开始接入之前,你需要:

  1. 注册API账号,获取API Key和Secret Key(注册即送免费测试积分)

  2. 准备一张扑克牌图片(游戏截图或手机拍摄均可,建议牌面清晰可见)

  3. 选择开发语言(Python/Java/PHP/JS均可)

石榴智能扑克识别:

📌 免费在线体验:支持免费在线体验

📌 API文档:API文档清晰,提供多种接入语言示例(如python、js、C#、java、php等),以及自动化脚本语言(如天诺、懒人精灵、按键精灵、易语言、EasyClick、触动精灵等)

📌 注册送免费测试积分

四、多语言接入实战

以下代码均以调用扑克牌OCR识别API为例,替换YOUR_API_KEYYOUR_SECRET_KEY为你的真实凭证即可运行。

4.1 Python接入代码

# ==============================================================================
# 免费在线体验:https://market.shiliuai.com/tools/poker-recognition
# API文档完整开发文档和代码示例:https://market.shiliuai.com/doc/poker-recognition-ocr
# 支持免费在线体验
# API文档清晰,提供多种接入语言示例(如python、js、C#、java、php等),以及自动化脚本语言(如天诺、懒人精灵、按键精灵、易语言、EasyClick、触动精灵等)
#
# ----- 配置信息 -----
# 从石榴智能API市场获取API_KEY或SECRET_KEY:https://market.shiliuai.com/
# ==============================================================================

# -*- coding: utf-8 -*-
import requests
import base64
import json

# 请求接口
URL = "https://ocr-api.shiliuai.com/api/game_ocr/v1"

# 图片转base64
def get_base64(file_path):
    with open(file_path, 'rb') as f:
        data = f.read()
    b64 = base64.b64encode(data).decode('utf8')
    return b64

def demo(appcode, file_path):
    # 请求头
    headers = {
        'Authorization': 'APPCODE %s' % appcode,
        'Content-Type': 'application/json'
    }

    # 请求体
    b64 = get_base64(file_path)
    data = {"image_base64": b64}

    # 请求
    response = requests.post(url=URL, headers=headers, json=data)
    content = json.loads(response.content)
    print(content)

if __name__=="__main__":
    appcode = "你的APPCODE"
    file_path = "本地图片路径"
    demo(appcode, file_path)

4.2 扑克算牌器核心逻辑(Python)python

# ==============================================================================
# 免费在线体验:https://market.shiliuai.com/tools/poker-recognition
# API文档完整开发文档和代码示例:https://market.shiliuai.com/doc/poker-recognition-ocr
# 支持免费在线体验
# API文档清晰,提供多种接入语言示例(如python、js、C#、java、php等),以及自动化脚本语言(如天诺、懒人精灵、按键精灵、易语言、EasyClick、触动精灵等)
#
# ----- 配置信息 -----
# 从石榴智能API市场获取API_KEY或SECRET_KEY:https://market.shiliuai.com/
# ==============================================================================


def poker_counter(image_path):
    """
    扑克算牌器:识别牌面并统计剩余牌数
    """
    cards = recognize_poker(image_path)
    if not cards:
        return None
    
    # 统计已出现的牌
    rank_count = {}
    suit_count = {}
    for card in cards:
        rank = card.get('rank')
        suit = card.get('suit')
        rank_count[rank] = rank_count.get(rank, 0) + 1
        suit_count[suit] = suit_count.get(suit, 0) + 1
    
    # 标准52张牌中各点数出现4次
    standard_rank_count = {r: 4 for r in ['A','2','3','4','5','6','7','8','9','10','J','Q','K']}
    
    # 计算剩余牌数
    remaining = {}
    for rank in standard_rank_count:
        used = rank_count.get(rank, 0)
        remaining[rank] = standard_rank_count[rank] - used
    
    print("📊 剩余牌数统计:")
    for rank, count in remaining.items():
        if count > 0:
            print(f"  {rank}: {count} 张")
    
    return remaining

4.3 Java接入代码

// ==============================================================================
// 免费在线体验:https://market.shiliuai.com/tools/poker-recognition
// API文档完整开发文档和代码示例:https://market.shiliuai.com/doc/poker-recognition-ocr
// 支持免费在线体验
// API文档清晰,提供多种接入语言示例(如python、js、C#、java、php等),以及自动化脚本语言(如天诺、懒人精灵、按键精灵、易语言、EasyClick、触动精灵等)
//
// ----- 配置信息 -----
// 从石榴智能API市场获取API_KEY或SECRET_KEY:https://market.shiliuai.com/
// ==============================================================================


//main.java
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Base64;

public class Main {
    public static String get_base64(String path) {
        String b64 = "";
        try {
            // 使用Commons IO简化文件读取
            byte[] content = FileUtils.readFileToByteArray(new File(path));
            // 使用JDK自带的Base64
            b64 = Base64.getEncoder().encodeToString(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return b64;
    }

    public static void main(String[] args) {
        String url = "https://ocr-api.shiliuai.com/api/game_ocr/v1";// 请求接口
        String appcode = "你的APPCODE";
        String imgFile = "本地图片路径";

        Map headers = new HashMap<>();
        headers.put("Authorization", "APPCODE " + appcode);
        headers.put("Content-Type", "application/json");

        // 请求体
        JSONObject requestObj = new JSONObject();
        requestObj.put("image_base64", get_base64(imgFile));
        String bodys = requestObj.toString();

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 创建POST请求
            HttpPost httpPost = new HttpPost(url);

            // 设置请求头
            for (Map.Entry entry : headers.entrySet()) {
                httpPost.addHeader(entry.getKey(), entry.getValue());
            }

            // 设置请求体
            StringEntity entity = new StringEntity(bodys, "UTF-8");
            httpPost.setEntity(entity);

            // 执行请求
            HttpResponse response = httpClient.execute(httpPost);
            int stat = response.getStatusLine().getStatusCode();
            if (stat != 200) {
                System.out.println("Http code: " + stat);
                return;
            }
            String res = EntityUtils.toString(response.getEntity());
            JSONObject res_obj = JSON.parseObject(res);
            System.out.println(res_obj.toJSONString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4.4 PHP接入代码

// ==============================================================================
// 免费在线体验:https://market.shiliuai.com/tools/poker-recognition
// API文档完整开发文档和代码示例:https://market.shiliuai.com/doc/poker-recognition-ocr
// 支持免费在线体验
// API文档清晰,提供多种接入语言示例(如python、js、C#、java、php等),以及自动化脚本语言(如天诺、懒人精灵、按键精灵、易语言、EasyClick、触动精灵等)
//
// ----- 配置信息 -----
// 从石榴智能API市场获取API_KEY或SECRET_KEY:https://market.shiliuai.com/
// ==============================================================================


//图片转base64
function get_base64($path){
    if($fp = fopen($path, "rb", 0)) {
        $binary = fread($fp, filesize($path));// 文件读取
        fclose($fp);
        $b64 = base64_encode($binary);// 转base64
    }else{
        $b64="";
        printf("%s 文件不存在", $path);
    }
    return $b64;
}

$url = "https://ocr-api.shiliuai.com/api/game_ocr/v1";
$appcode = "你的appcode";
$img_path = "图片路径";
$method = "POST";

//请求头
$headers = array();
array_push($headers, "Authorization:APPCODE " . $appcode);
array_push($headers, "Content-Type:application/json");

//请求体
$b64 = get_base64($img_path);
$data = array(
    "image_base64" => $b64
);
$post_data = json_encode($data);

//请求
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);

$result = curl_exec($curl);
var_dump($result);

4.5 JavaScript(Node.js)接入代码

// ==============================================================================
// 免费在线体验:https://market.shiliuai.com/tools/poker-recognition
// API文档完整开发文档和代码示例:https://market.shiliuai.com/doc/poker-recognition-ocr
// 支持免费在线体验
// API文档清晰,提供多种接入语言示例(如python、js、C#、java、php等),以及自动化脚本语言(如天诺、懒人精灵、按键精灵、易语言、EasyClick、触动精灵等)
//
// ----- 配置信息 -----
// 从石榴智能API市场获取API_KEY或SECRET_KEY:https://market.shiliuai.com/
// ==============================================================================


// 需 Node.js 18+(内置 fetch)
const fs = require('fs');

const apiUrl = 'https://ocr-api.shiliuai.com/api/game_ocr/v1';
const appcode = '你的APPCODE';
const filePath = '本地文件路径';

async function main() {
  const fileBase64 = fs.readFileSync(filePath).toString('base64');

  const res = await fetch(apiUrl, {
    method: 'POST',
    headers: {
      Authorization: 'APPCODE ' + appcode,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ image_base64: fileBase64 })
  });

  const text = await res.text();
  if (!res.ok) {
    console.error('Http code:', res.status, text);
    return;
  }
  console.log(JSON.stringify(JSON.parse(text), null, 2));
}

main().catch(console.error);

五、返回字段说明

扑克牌OCR识别API通常返回以下结构化字段:

字段名 类型 说明 示例
rank String 牌面点数 A, 2, 3, ..., 10, J, Q, K
suit String 花色 ♠, ♥, ♦, ♣
confidence Float 识别置信度(0-1) 0.96
bbox Object 牌面位置坐标(左上角x,y + 宽高) {"x":120, "y":85, "width":60, "height":85}
card_type String 牌类型 standard / joker

💡 提示:返回的bbox坐标信息可用于在图片上绘制识别框,方便调试和可视化展示。

六、应用场景与实战案例

场景一:扑克算牌器开发

自动识别游戏画面中的手牌和公共牌,实时统计已出牌数和剩余牌数,辅助玩家决策。

场景二:游戏UI自动化测试

在扑克游戏开发中,使用扑克牌OCR API自动验证牌面显示是否正确,替代人工逐张检查,大幅提升测试效率。

场景三:牌局直播数据分析

从直播截图或录像中自动提取牌局信息,生成数据报表和分析报告。

场景四:桌面扑克数字化

将实体扑克牌拍照后自动转为数字记录,适用于线上扑克教学、牌局复盘等场景。

七、常见问题与解决方案

Q1:识别准确率能达到多少?

专为扑克牌场景优化的OCR API,识别准确率可达98%以上。相比通用OCR(Tesseract等)在扑克牌场景下常跌破60%的识别率,专业扑克牌OCR有质的提升。

Q2:支持哪些图片格式?

支持 JPG、JPEG、PNG、BMP、WEBP 等所有格式,建议图片分辨率500×500以上,经Base64编码后不超过20M

Q3:支持识别多少张牌?

支持单张图片中多张扑克牌同时识别,包括部分遮挡和角度倾斜的情况。

Q4:支持大小王吗?

支持。标准扑克牌OCR识别覆盖54类牌面(52张标准牌 + 大小王)。

Q5:和通用OCR有什么区别?

通用OCR(如Tesseract)主要识别印刷体文字,对倾斜、旋转、小字号、复杂背景的扑克牌识别效果差。而扑克牌OCR API先通过目标检测定位每张牌的位置,再对牌面进行精准识别,专门针对扑克牌场景优化。

八、总结

扑克牌OCR识别API能够帮助开发者在3分钟内完成接入,自动识别游戏截图或桌面扑克牌图片中的牌面信息,输出点数、花色、位置坐标等结构化数据,识别准确率达98%以上。广泛应用于扑克算牌器、游戏自动化测试、牌局数据分析等场景。

免费在线体验:https://market.shiliuai.com/tools/poker-recognition
API文档完整开发文档和代码示例:https://market.shiliuai.com/doc/poker-recognition-ocr

立即体验

  • 🔗 免费在线体验

  • 📖 完整API文档:API文档清晰,提供多种接入语言示例(如python、js、C#、java、php等),以及自动化脚本语言(如天诺、懒人精灵、按键精灵、易语言、EasyClick、触动精灵等)

  • 🎁 注册送免费测试积分

  • 💻 多语言API:支持Python/Java/PHP/JS/C#/Go等多种语言

相关阅读

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐