OpenCv实战-1.使用OpenCV的自动文档扫描仪-主要功能是旋转文档

原文:https://learnopencv.com/automatic-document-scanner-using-opencv/ PS:作者的代码有些简略而且有点问题,完全复制下来无法正常运行

目的:将左侧这种倾斜的文档自动转换为右侧正向文档

将左侧
主要使用到了以下技术:
1.Morphological Operation 形态学操作
2.Edge Detection 边缘检测
3.Contour Detection 轮廓检测
4.Homography 单应性
5.GrabCut 图像分割
6.Perspective Transform 透视变换

OK,开始

1.导入图片,并进行形态学操作,屏蔽噪声

oriImg = cv2.imread("test.jpg") #原始图片路径
kernel = np.ones((5,5),np.uint8) #闭运算内核
img = cv2.morphologyEx(oriImg , cv2.MORPH_CLOSE, kernel, iterations=3)
"""
* `oriImg`: 输入图像。这通常是一个二值图像,但在某些情况下,它也可以是一个灰度图像。  
* `cv2.MORPH_CLOSE`: 这是你希望执行的形态学操作的类型。在这种情况下,它是闭合(closing)操作。
    闭运算:先腐蚀,后膨胀,主要用于出去噪声,比如小孔。  
    PS:开运算先腐蚀,后膨胀,用于关闭前景物体内部的小孔,或物体上的小黑点
* `kernel`: 这是一个定义结构元素的数组。结构元素定义了形态学操作的形状和大小。常见的结构元素包括方形、圆形、十字形等。`kernel`的大小和形状会影响形态学操作的效果。  
* `iterations=3`: 这指定了形态学操作的迭代次数。在这里,膨胀和腐蚀操作都会重复3次。增加迭代次数可以增强形态学操作的效果,但也可能导致图像过度失真。
"""

2.使用grabCut进行前后背景分离,如果你分割的效果不好,可以增加grabCut函数的次数

mask = np.zeros(img.shape[:2], np.uint8)  # 创建一个跟图像大小一样的全黑图像,用于前层背景
bgdModel = np.zeros((1, 65), np.float64)  # grabCut参数
fgdModel = np.zeros((1, 65), np.float64)  # grabCut参数
rect = (20, 20, img.shape[1] - 20, img.shape[0] - 20)  # 区分前景背景,一般取图像周围一圈20像素为背景,所以这里rect为前景
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)  # 区分前景背景
"""
img:输入图像,应该是8位单通道图像(灰度图)或8位3通道图像(彩色图)。对于彩色图像,函数会将其转换为 HSV 色彩空间。
mask:这是一个与输入图像大小相同的矩阵,用于存储分割信息。这个矩阵的每个元素可以是以下四个值之一:
GC_BGD --> 定义为明显的背景像素 0
GC_FGD --> 定义为明显的前景像素 1
GC_PR_BGD --> 定义为可能的背景像素 2
GC_PR_FGD --> 定义为可能的前景像素 3
rect:这是一个包含前景对象(你想分割出来的对象)的矩形框的坐标。它是一个四元组,格式为 (x, y, w, h),其中 (x, y) 是矩形左上角的坐标,w 是矩形的宽度,h 是矩形的高度。
bgdModel 和 fgdModel:这两个是输出数组,它们保存了背景模型和前景模型的内部数据。这些模型在函数内部被更新,并用于下一次迭代。通常,你不需要直接访问或修改这些数据。它们的尺寸应该是 65 * (1 + number of channels in img),其中 number of channels 是输入图像中的通道数(对于灰度图像是1,对于彩色图像是3)。
iterCount:迭代次数。这决定了算法将运行多少次迭代来尝试改进分割结果。增加这个值可能会改善分割的准确性,但也会增加计算时间。
mode:这个参数决定了函数的初始模式。在大多数情况下,你会使用 cv2.GC_INIT_WITH_RECT,它表示初始分割将由用户提供的矩形决定。
"""
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')  #背景的位置设置为0,前景的位置设置为1
img = img * mask2[:, :, np.newaxis] 
#np.newaxis作用是增加一个维度,因为原始img是3维,我们创建的Mask是2维,
# 这里的作用是将原图与我们的Mask相乘,因为Mask 背景为0,前景为1,所以相乘后,原图背景变为黑,前景不变

3.使用canny进行边缘检测

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  #转换为灰度图
gray = cv2.GaussianBlur(gray, (11, 11), 0)   #高斯模糊,去除噪声
# Edge Detection.
canny = cv2.Canny(gray, 0, 200)  #边缘检测
canny = cv2.dilate(canny, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)))  #对检测到边缘继续宁膨胀,方便更好的找到轮廓
# Blank canvas.
con = np.zeros_like(img)  #再创建一个全黑图像,
# Finding contours for the detected edges.
contours, hierarchy = cv2.findContours(canny, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)  #找到轮廓
# Keeping only the largest detected contour.
page = sorted(contours, key=cv2.contourArea, reverse=True)[:5]  #对前五个检测到的论轮廓按面积进行排序,因为可能右很多轮廓,这里取前5个,其实本例中这种明显的取第一个就行
con = cv2.drawContours(con, page, -1, (0, 255, 255), 3
<think>好的,我需要帮助用户找到关于OpenCV的实际应用案例或教程。首先,我要回顾用户提供的引用内容,看看有没有相关的信息。 引用[1]提到OpenCV在图像处理和深度学习的应用,包括基本概念和复杂变换,还有代码示例。这可能包含一些基础教程和图像处理的实际案例。 引用[2]介绍了Python OpenCV的基础知识、常用库、实战案例和注意事项,适合从入门到精通的学习路径。这里可能有具体的案例教程,比如图像识别或图像合成。 引用[3]则讨论了OpenCV与机器学习的结合,特别是人脸识别,使用了LBP特征和最近邻分类器。这里提供了一个具体的应用场景,即人脸识别的实现方法,可能包含代码示例和步骤说明。 接下来,我需要根据这些引用内容,整理出几个实际应用场景和教程方向。用户可能希望了解不同领域的应用,比如图像处理、物体检测、深度学习集成、AR开发等。每个方向需要给出简要说明和可能的教程内容,并引用对应的参考文献。 同时,用户要求生成相关问题,我需要考虑用户可能进一步询问的方向,比如图像处理的具体技术、深度学习模型的集成、性能优化等,确保问题与提供的引用内容相关,并引导用户深入探索。 最后,确保回答结构清晰,分点列出应用场景和教程,每个部分都附带引用标记,并且语言使用中文,符合格式要求。避免使用任何Markdown格式,保持自然的口语化表达。</think>### OpenCV 实战应用场景与教程推荐 OpenCV实战应用涵盖图像处理、计算机视觉、机器学习等多个领域,以下是具体场景及学习资源推荐: --- #### **1. 图像处理与增强** - **场景示例**:图像滤波、边缘检测、色彩空间转换、几何变换(旋转/缩放)、图像修复等。 - **教程方向**: - 使用 OpenCV 实现**图像去噪**(如高斯滤波、中值滤波)[^1]。 - 通过**Canny边缘检测**提取轮廓,结合霍夫变换检测直线或圆形[^2]。 - **实战案例**:文档扫描仪(透视变换矫正倾斜文档)[^2]。 --- #### **2. 物体检测与识别** - **场景示例**:人脸检测、车牌识别、手势识别、目标跟踪(如视频中追踪运动物体)。 - **教程方向**: - 基于 Haar 级联分类器或深度学习模型(如 YOLO、SSD)实现**实时物体检测**[^3]。 - **人脸识别**:结合 LBPH(局部二值模式直方图)特征和最近邻分类器,代码示例: ```python import cv2 recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.train(faces, labels) # 训练人脸数据 ``` --- #### **3. 深度学习与图像分析** - **场景示例**:图像分类、语义分割、风格迁移、GAN 生成图像。 - **教程方向**: - 使用 OpenCV 的 `dnn` 模块加载预训练模型(如 ResNet、MobileNet)进行**图像分类**。 - 实现**实时风格迁移**(如将名画风格应用于摄像头画面)。 --- #### **4. AR(增强现实)开发** - **场景示例**:基于标记的 AR(如识别二维码叠加虚拟物体)、姿态估计(如手势控制)。 - **教程方向**: - 使用 ArUco 标记实现**虚拟物体叠加**(需结合 OpenGL 或 Unity3D)[^2]。 - 通过**特征点匹配**实现平面物体的 AR 交互[^1]。 --- #### **5. 工业与医学应用** - **场景示例**:缺陷检测(如产品表面瑕疵)、医学影像分析(如肿瘤分割)。 - **教程方向**: - 利用**阈值分割**和形态学操作检测工业零件缺陷。 - 结合深度学习模型(如 U-Net)分析医学影像。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值