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.mzph.cn/news/222409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 服务管理和配置

这篇主要是围绕 systemd 的管理和配置&#xff0c;有新的认识会持续更新 一、服务管理 Centos 7 及后续版本 systemd # 无需重启&#xff0c;重新加载服务 一般用于配置文件变更后 systemctl reload daemon # 服务的开机自启动管理 systemctl enable/disable daemon # 服务状…

阶段五:深度学习和人工智能(学习人工智能的应用领域,如自然语言处理,计算机视觉等)

Python是人工智能领域最流行的编程语言之一&#xff0c;它具有简单易学、功能强大、库丰富等优点&#xff0c;因此在自然语言处理、计算机视觉等领域得到了广泛应用。 自然语言处理 自然语言处理是人工智能领域的一个重要分支&#xff0c;它主要研究如何让计算机理解和处理人…

Matlab绘图添加背景色,动态添加背景

Matlab绘图添加背景色&#xff0c;动态添加背景 有没有小伙伴想过绘制这种有背景的曲线图呢&#xff1f;因为矩形是背景&#xff0c;所以要先绘制&#xff0c;然后再绘制曲线&#xff0c;因此&#xff0c;最先想到的思路可能是&#xff1a;先绘制三个背景矩形&#xff0c;然后填…

编译Sqlite3记录

下载源文件&#xff1a; 下载地址&#xff1a;SQLite Download Page 打开QtCreator创建新的工程&#xff0c;选择纯C工程&#xff0c;将main.c删除&#xff0c;将下载的源码解压后的文件复制到并添加到工程中&#xff0c;其中的文件包括&#xff1a;sqlite3ext.h、sqlite3.h、…

云原生之深入解析网络服务Istio、eBPF和RSocket Broker

一、服务治理 ① “服务治理”简介 在微服务时代&#xff0c;一个复杂的应用程序被分解为多个组件化、协作和连接的单元&#xff0c;服务往往会承担越来越多的业务责任&#xff0c;这使得服务治理的难度前所未有&#xff0c;仅仅依靠微服务框架级的治理是不够的&#xff0c;构…

vivado约束方法4

时序约束向导 定时约束向导确定合成或上缺少的定时约束实现的设计。它分析了网表、时钟网络连接和现有的定时限制&#xff0c;以便根据《超快设计方法指南》提供建议用于FPGA和SoC&#xff08;UG949&#xff09;。以下11涵盖了三类约束页面&#xff0c;然后是摘要。包括以下步…

uni-app地图标点展示

使用微信小程序框架编写的。它包含一个模板部分和一个脚本部分。 模板部分: <template>: 这是微信小程序中用来定义页面结构的标签。<view>: 微信小程序的基本组件&#xff0c;用来展示内容或布局。<view class"page-body">: 定义了一个页面主体部…

【论文解读】ICLR 2024高分作:ViT需要寄存器

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2309.16588 摘要&#xff1a; Transformer最近已成为学习视觉表示的强大工具。在本文中&#xff0c;我们识别并表征监督和自监督 ViT 网络的特征图中的伪影。这些…

福德机械:植保无人机的领航者

亲爱的读者们&#xff0c;欢迎来到福德机械的神奇世界。在这个充满活力和创新的世界里&#xff0c;我们专注于植保无人机的发展与应用&#xff0c;以实现农业现代化、智能化和高效化的目标。植保无人机&#xff0c;作为一种高效、环保和安全的农业工具&#xff0c;已经逐渐成为…

VR播控系统深耕VR教学领域,助力开启未来新课堂

作为提升教育质量的技术之一&#xff0c;VR技术已经逐渐成为培养新一代人才、提升教学质量的重要方式&#xff0c;相比于传统教育&#xff0c;VR技术在教学方面的应用&#xff0c;所带来的变化和效果提升都是非常明显的&#xff0c;尤其是VR播控系统的上线&#xff0c;作为VR教…

HTML---初识CSS

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.CSS概念 CSS是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用于描述HTML文档外观样式的标记语言。通过CSS&#xff0c;开发者可以在不改变HTML标记结构的情况…

Verilog HDL数据类型

1 网络型&#xff08;net型&#xff09;数据 两种驱动方式&#xff1a;在结构描述中将其连接到一个门元件或模块的输出端&#xff1b;或用assign语句对其赋值。 【例】分别调用Verilog HDL提供的门元件和采用assign语句设计一个二输入与非门 input a,b; …

ElasticSearch - networking配置global

版本8.11 单机部署了一个节点 在elasticsearch.yml中 配置了network.host: 8.8.8.8(之前为127.0.0.1) 但启动服务失败 报错信息为: BindTransportException: Failed to bind to 8.8.8.8:[9300-9399] 为啥要配置8.8.8.8 是因为参考的官方说明 Networking | Elasticsearch Gu…

机器学习——特征预处理

【说明】文章内容来自《机器学习入门——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 特征预处理就是对数据进行集成、转换、规约等一系列处理&#xff0c;使之适合算法模型的过程。 sklearn提供了preprocessing模块&#xff0c;用于归一化、标准化、鲁棒化、…

STM32--中断使用(超详细!)

写在前面&#xff1a;前面的学习中&#xff0c;我们接触了STM32的第一个外设GPIO&#xff0c;这也是最常用的一个外设&#xff1b;而除了GPIO外&#xff0c;中断也是一个十分重要且常用的外设&#xff1b;只有掌握了中断&#xff0c;再处理程序时才能掌握好解决实际问题的逻辑思…

H3CIE_IS专题

isis与ospf的区别 区域划分&#xff1a; 骨干区域&#xff1a; 网络类型&#xff1a; DR选举 封装&#xff1a; 扩展性&#xff1a;IS-IS的报文 IIH&#xff1a;IS-IS Hello报文&#xff0c;建立和维护邻接关系 LSP&#xff1a;链路状态报文&#xff0c;传递链路状态的详细信…

网络安全等级保护2.0 定级、评测、实施与运维-复习资料

文章目录 一、练习题-11、单选题2、判断题3、填空题/单选题4、多选题 二、练习题-21、单选题2、多选题3、判断题 三、简答题1、ARP地址欺骗的分类、原理是什么&#xff1f;可采取什么措施进行有效控制&#xff1f;2、三级信息系统中&#xff0c;网络安全中的设备安全有哪些检查…

场强定位三角定位技术介绍和算法演示

场强定位&三角定位技术介绍 场强定位和三角定位是无线通信领域中用于确定物体位置的两种重要技术。它们在很多应用场景中&#xff0c;如室内导航、智能家居、紧急救援和军事操作等&#xff0c;发挥着关键作用。 ### 场强定位&#xff08;RSSI定位&#xff09; 场强定位&…

HTML5结构规范

一&#xff0c;getBoundingClientRect&#xff1b; 用于获得页面中某个元素的左&#xff0c;上&#xff0c;右和下分别相对浏览器视窗的位置。 const elTop el.getBoundingClientRect().top;二&#xff0c; Web Worker 当在 HTML 页面中执行脚本时&#xff0c;页面是不可响应的…

使用python脚本部署k8s集群

1.环境规划&#xff1a; 节点IP地址操作系统配置脚本运行节点192.168.174.5centos7.92G2核server192.168.174.150centos7.92G2核client1192.168.174.151centos7.92G2核client2192.168.174.152centos7.92G2 2.运行准备&#xff1a; yum install -y python python-pip pip in…