• OpenCV算法库


    numba

    numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。

    Numba是一个用于Python的即时(Just-in-time, JIT)编译器。将面向数组和使用大量数学的python代码优化到与c,c++和Fortran类似的性能,而无需改变Python的解释器。

    numba的使用方法

    numba对代码进行加速时,给要优化的函数加上@jit优化器

    1. from numba import jit
    2. @jit
    3. def f(a, b):
    4. return a + b

    numba将在调用期间推断参数类型,然后基于这个信息生成优化后的代码。

    Numba编译的函数可以调用其他编译函数。

    1. from math import sqrt
    2. @jit
    3. def hypot(a, b):
    4. return sqrt(square(a) + square(b))
    1. import numpy as np
    2. import time
    3. # 创建一个1000x1000的随机数组
    4. arr = np.random.rand(1000, 1000)
    5. # 记录开始时间
    6. start_time = time.time()
    7. # 计算数组元素之和
    8. sum_result = np.sum(arr)
    9. # 记录结束时间
    10. end_time = time.time()
    11. # 计算运算时间
    12. elapsed_time = end_time - start_time
    13. print("未使用Numba加速时的运算时间:", elapsed_time)

    使用Numba加速

    1. import numpy as np
    2. import time
    3. from numba import jit
    4. # 创建一个1000x1000的随机数组
    5. arr = np.random.rand(1000, 1000)
    6. # 定义一个使用Numba加速的函数
    7. @jit(nopython=True)
    8. def sum_array(arr):
    9. return np.sum(arr)
    10. # 记录开始时间
    11. start_time = time.time()
    12. # 调用加速后的函数计算数组元素之和
    13. sum_result = sum_array(arr)
    14. # 记录结束时间
    15. end_time = time.time()
    16. # 计算运算时间
    17. elapsed_time = end_time - start_time
    18. print("使用Numba加速时的运算时间:", elapsed_time)

    imutils

    imutils是一个专为OpenCV设计的Python封装库,它极大地简化了图像处理的过程

    imutils提供了一系列的工具函数,使得在Python中使用OpenCV进行图像处理变得更加快捷和简便。这些功能涵盖了图像的显示、平移、旋转、缩放以及骨架化等多种操作。由于imutils是基于OpenCV构建的,它可以与OpenCV无缝集成,为开发者提供了一个更加友好的接口来进行日常的图像处理任务。要安装imutils,可以使用pip命令pip install imutils。不过,需要注意的是,在使用imutils之前,需要确保已经安装了NumPy和OpenCV库,如果需要使用到将OpenCV图像转换为Matplotlib图像的功能,还需要安装Matplotlib库。

    imutils的使用方法

    OpenCV中提供了图像平移的实现,要先计算平移矩阵,然后利用仿射变换实现平移,在imutils中可直接进行图像的平移。

    translated = imutils.translate(img,x,y)
    • img:要移动的图像
    • x:沿x轴方向移动的像素个数
    • y: 沿y轴方向移动的像素个数

    图片的缩放在imutils中自动保持原有图片的宽高比,只指定宽度weight和Height即可。

    1. img = cv.imread("a.jpeg")
    2. resized = imutils.resize(img,width=200)
    3. print("原图像: ", img.shape)
    4. print("缩放后:",resized.shape)
    5. plt.figure(figsize=[10, 10])
    6. plt.subplot(1,2,1)
    7. plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    8. plt.title('原图')
    9. plt.axis("off")
    10. plt.subplot(1,2,2)
    11. plt.imshow(cv.cvtColor(resized, cv.COLOR_BGR2RGB))
    12. plt.title('缩放结果')
    13. plt.axis("off")
    14. plt.show()

     图像旋转

    1. import cv2
    2. import imutils
    3. image = cv2.imread('a.jpeg')
    4. rotated = imutils.rotate(image, 90)
    5. rotated_round = imutils.rotate_bound(image, 90)
    6. plt.figure(figsize=[10, 10])
    7. plt.subplot(1,3,1)
    8. plt.imshow(img[:,:,::-1])
    9. plt.title('原图')
    10. plt.axis("off")
    11. plt.subplot(1,3,2)
    12. plt.imshow(rotated[:,:,::-1])
    13. plt.title('逆时针旋转90度')
    14. plt.axis("off")
    15. plt.subplot(1,3,3)
    16. plt.imshow(rotated_round[:,:,::-1])
    17. plt.title('顺时针旋转90度')
    18. plt.axis("off")
    19. plt.show()

    骨架提取,是指对图片中的物体进行拓扑骨架(topological skeleton)构建的过程。imutils提供的方法是skeletonize(),第二个参数是结构参数的尺寸(structuring element),越小需要处理的时间越长。

    1. import cv2
    2. import imutils
    3. image = cv2.imread('a.jpg')
    4. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    5. skeleton = imutils.skeletonize(gray, size=(3, 3))
    6. plt.figure(figsize=(10,8),dpi=100)
    7. plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
    8. plt.xticks([]), plt.yticks([])
    9. plt.subplot(122),plt.imshow(skeleton,cmap="gray"),plt.title('骨架提取结果')
    10. plt.xticks([]), plt.yticks([])
    11. plt.show()

     在使用OPenCV时,应检查当前正在使用哪个版本的OpenCV,然后使用适当的函数或方法。在imutils中的is_cv2()、is_cv3()和is_cv4()是可用于自动确定当前环境的OpenCV的版本简单的功能。

    DNN模块

    DNN模块是指OpenCV中的深度神经网络(Deep Neural Networks)模块

    OpenCV的DNN模块是一个强大的工具,它允许开发者在计算机视觉应用中利用深度学习模型进行分类、分割、检测和跟踪等任务。这个模块支持加载和使用由不同深度学习框架训练的模型,包括但不限于Caffe、TensorFlow和Torch/PyTorch等。

    1. 模型加载与推断:DNN模块可以加载预训练的深度学习模型,并使用这些模型对新数据进行推断或预测。
    2. 性能优化:OpenCV在加载模型时会使用自己的DNN模块对模型进行重写,以提高模型的运行效率。
    3. 通用性:DNN模块不局限于特定的深度学习框架,它能够处理多种框架训练出的模型,这使得开发者可以自由选择适合自己的框架进行模型训练。
    4. 实用性:DNN模块的应用非常广泛,可以用于实时目标检测等复杂的计算机视觉任务。例如,可以使用Caffe框架下的MobileNet-SSD模型进行高效的目标检测。

     dnn.blobFromImage

    • 根据输入图像,创建维度N,通道数C,高H和宽W次序的blobs 
    1. blobFromImage(image,
    2. scalefactor=None,
    3. size=None,
    4. mean=None,
    5. swapRB=None,
    6. crop=None,
    7. ddepth=None):

    dnn.NMSBoxes 

    根据给定的检测boxes和对应的scores进行NMS(非极大值抑制)处理 

    1. NMSBoxes(bboxes,
    2. scores,
    3. score_threshold,
    4. nms_threshold,
    5. eta=None,
    6. top_k=None)

    dnn.readNet 

    加载深度学习网络及其模型参数 

    readNet(model, config=None, framework=None)
  • 相关阅读:
    PHP相关漏洞
    python(进阶篇)——多线程
    Commonjs与ES Module
    普罗米修斯
    基于vue和nodejs毕业设计酒店预约管理系统
    写给 MySQL 开发者的 TDengine 入门指南
    【Java并发编程】之线程安全
    [python-flask笔记4]路由说明和指定请求方式
    Java中的自定义异常
    IE退役倒计时, Edge接棒
  • 原文地址:https://blog.csdn.net/qq_64685283/article/details/136338012