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

医院网站前置审批文件高端网站建设的公司哪家好

医院网站前置审批文件,高端网站建设的公司哪家好,dede网站安装教程,什么是网络营销的市场细分实时文档检测与透视变换详解在日常工作和学习中#xff0c;我们常常需要对纸质文档进行拍摄、扫描并矫正其形状#xff0c;使其看起来像是平铺扫描的效果。本文将结合 OpenCV 实现一个简单的实时文档检测与透视矫正系统#xff0c;并详细解析其中的原理和关键代码。一、核心… 实时文档检测与透视变换详解在日常工作和学习中我们常常需要对纸质文档进行拍摄、扫描并矫正其形状使其看起来像是平铺扫描的效果。本文将结合 OpenCV 实现一个简单的实时文档检测与透视矫正系统并详细解析其中的原理和关键代码。 一、核心原理要实现实时文档扫描和矫正整体思路可以分为以下几个步骤视频流采集使用摄像头实时获取图像帧。图像预处理转换为灰度图、滤波降噪、边缘检测。轮廓检测与筛选找到图像中的最大四边形轮廓判断是否是文档。透视变换根据检测到的四个顶点计算仿射矩阵并将文档拉伸为俯视图。二值化处理提升最终效果使其更接近扫描件。打开摄像头循环读取帧frame。复制原始帧以备后续高质量透视变换使用orig image.copy()。对帧做预处理灰度、降噪、增强。边缘检测Canny - 形态学处理可选 - 找轮廓findContours。在轮廓中找到可能的文档区域按面积筛、用 approxPolyDP 逼近多边形找到“4 个顶点且面积足够大”的候选。对顶点排序order_points计算目标宽高求透视变换矩阵getPerspectiveTransform并 warpPerspective 得到俯视图。后处理灰度/二值化/去噪/增强得到类似扫描件效果。 二、关键函数解析1. cv2.findContours用于从二值化图像中提取轮廓。cv2.RETR_EXTERNAL只检测最外层的轮廓忽略嵌套轮廓。cv2.CHAIN_APPROX_SIMPLE压缩冗余点只保留轮廓的关键点。2. cv2.approxPolyDP多边形逼近用于将曲线轮廓近似为多边形epsilon最大逼近误差常取轮廓周长的 2% ~ 5%。closedTrue表示轮廓闭合。如果逼近结果有 4 个顶点就很可能是一个矩形文档。3. cv2.getPerspectiveTransform 与 cv2.warpPerspective这两个函数是实现透视变换的关键cv2.getPerspectiveTransform(src, dst)计算从源点集到目标点集的 3×3 变换矩阵。cv2.warpPerspective(image, M, dsize)使用矩阵 M 将原图进行透视变换得到俯视图。4. 自定义函数 order_points在透视变换前需要对四个点的顺序进行排序左上、右上、右下、左下否则变换结果会错乱。 def order_points(pts):rect np.zeros((4, 2), dtypefloat32)s pts.sum(axis1)rect[0] pts[np.argmin(s)] # 左上rect[2] pts[np.argmax(s)] # 右下diff np.diff(pts, axis1)rect[1] pts[np.argmin(diff)] # 右上rect[3] pts[np.argmax(diff)] # 左下return rect 通过对坐标的和、差进行排序就能正确识别顶点顺序。 三、完整代码实现 import cv2 import numpy as npdef cv_show(name, img):显示图像cv2.imshow(name, img)cv2.waitKey(100)def order_points(pts):# 一共4个坐标点rect np.zeros((4, 2), dtypefloat32) # 用来存储排序之后的坐标# 按顺序找到对应坐标0123分别是 左上右上右下左下s pts.sum(axis1) # 对pts矩阵的每一行进行求和操作。(xy)rect[0] pts[np.argmin(s)]rect[2] pts[np.argmax(s)]diff np.diff(pts, axis1) # 对pts矩阵的每一行进行求差操作。(y - x)rect[1] pts[np.argmin(diff)]rect[3] pts[np.argmax(diff)]return rectdef four_point_transform(image,pts):rect order_points(pts)(tl, tr, br, bl) rectwidthA np.sqrt(((br[0] - bl[0]) ** 2) ((br[1] - bl[1]) ** 2))widthB np.sqrt(((tr[0] - tl[0]) ** 2) ((tr[1] - tl[1]) ** 2))maxWidth max(int(widthA), int(widthB))heightA np.sqrt(((tr[0] - br[0]) ** 2) ((tr[1] - br[1]) ** 2))heightB np.sqrt(((tl[0] - bl[0]) ** 2) ((tl[1] - bl[1]) ** 2))maxHeight max(int(heightA), int(heightB))dst np.array([[0, 0], [maxWidth - 1, 0], [maxWidth - 1, maxHeight - 1], [0, maxHeight - 1]], dtypefloat32)M cv2.getPerspectiveTransform(rect, dst)warped cv2.warpPerspective(image, M, (maxWidth, maxHeight))return warpedcap cv2.VideoCapture(0) # 确保摄像头是可以启动的状态。 if not cap.isOpened(): # 打开失败print(Cannot open camera)exit()while True:flag 0 # 用于标识 当前是否检测到文档ret, image cap.read() # 如果正确读取帧, ret 为Trueorig image.copy()if not ret: # 读取失败, 则退出循环print(不能读取摄像头)breakcv_show(image, image)gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 图像处理-转换为灰度图# 预处理gray cv2.GaussianBlur(gray, (5, 5), 0) # 高斯滤波edged cv2.Canny(gray, 15, 45)cv_show(1, edged)# 轮廓检测cnts cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]cnts sorted(cnts, keycv2.contourArea, reverseTrue)[:3]image_contours cv2.drawContours(image, cnts, -1, (0, 255, 0), 2)cv_show(image_contours, image_contours)# 遍历轮廓for c in cnts:# 计算轮廓近似peri cv2.arcLength(c, closedTrue) # 计算轮廓的周长# C表示输入的点集# epsilon表示从原始轮廓到近似轮廓的最大距离它是一个准确度参数# True表示封闭的approx cv2.approxPolyDP(c, 0.05 * peri, closedTrue) # 轮廓近似area cv2.contourArea(approx)# 4个点的时候就拿出来if area 20000 and len(approx) 4: # 20000 , 检测四边形轮廓screenCnt approxflag 1print(peri, area)print(检测到文档)breakif flag 1:# 展示结果# print(STEP 2: 获取轮廓)image_contours cv2.drawContours(image, contours[screenCnt], contourIdx0, color(0, 255, 0), thickness2)cv_show(image, image_contours)# 透视变换warped four_point_transform(orig, screenCnt.reshape(4, 2))cv_show(warped, warped)# 二值处理warped cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)# ref cv2.threshold(warped, 220, 255, cv2.THRESH_BINARY)[1]ref cv2.threshold(warped, thresh0, maxval255, typecv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]cv_show(ref, ref)cap.release() # 释放捕获器 cv2.destroyAllWindows() # 关闭图像窗口 边缘检测Canny与参数选择edged cv2.Canny(gray, threshold1, threshold2)threshold1低阈值threshold2高阈值。通常 threshold1 threshold2。经验法自动v np.median(gray) sigma 0.33 lower int(max(0, (1.0 - sigma) * v)) upper int(min(255, (1.0 sigma) * v)) edged cv2.Canny(gray, lower, upper) 你原代码用 (15,45)这是比较低的阈值能检测微弱边缘但在嘈杂背景下会产生大量杂边。替代/补充Sobel / Scharr 求梯度然后阈值化也可。形态学操作闭运算 morphologyEx可以“连通”断裂边缘便于后面检测完整轮廓。形态学操作可选但常用在 Canny 后kernel cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))edged cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)闭合小缝隙避免轮廓断裂。cv2.dilate/erode 组合用于去小噪点或填充小洞。轮廓检测findContours 的细节与兼容写法cnts cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)不同 OpenCV 版本返回值不同稳健写法cnts cv2.findContours(... ) cnts cnts[0] if len(cnts) 2 else cnts[1] 常见参数cv2.RETR_EXTERNAL只要最外层轮廓对文档通常可行。cv2.CHAIN_APPROX_SIMPLE压缩点集节省计算。排序与筛选按面积排序sorted(cnts, keycv2.contourArea, reverseTrue)通常只检查前 N 个最大轮廓[:3]。面积阈值代码中 area 20000这是固定阈值在不同分辨率下表现不同。建议用相对阈值image_area image.shape[0] * image.shape[1] min_area max(10000, image_area * 0.01) # 1% 或至少 10000 示例计算值640×480307,2001% 3,0722% 6,1445% 15,3601280×720921,6001% 9,2162% 18,4325% 46,0801920×10802,073,6001% 20,7362% 41,4725% 103,680因此 20,000 大致等于 1%1080p~ 5%640×480。用相对阈值更鲁棒。进一步验证要求 len(approx) 4四边形。cv2.isContourConvex(approx) 可判断是否凸。计算 aspect_ratio maxWidth/maxHeight排除极端扁平或奇怪的矩形比如 0.2 或 5.0 可视为异常。approxPolyDP多边形近似与 epsilon 调参approx cv2.approxPolyDP(c, epsilon, True)epsilon 常设为周长的一个小比例epsilon k * perik 在 0.01 ~ 0.1 间变化。k 越小近似越精确保留更多点。0.05代码中是常用值。如果 k 过大轮廓可能被简化成三角形或更少顶点如果太小噪声会让逼近得到很多顶点而不是 4 个。建议在调试时打印出 peri 与 len(approx)观察如何随 k 改变。四、效果与优化运行程序后摄像头会实时显示画面当检测到文档时会绘制绿色轮廓并自动透视矫正输出一张类似扫描仪效果的图像。可以进一步优化调整 0.05 * peri 参数提高逼近精度。增加自适应阈值或增强对比度提高二值化效果。结合深度学习模型如EAST文本检测实现更精准的文档边缘检测。 五、总结本文展示了如何利用 OpenCV 实时检测文档并进行透视矫正核心技术包括边缘检测 轮廓提取 确定文档区域多边形逼近 获取四个顶点透视变换 将倾斜的文档拉正二值化处理 提升可读性。该方法不仅可用于文档扫描还可以应用于名片识别、投影仪幕布矫正、桌面物品俯视校正等场景。
http://www.pierceye.com/news/653559/

相关文章:

  • 做网站还有市场吗建一个网站花费
  • 惠州网站建设哪里有wap网站生成
  • 长沙网站外包公司吗搭建wordpress博客系统
  • 通州企业网站建设做网站合成APP
  • 深圳观澜网站建设室内设计软件手机版
  • 苏州建设网站服务国外做家装的网站有哪些
  • 做导航网站赚钱吗大兴区营销网络推广行业
  • 红衫中国网站建设福建手机版建站系统开发
  • 做平面的网站wordpress授权主题
  • 如何做织梦论坛类的网站官网建设目的
  • 安徽网新科技有限公司 网站开发静态网页报告
  • 营销做网站公司怎么做国际货运代理外贸网站
  • 网站建设部署与发布有效期宝石网站建设
  • 网站建设有什么需求分析现在网站都是拿什么软件做的
  • 网站建设需求分析报告撰写阿里云建设网站流程
  • 网站导航栏设计要求seo搜索引擎的优化
  • 杭州做商务网站全屋定制自己设计
  • 汉中定制网站建设公司南昌公司注册
  • 商务网站建设流程步骤小型公司注册资金写多少合适
  • 台州公司网站外包自己做网站运营
  • 聚名网站专业团队p图
  • 网站推广排名收费徐家汇网站建设
  • 做app软件大概多少钱宁波seo优化项目
  • 网站建设土豆视频教程最专业微网站首选公司
  • 合肥做检查军大网站家装公司名称
  • 网站搜索怎么做的苏州网站建设介绍
  • 免费微网站建设地图标注收费属于违法行为吗
  • 网站开发工程师php岗位职责企业网站案例展示
  • 青岛网站营销推广网站工作室设计
  • 网站可以增加关键词吗做网站也是一门技术