当前位置: 首页 > news >正文

php使用OpenCV实现从照片中截取身份证区域照片

<?php
// 获取上传的文件
$file = $_FILES['file'];

// 获取文件的临时名称
$tmp_name = $file['tmp_name'];

// 获取文件的类型
$type = $file['type'];

// 获取文件的大小
$size = $file['size'];

// 获取文件的错误信息
$error = $file['error'];

// 检查文件是否上传成功
if ($error!== UPLOAD_ERR_OK) {
    echo "文件上传失败:{$error}";
    exit;
}

// 检查文件是否为图像文件
if (!in_array($type, ['image/jpeg', 'image/png'])) {
    echo "文件不是图像文件";
    exit;
}

// 加载图像文件
switch ($type) {
    case 'image/jpeg':
        $image = cv\imread($tmp_name, cv\IMREAD_COLOR);
        break;
    case 'image/png':
        $image = cv\imread($tmp_name, cv\IMREAD_COLOR);
        break;
}

// 检查是否成功加载图像
if ($image === false) {
    echo "无法加载图像";
    exit;
}

// 定义身份证区域的坐标
$x1 = $y1 = $x2 = $y2 = null;

// 使用OpenCV来识别身份证区域
$gray = cv\cvtColor($image, cv\COLOR_BGR2GRAY);
$thresh = cv\threshold($gray, 0, 255, cv\THRESH_BINARY_INV + cv\THRESH_OTSU)[1];
$contours = cv\findContours($thresh, cv\RETR_EXTERNAL, cv\CHAIN_APPROX_SIMPLE);
foreach ($contours as $contour) {
    $area = cv\contourArea($contour);
    if ($area > 1000 && $area < 10000) {
        $rect = cv\boundingRect($contour);
        if ($x1 === null) {
            $x1 = $rect[0];
            $y1 = $rect[1];
            $x2 = $rect[0] + $rect[2];
            $y2 = $rect[1] + $rect[3];
        } else {
            $x1 = min($x1, $rect[0]);
            $y1 = min($y1, $rect[1]);
            $x2 = max($x2, $rect[0] + $rect[2]);
            $y2 = max($y2, $rect[1] + $rect[3]);
        }
    }
}

// 检查是否成功找到身份证区域
if ($x1 === null || $x2 === null || $y1 === null || $y2 === null) {
    echo "无法找到身份证区域";
    exit;
}

// 裁剪身份证区域
$crop = cv\crop($image, $x1, $y1, $x2 - $x1, $y2 - $y1);

// 生成裁剪后的图像文件
switch ($type) {
    case 'image/jpeg':
        cv\imwrite('identity_card.jpg', $crop);
        break;
    case 'image/png':
        cv\imwrite('identity_card.png', $crop);
        break;
}

// 释放内存
cv\destroyAllWindows();

echo "身份证区域已裁剪并保存为identity_card.jpg或identity_card.png";
?>
 

http://www.lryc.cn/news/260190.html

相关文章:

  • 抖音ip地址切换会看不到视频吗
  • 有关爬虫http/https的请求与响应
  • 模块二——滑动窗口:438.找到字符串中所有字母异位词
  • 排序算法(二)-冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序
  • 智能优化算法应用:基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 高效排队,紧急响应:RabbitMQ Priority Queue全面指南【RabbitMQ 九】
  • Java中使用EasyExcel写excel文件
  • 【C语言程序设计】函数程序设计
  • GDPU 数据结构 天码行空14
  • 科技提升安全,基于YOLOv5系列模型【n/s/m/l/x】开发构建商超扶梯场景下行人安全行为姿态检测识别系统
  • 【网络安全】网络防护之旅 - 对称密码加密算法的实现
  • 鸿蒙arkTs Toast抽取 及使用
  • 网络安全渗透测试的相关理论和工具
  • C 语言 xml 库的使用
  • 群晖(Synology)云备份的方案是什么
  • Flask 中的跨域难题:定义、影响与解决方案深度解析
  • 汽车IVI中控开发入门及进阶(十二):V4L2视频
  • gitlab下载安装
  • Jmeter,提取响应体中的数据:正则表达式、Json提取器
  • 【SpringBoot篇】基于布隆过滤器,缓存空值,解决缓存穿透问题 (商铺查询时可用)
  • Gitlab基础篇: Gitlab docker 安装部署、Gitlab 设置账号密码
  • c++常见函数处理
  • MYsql第二次作业
  • SQLAlchemy 第三篇
  • 交互过程中影响信息质量好坏的因素
  • 服务器上配置jupyter,提示Invalid credentials如何解决
  • Axure中动态面板使用及轮播图多种登录方式左侧导航栏之案列
  • 大数据之旅-问题反思
  • 系统级基础信号知识【Linux】
  • Excel单元格隐藏如何取消?