OpenCV项目1-OCR识别


文章处理的图片:
在这里插入图片描述

项目思路:

思路:我们拿到一张图片不是直接就识别的,而是做一些处理,去除我们不需要的信息,保留我们所需要的信息,再做识别。

通常要做的是对图片进行灰度化处理,再进行滤波,形态学等等去除掉不要的信息。

因为在处理的过程中,我们要对每一步处理后的图片进行查看分析,我们要显示很多次图片,因此我们可以把显示图片的功能封装成一个函数形式来使用:

# 显示图片
def cv_show(winname, image):
    cv2.imshow(winname, image)
    # 销毁窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()

我们在拿到一张图片的时候,有时候图片的大小不好处理,比如我们这次处理的图片的大小为3264×2448。我们先对尺寸大小进行处理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Bc1Ar6u-1650465136824)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420211154824.png)]

可以将修改尺寸的功能封装成一个函数:

# 封装resize功能.
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    dim = None # 缩放后的宽和高
    (h, w) = image.shape[:2]
    # 不做处理
    if width is None and height is None:
        return image
    # 指定了resize的height
    if width is None:
        r = height / float(h) # 缩放比例
        dim = (int(w * r), height)
    # 指定了resize的width
    else:
        r = width / float(w)
        dim = (width, int(h * r))
    resized = cv2.resize(image, dim, interpolation=inter)
    return resized

我们修改成高度为500的大小处理图片:

image = resize(image_copy, height = 500)

1、灰度化处理:

# 灰度化处理
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv_show('gray',gray)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMF9TRqT-1650465136825)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420212814430.png)]

2、采用高斯滤波去噪

参考文章:
OpenCV学习笔记8-滤波器原理及代码实现

为后续Canny检测服务:

# 高斯平滑
Gaussian = cv2.GaussianBlur(gray, (5, 5), 0)
cv_show('Gaussian',Gaussian)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6t0WgS7Y-1650465136825)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420212856678.png)]

3、边缘检测

参考文章:
OpenCV学习笔记8-滤波器原理及代码实现

我们采用Canny找出信息的边缘,为后续查找轮廓做准备:

# 边缘检测,寻找边界
edged = cv2.Canny(Gaussian, 70, 200)
cv_show('edged',edged)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdAPQy5S-1650465136826)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420212942549.png)]

4、查找轮廓并排序:

参考文章:
OpenCV学习笔记10-图像轮廓的相关知识及代码实现

# 查找轮廓
cnts = cv2.findContours(edged, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

找到轮廓后,我们排序一下,为后面的透视变换和绘制轮廓做准备:

# 将轮廓按照面积降序排序
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)

5、绘制全部轮廓

参考文章:
OpenCV学习笔记10-图像轮廓的相关知识及代码实现

注意绘制轮廓会对原图片进行绘制,我们copy一份:

# 绘制所有轮廓
image_contours = cv2.drawContours(image.copy(), cnts, -1, (0, 0, 255), 1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDGwj06q-1650465136826)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420213949076.png)]

6、多边形逼近

参考文章:
OpenCV学习笔记10-图像轮廓的相关知识及代码实现

绘制轮廓的方法有可能使得轮廓线粗糙且不平滑,我们用多边形逼近的方法去得到平滑的轮廓,只保留最有用的信息,注意也要对copy的图片进行处理。近似完后,只剩下四个顶点的角的坐标,因此下面的len(approx)=4

# 遍历轮廓找出最大的轮廓.
for c in cnts:
    # 计算轮廓周长
    perimeter = cv2.arcLength(c, True)
    # 多边形逼近,得到近似的轮廓
    approx = cv2.approxPolyDP(c, 0.02 * perimeter, True)
    # 最大的轮廓
    if len(approx) == 4:
        # 接收approx
        screen_cnt = approx
        break
# 画出多边形逼近
image_screen_cnt = cv2.drawContours(image.copy(), [screen_cnt], -1, (0, 0, 255), 1)
cv_show('image_screen_cnt', image_screen_cnt)

7、仿射变换

参考文章:
OpenCV学习笔记7-图像的基本变换(附代码实现)

我们对图片进行完预处理后,得到的近似轮廓,因为我们只想处理最有用的信息,其他周围没有用的背景给它去掉,因此我们用仿射变换使得图像变正。

透视变换要找到变换矩阵,因为多边形逼近后只留下四个顶点的坐标,因此我们需要找到原图的四个坐标和仿射变换后的四个坐标。

现在已经找到了原图的4个点的坐标。需要知道变换后的4个坐标,因此我们可以对原图的四个坐标按照角点顺时针或者逆时针排序,封装成一个函数:

# 排序功能是一个独立功能,可以封装成一个函数
def order_points(pts):
    # 创建全是0的矩阵, 来接收等下找出来的4个角的坐标.
    rect = np.zeros((4, 2), dtype='float32')
    # 列相加
    s = pts.sum(axis=1)
    # 左上的坐标一定是x,y加起来最小的坐标. 右下的坐标一定是x,y加起来最大的坐标.
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]
    # 右上角的x,y相减的差值一定是最小的.
    # 左下角的x,y相减的差值, 一定是最大.
    # diff的作用是后一列减前一列得到的差值
    diff = np.diff(pts, axis=1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]
    return rect

找到了原图的四个角点的坐标后,计算点与点的距离,得到新的坐标,然后进行仿射变换,我们把仿射变换功能封装成一个函数:

# 把透视变换功能封装成一个函数
def four_point_transform(image, pts):
    # 对输入的4个坐标排序
    rect = order_points(pts)
    # top_left简称tl,左上角
    # top_right简称tr,右上角
    # bottom_right简称br,右下角
    # bottom_left简称bl,左下角
    (tl, tr, br, bl) = rect
    # 空间中两点的距离,并且要取最大的距离确保全部文字都看得到
    widthA = 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)
    max_width = 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)
    max_height = max(int(heightA), int(heightB))
    # 构造变换之后的对应坐标位置.
    dst = np.array([
        [0, 0],
        [max_width, 0],
        [max_width, max_height],
        [0, max_height]], dtype='float32')
    # 计算变换矩阵
    M = cv2.getPerspectiveTransform(rect, dst)
    # 透视变换
    warped = cv2.warpPerspective(image, M, (max_width, max_height))
    return warped

调用仿射变换的函数:

进项仿射变换的时候,我们需要将之前的大小还原回来:

# 计算比例. 限定高度500
# 此时像素点都缩小了一定的比例,进行放射变换时要还原
ratio = image.shape[0] / 500.0
# 拷贝一份
image_copy = image.copy()
# 进行仿射变换,使图片变正
warped = four_point_transform(image_copy, cv_show('warped', warped)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDLhhmZP-1650465136826)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420220024152.png)]

拉正之后,我们通过二值化处理进行过滤信息,得到有用的信息,方便ocr的扫描和提取:

# 二值处理,先转成灰度图
warped_gray = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
# 再二值化处理
ref = cv2.threshold(warped_gray, 150, 255, cv2.THRESH_BINARY)[1]
cv_show('ref', ref)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qQmwo4AU-1650465136827)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420220254980.png)]

8、写入图片文件

将处理好的文件保存下来

# 把处理好的图片写入图片文件.
_ = cv2.imwrite('./scan.jpg', ref)

9、扫描读取

我们需要导入pytesseract的工具包,进行扫描文字:

我们先打开cmd下载一下:

pip install pytesseract

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w53h48MD-1650465136827)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420221034913.png)]

出现这个情况不要紧,我们修改一下下载路径:

pip install --target=d:\python3.9\lib\site-packages pytesseract

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ymsdGm2N-1650465136828)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420221037404.png)]

具体可以查看我的这个文章:
已解决:Requirement already satisfied:xxx

pytesseract要求的image不是opencv读进来的image, 而是pillow这个包, 即PIL

所以我们要传入pillow包的图片!

页面分隔模式+OCR引擎模式可以看看我这篇文章:
OpenCV学习笔记11-Tesseract-OCR的安装和使用

  • pytesseract.image_to_string(Image.open(‘图片路径’), lang='使用的语言包‘, config=‘页面分隔模式+OCR引擎模式’)
    • tesseract5.0配套的traineddata文件某些语言版本不支持老版本的引擎(即oem=0)。

# pytesseract要求的image不是opencv读进来的image, 而是pillow这个包, 即PIL
text = pytesseract.image_to_string(Image.open('./scan.jpg'), lang='chi_sim+eng', config='--oem 1')

10、写入本地

# 保存到本地
with open('output.txt', 'w') as f:
    print(text)
    f.write(str(text))

我们可以在保存的目录下看到已保存的scan和output

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gh3l0eRX-1650465136828)(D:/Desktop/%E5%A4%A7%E5%AD%A6/MSB/AIoT/python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%9D%E7%BA%A7%EF%BC%88%E4%B8%80%EF%BC%89/%E4%BB%A3%E7%A0%81/image-20220420222918250.png)]

查看识别结果:

eee ek RK KOK KOR KOK

WHOLE FOODS MARKET - WESTPORT,CT 06880
399 POST RD WEST - (203) 227-6858

365
365
365
365

uexH TAX

BACON LS
BACON LS
BACON LS
BACON LS

BROTH CHIC
FLOUR ALMOND

CHKN BRST BNLSS SK
HEAVY CREAM
BALSMC REDUCT

BEEF GRND 85/15
JUICE COF CASHEW C

.00

DOCS PINT ORGANIC
HNY ALMOND BUTTER

BAL

NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP

4.99
4.99
4.99
4.99
2.19
11.99
18.80
3.39
6.49
5.04
8.99
194.49
9.99
101.33

ae Mees es ieee i en

呃呃呃呃呃,好像识别结果准确率不高,但是大部分还是识别出来了。

完整代码:

import cv2
import numpy as np
import pytesseract
from PIL import Image

# 显示图片
def cv_show(winname, image):
    cv2.imshow(winname, image)
    # 销毁窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
# 有些原图片的size不好处理,我们可以封装成一个函数来统一图片的size
# 封装resize功能.
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    dim = None # 缩放后的宽和高
    (h, w) = image.shape[:2]
    # 不做处理
    if width is None and height is None:
        return image
    # 指定了resize的height
    if width is None:
        r = height / float(h) # 缩放比例
        dim = (int(w * r), height)
    # 指定了resize的width
    else:
        r = width / float(w)
        dim = (width, int(h * r))
    resized = cv2.resize(image, dim, interpolation=inter)
    return resized
    
# 进行透视变换.
# 透视变换要找到变换矩阵
# 变换矩阵要求原图的4个点坐标和变换之后的4个点的坐标
# 现在已经找到了原图的4个点的坐标。需要知道变换后的4个坐标
# 先对获取到的4个角点按照一定顺序(顺/逆时针)排序
# 排序功能是一个独立功能,可以封装成一个函数
def order_points(pts):
    # 创建全是0的矩阵, 来接收等下找出来的4个角的坐标.
    rect = np.zeros((4, 2), dtype='float32')
    # 列相加
    s = pts.sum(axis=1)
    # 左上的坐标一定是x,y加起来最小的坐标. 右下的坐标一定是x,y加起来最大的坐标.
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]
    # 右上角的x,y相减的差值一定是最小的.
    # 左下角的x,y相减的差值, 一定是最大.
    # diff的作用是后一列减前一列得到的差值
    diff = np.diff(pts, axis=1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]
    return rect
    
# 把透视变换功能封装成一个函数
def four_point_transform(image, pts):
    # 对输入的4个坐标排序
    rect = order_points(pts)
    # top_left简称tl,左上角
    # top_right简称tr,右上角
    # bottom_right简称br,右下角
    # bottom_left简称bl,左下角
    (tl, tr, br, bl) = rect
    # 空间中两点的距离,并且要取最大的距离确保全部文字都看得到
    widthA = 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)
    max_width = 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)
    max_height = max(int(heightA), int(heightB))
    # 构造变换之后的对应坐标位置.
    dst = np.array([
        [0, 0],
        [max_width, 0],
        [max_width, max_height],
        [0, max_height]], dtype='float32')
    # 计算变换矩阵
    M = cv2.getPerspectiveTransform(rect, dst)
    # 透视变换
    warped = cv2.warpPerspective(image, M, (max_width, max_height))
    return warped
    
# 把图像预处理的功能封装成一个函数
def Image_Pretreatment(image):
    # 图片预处理
    # 灰度化处理
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # cv_show('gray',gray)
    # 高斯平滑
    Gaussian = cv2.GaussianBlur(gray, (5, 5), 0)
    # cv_show('Gaussian',Gaussian)
    # 边缘检测,寻找边界(为后续查找轮廓做准备)
    edged = cv2.Canny(Gaussian, 70, 200)
    # cv_show('edged',edged)
    # 查找轮廓
    cnts = cv2.findContours(edged, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]
    # 将轮廓按照面积降序排序
    cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
    # 绘制所有轮廓
    image_contours = cv2.drawContours(image.copy(), cnts, -1, (0, 0, 255), 1)
#     cv_show('image_contours', image_contours)
    # 遍历轮廓找出最大的轮廓.
    for c in cnts:
        # 计算轮廓周长
        perimeter = cv2.arcLength(c, True)
        # 多边形逼近,得到近似的轮廓
        # 近似完后,只剩下四个顶点的角的坐标
        approx = cv2.approxPolyDP(c, 0.02 * perimeter, True)
        # 最大的轮廓
        if len(approx) == 4:
            # 接收approx
            screen_cnt = approx
            break
    # 画出多边形逼近
    image_screen_cnt = cv2.drawContours(image.copy(), [screen_cnt], -1, (0, 0, 255), 1)
    # cv_show('image_screen_cnt', image_screen_cnt)
    # 进行仿射变换,使图片变正
    warped = four_point_transform(image_copy, screen_cnt.reshape(4, 2) * ratio)
    # cv_show('warped', warped)
    # 二值处理,先转成灰度图
    warped_gray = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
    # 再二值化处理
    ref = cv2.threshold(warped_gray, 150, 255, cv2.THRESH_BINARY)[1]
    cv_show('ref', ref)
    # 旋转变正
    # dst = cv2.rotate(ref, cv2.ROTATE_90_COUNTERCLOCKWISE)
    # cv_show('dst', dst)
    return ref
    
if __name__ == "__main__":
    # 读取图片
    image = cv2.imread('D:/Desktop/daxue/shiyanshi/Project/OCR/images/receipt.jpg')
    # 计算比例. 限定高度500
    # 此时像素点都缩小了一定的比例,进行放射变换时要还原
    ratio = image.shape[0] / 500.0
    # 拷贝一份
    image_copy = image.copy()
    # 修改尺寸
    image = resize(image_copy, height=500)
    # cv_show('image', image)
    # 返回透视变换的结果
    ref = Image_Pretreatment(image)
    # 把处理好的图片写入图片文件.
    _ = cv2.imwrite('./scan.jpg', ref)
    # pytesseract要求的image不是opencv读进来的image, 而是pillow这个包, 即PIL
    text = pytesseract.image_to_string(Image.open('./scan.jpg'), lang='chi_sim+eng', config='--oem 1')
    # 保存到本地
    with open('output.txt', 'w') as f:
        print(text)
        f.write(str(text))

附OpenCV目录:OpenCV总目录学习笔记

智科专业小白,写博文不容易,如果喜欢的话可以点个赞哦!请添加图片描述

  • 27
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。 应用领域 OpenCV广泛应用于: 科研与教育:作为计算机视觉教学和研究的基础工具,OpenCV简化了算法原型开发与验证过程。 工业自动化:在视觉检测、机器人导航、产品质量控制等工业场景中,OpenCV用于实时图像分析与决策。 安防监控:用于人脸识别、行人检测、行为分析等智能监控系统。 医疗影像分析:在医疗领域,OpenCV可用于医学图像处理、病灶检测、诊断辅助等应用。 自动驾驶:在车辆视觉感知系统中,OpenCV用于道路标志识别、障碍物检测、车道线识别等任务。 多媒体应用:如图像编辑软件、AR/VR应用、游戏开发等,利用OpenCV进行图像和视频处理。 物联网与嵌入式系统:在资源受限的嵌入式设备上,OpenCV提供轻量级的计算机视觉解决方案。 学习与社区资源 OpenCV拥有丰富的官方文档、教程、示例代码以及活跃的开发者社区,包括GitHub、StackOverflow、官方论坛等,为学习和使用OpenCV提供了有力支持。此外,有许多书籍、在线课程、博客文章和研讨会专门讲解OpenCV的使用和计算机视觉技术。 综上所述,OpenCV作为一款功能强大、高效、跨平台且开源的计算机视觉库,为开发者提供了实现各类图像和视频处理任务所需的工具箱,其广泛的应用领域和活跃的社区支持使之成为计算机视觉领域不可或缺的开发工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aaron-ywl

你的鼓励是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值