PHP项目OCR文字识别如何对接接口

wen PHP项目 25

本文目录导读:

PHP项目OCR文字识别如何对接接口

  1. 主流OCR接口服务
  2. 通用对接方案
  3. 对接实例 - 完整项目结构
  4. 最佳实践建议

我来详细介绍PHP项目对接OCR文字识别接口的几种主流方案和实现步骤。

主流OCR接口服务

百度云OCR

<?php
// 使用百度云OCR API
require_once 'AipOcr.php'; // 百度提供的SDK
class BaiduOCRService {
    private $client;
    public function __construct() {
        $this->client = new AipOcr(
            '你的AppID',
            '你的API Key',
            '你的Secret Key'
        );
    }
    // 通用文字识别
    public function generalText($imagePath) {
        $image = file_get_contents($imagePath);
        $result = $this->client->basicGeneral($image);
        return $result;
    }
    // 高精度识别
    public function accurateText($imagePath) {
        $image = file_get_contents($imagePath);
        $result = $this->client->basicAccurate($image);
        return $result;
    }
}

腾讯云OCR

<?php
require_once './vendor/autoload.php';
use TencentCloud\Common\Credential;
use TencentCloud\Ocr\V20181119\OcrClient;
use TencentCloud\Ocr\V20181119\Models\GeneralBasicOCRRequest;
class TencentOCRService {
    private $client;
    public function __construct() {
        $cred = new Credential("你的SecretId", "你的SecretKey");
        $this->client = new OcrClient($cred, "ap-guangzhou");
    }
    // 通用文字识别
    public function generalText($imagePath) {
        $req = new GeneralBasicOCRRequest();
        // 支持Base64或URL方式
        $image = base64_encode(file_get_contents($imagePath));
        $req->setImageBase64($image);
        $resp = $this->client->GeneralBasicOCR($req);
        return json_decode($resp->toJsonString(), true);
    }
}

阿里云OCR

<?php
require_once './vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
class AliyunOCRService {
    public function recognize($imagePath) {
        AlibabaCloud::accessKeyClient(
            '你的AccessKeyId',
            '你的AccessKeySecret'
        )->regionId('cn-shanghai')->asDefaultClient();
        try {
            $result = AlibabaCloud::rpc()
                ->product('ocr')
                ->scheme('https')
                ->version('2019-12-30')
                ->action('RecognizeCharacter')
                ->method('POST')
                ->options([
                    'query' => [
                        'ImageURL' => $imagePath, // 图片URL地址
                    ],
                ])
                ->request();
            return $result->toArray();
        } catch (ClientException $e) {
            echo $e->getErrorMessage() . PHP_EOL;
        }
    }
}

通用对接方案

封装统一的OCR服务接口

<?php
interface OCRServiceInterface {
    public function recognize($imagePath);
    public function recognizeFromUrl($imageUrl);
    public function recognizeFromBase64($base64Image);
}
class OCRServiceManager {
    private $service;
    public function __construct($provider = 'baidu') {
        switch ($provider) {
            case 'baidu':
                $this->service = new BaiduOCRService();
                break;
            case 'tencent':
                $this->service = new TencentOCRService();
                break;
            case 'aliyun':
                $this->service = new AliyunOCRService();
                break;
            default:
                throw new Exception("Unsupported OCR provider");
        }
    }
    public function recognize($imagePath) {
        return $this->service->recognize($imagePath);
    }
}

通用HTTP请求封装

<?php
class HTTPOCRClient {
    private $apiUrl;
    private $apiKey;
    public function __construct($apiUrl, $apiKey) {
        $this->apiUrl = $apiUrl;
        $this->apiKey = $apiKey;
    }
    public function recognize($imagePath) {
        $ch = curl_init();
        // 构建请求数据
        $postData = [
            'image' => new CURLFile($imagePath),
            'api_key' => $this->apiKey
        ];
        curl_setopt_array($ch, [
            CURLOPT_URL => $this->apiUrl,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $postData,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_TIMEOUT => 30
        ]);
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($httpCode !== 200) {
            throw new Exception("API request failed with code: $httpCode");
        }
        return json_decode($response, true);
    }
}

对接实例 - 完整项目结构

项目目录

ocr-project/
├── src/
│   ├── Services/
│   │   ├── OCRServiceInterface.php
│   │   ├── BaiduOCRService.php
│   │   ├── TencentOCRService.php
│   │   └── OCRServiceManager.php
│   ├── Utils/
│   │   └── ImageProcessor.php
│   └── Controllers/
│       └── OCRController.php
├── config/
│   └── ocr.php
├── public/
│   └── index.php
└── composer.json

配置文件

<?php
// config/ocr.php
return [
    'default' => 'baidu',
    'providers' => [
        'baidu' => [
            'app_id' => 'your_app_id',
            'api_key' => 'your_api_key',
            'secret_key' => 'your_secret_key',
            'base_url' => 'https://aip.baidubce.com'
        ],
        'tencent' => [
            'secret_id' => 'your_secret_id',
            'secret_key' => 'your_secret_key',
            'region' => 'ap-guangzhou'
        ],
        'aliyun' => [
            'access_key_id' => 'your_access_key_id',
            'access_key_secret' => 'your_access_key_secret'
        ]
    ]
];

控制器示例

<?php
// src/Controllers/OCRController.php
class OCRController {
    private $ocrService;
    public function __construct() {
        $config = include '../config/ocr.php';
        $this->ocrService = new OCRServiceManager($config['default']);
    }
    // 处理图片上传和识别
    public function recognizeImage() {
        try {
            if ($_FILES['image']['error'] !== UPLOAD_ERR_OK) {
                throw new Exception("文件上传失败");
            }
            $imagePath = $_FILES['image']['tmp_name'];
            $result = $this->ocrService->recognize($imagePath);
            // 处理结果
            $text = $this->extractText($result);
            return [
                'success' => true,
                'text' => $text,
                'raw_result' => $result
            ];
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => $e->getMessage()
            ];
        }
    }
    private function extractText($result) {
        // 根据不同服务商解析结果
        $text = '';
        if (isset($result['words_result'])) {
            foreach ($result['words_result'] as $item) {
                $text .= $item['words'] . "\n";
            }
        }
        return $text;
    }
}

前端页面

<!-- public/index.php -->
<!DOCTYPE html>
<html>
<head>OCR文字识别</title>
    <style>
        .container { max-width: 800px; margin: 50px auto; }
        #result { margin-top: 20px; padding: 15px; border: 1px solid #ccc; }
        .loading { display: none; }
    </style>
</head>
<body>
    <div class="container">
        <h1>OCR文字识别</h1>
        <form id="ocrForm" enctype="multipart/form-data">
            <input type="file" name="image" accept="image/*" required>
            <button type="submit">识别</button>
        </form>
        <div class="loading">识别中...</div>
        <div id="result"></div>
    </div>
    <script>
        document.getElementById('ocrForm').onsubmit = async function(e) {
            e.preventDefault();
            const formData = new FormData(this);
            const resultDiv = document.getElementById('result');
            const loadingDiv = document.querySelector('.loading');
            loadingDiv.style.display = 'block';
            resultDiv.innerHTML = '';
            try {
                const response = await fetch('recognize.php', {
                    method: 'POST',
                    body: formData
                });
                const data = await response.json();
                if (data.success) {
                    resultDiv.innerHTML = `<pre>${data.text}</pre>`;
                } else {
                    resultDiv.innerHTML = `错误: ${data.error}`;
                }
            } catch (error) {
                resultDiv.innerHTML = `请求失败: ${error.message}`;
            } finally {
                loadingDiv.style.display = 'none';
            }
        };
    </script>
</body>
</html>

最佳实践建议

图片预处理

<?php
class ImageProcessor {
    // 压缩图片
    public static function compress($sourcePath, $maxWidth = 1024) {
        list($width, $height) = getimagesize($sourcePath);
        if ($width > $maxWidth) {
            $ratio = $maxWidth / $width;
            $newWidth = $maxWidth;
            $newHeight = $height * $ratio;
            $sourceImage = imagecreatefromstring(file_get_contents($sourcePath));
            $newImage = imagecreatetruecolor($newWidth, $newHeight);
            imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0, 
                $newWidth, $newHeight, $width, $height);
            imagejpeg($newImage, $sourcePath, 90);
            imagedestroy($sourceImage);
            imagedestroy($newImage);
        }
    }
    // 图片转灰度
    public static function toGrayscale($sourcePath) {
        $image = imagecreatefromstring(file_get_contents($sourcePath));
        imagefilter($image, IMG_FILTER_GRAYSCALE);
        imagejpeg($image, $sourcePath);
        imagedestroy($image);
    }
}

错误处理与重试机制

<?php
class RetryHandler {
    public static function execute($callback, $maxRetries = 3, $delay = 1) {
        $attempts = 0;
        while ($attempts < $maxRetries) {
            try {
                return $callback();
            } catch (Exception $e) {
                $attempts++;
                if ($attempts >= $maxRetries) {
                    throw $e;
                }
                sleep($delay);
            }
        }
    }
}
// 使用示例
$result = RetryHandler::execute(function() use ($ocrService, $imagePath) {
    return $ocrService->recognize($imagePath);
});

缓存优化

<?php
class OCRCache {
    private $cacheDir = './cache/ocr/';
    public function get($imageHash) {
        $cacheFile = $this->cacheDir . $imageHash . '.json';
        if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 86400)) {
            return json_decode(file_get_contents($cacheFile), true);
        }
        return null;
    }
    public function set($imageHash, $result) {
        if (!is_dir($this->cacheDir)) {
            mkdir($this->cacheDir, 0777, true);
        }
        file_put_contents(
            $this->cacheDir . $imageHash . '.json',
            json_encode($result)
        );
    }
}

这些方案可以帮助你快速集成OCR功能到PHP项目中,建议根据实际需求选择合适的服务商,并注意API调用频率限制和成本控制。

抱歉,评论功能暂时关闭!