本文目录导读:

- 方案一:使用第三方云服务 API(最推荐,简单快速)
- 方案二:使用 OpenCV + Tesseract OCR(本地部署,免费但复杂)
- 方案三:使用开源PHP扩展或库(不建议)
- 方案四:通过硬件相机直接获取(工业场景)
在PHP项目中实现车牌识别,通常需要借助第三方API或调用底层的图像处理库,由于PHP本身不擅长图像处理,直接实现OCR(光学字符识别)非常困难。
以下是几种主流的实现方案,按推荐程度排序:
使用第三方云服务 API(最推荐,简单快速)
这是最成熟、准确率最高、最省事的方法,几乎所有云厂商都提供车牌识别服务,返回JSON数据。
适用场景: 商业项目、对准确率要求高、不想自己维护模型。
常见提供商:
- 百度AI:
车牌识别API,支持蓝牌、黄牌、绿牌(新能源)等。 - 阿里云:
车辆车牌识别。 - 腾讯云:
车牌识别。 - 华为云:
车牌识别。
实现步骤(以百度AI为例):
- 注册账号:在百度AI开放平台创建应用,获取
API Key和Secret Key。 - 获取Access Token(通常需要cURL)。
- 调用API接口。
PHP代码示例(使用cURL):
<?php
// 1. 获取 access_token
function getAccessToken($apiKey, $secretKey) {
$url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={$apiKey}&client_secret={$secretKey}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
return $result['access_token'];
}
// 2. 调用车牌识别
function detectPlate($imagePath, $accessToken) {
$url = "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate?access_token={$accessToken}";
// 读取图片并转为 base64
$image = file_get_contents($imagePath);
$imageBase64 = base64_encode($image);
$postData = array('image' => $imageBase64);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// 使用示例
$apiKey = "你的API_Key";
$secretKey = "你的Secret_Key";
$accessToken = getAccessToken($apiKey, $secretKey);
$imagePath = "/path/to/your/car_plate.jpg";
$result = detectPlate($imagePath, $accessToken);
if (isset($result['words_result']['number'])) {
echo "识别结果:".$result['words_result']['number']; // 输出:京A12345
} else {
print_r($result);
}
?>
使用 OpenCV + Tesseract OCR(本地部署,免费但复杂)
如果项目必须离线运行或不想付费,可以在服务器上安装OpenCV和Tesseract,通过Shell命令调用。
适用场景: 个人项目、对实时性要求不高、服务器能安装扩展。
原理:
- PHP调用
exec()执行Python或Java脚本。 - 脚本使用OpenCV进行图像预处理(灰度、二值化、边缘检测、寻找矩形轮廓)。
- 使用Tesseract提取字符。
PHP代码示例:
<?php // 假设你已经有一个Python脚本 detect.py $imagePath = "/path/to/car.jpg"; $command = "python3 /path/to/detect.py " . escapeshellarg($imagePath); $output = shell_exec($command); echo $output; // 输出车牌号 ?>
Python脚本示例(detect.py):
import cv2
import pytesseract
import sys
import re
def detect_plate(image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 预处理、边缘检测、找到车牌区域...
# (此处省略OpenCV定位车牌的详细代码)
# 假设你已经裁剪出了 plate_roi 区域
plate_text = pytesseract.image_to_string(plate_roi, lang='chi_sim+eng', config='--psm 7')
# 过滤非车牌字符
plate_number = re.sub(r'[^A-Z0-9\u4e00-\u9fa5]', '', plate_text)
print(plate_number)
if __name__ == "__main__":
detect_plate(sys.argv[1])
缺点:
- 准确率远不如云API(尤其复杂光线、倾斜)。
- 服务器需要安装OpenCV、Tesseract、Python等,配置复杂。
- PHP
exec()函数在很多生产环境被禁用。
使用开源PHP扩展或库(不建议)
有少数PHP扩展(如php-ffi)可以调用OpenCV或Dlib,但极度不成熟,文档少、维护差,除非是极客项目,否则不建议使用。
通过硬件相机直接获取(工业场景)
如果项目涉及摄像头抓拍(例如小区门禁),通常是:
- 摄像头:使用支持网络协议(RTSP、ONVIF)的工业摄像头。
- 客户端软件:在摄像头上或连接摄像头的PC上运行车牌识别算法(通常用C++/Python)。
- PHP接收:PHP仅作为后端接收识别结果(例如通过HTTP POST发送车牌号和图片),存储到数据库。
- 推荐:使用百度/阿里/腾讯云API,节省时间、准确率99%以上,费用通常按次计费(0.01-0.05元/次),适合绝大多数项目。
- 备用:如果必须离线,使用 Python/OpenCV方案,PHP只负责调度。
- 不推荐:纯PHP实现或冷门扩展。
关键提示:
- 车牌识别不仅仅是OCR,需要先精确定位车牌位置(蓝色、绿色或黄色区域),然后再识别字符,直接对整个图片做OCR效果极差。
- 如果你使用的是中国车牌,需要支持汉字识别(京、沪、粤等)。