初识OpenCV基础功能

# OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。 他是开源的
# cv不支持中文 所有的中文都不支持 包括路径里面的中文不然就报错
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
def put_text(image, text, position, font_path, font_size, color):
    # 将 OpenCV 图像转换为 PIL 图像
    pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(pil_image)
    # 加载字体
    font = ImageFont.truetype(font_path, font_size)
    # 在图像上绘制文本
    draw.text(position, text, fill=color, font=font)
    # 将 PIL 图像转换回 OpenCV 图像
    image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
    return image_with_text
def demo1(): # 创建窗口的完整写法 这个可以自由的更改窗口大小
    # cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时
    # cv2.namedWindow(winname, flags=None)
    # winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。
    # flags (int, 可选): 窗口的标志,用于设置窗口的行为。默认值为cv2.WINDOW_AUTOSIZE
    # 常见的标志包括:
    # cv2.WINDOW_NORMAL: 允许调整窗口大小。
    # cv2.WINDOW_AUTOSIZE`: 窗口大小根据图像大小自动调整,不能手动调整
    # 创建窗口函数
    cv2.namedWindow("image",cv2.WINDOW_NORMAL) # 传入窗口名称 和 是否允许手动调整窗口大小
    # 设置窗口大小 cv2.resizeWindow("Image Window",500,300) 分别传入窗口名称和长和宽
    cv2.resizeWindow("image",500,300)
    # 读取一个图片 变量名=cv2.imread(路径)   返回的是一个图片的矩阵
    image=cv2.imread("../../assets/images/car.png") # 路径转义问题 字符前面加r
    # 用窗口显示图片
    cv2.imshow("image",image)
    # 等待键盘操作 0 无限等待 单位毫秒
    # 使用 `cv2.waitKey` 暂停程序执行,等待用户按键。参数 `0` 表示无限期等待,直到有按键事件发生。返回值:是一个ASCII值,例如:q 键 ASCII 值为 113   ESC 键是27 int型
    # 可以使用这个返回值进行一些布尔操作
    while True:
        if cv2.waitKey(0)==27:
            break
    # 关闭所有窗口
    cv2.destroyAllWindows()
    return None

def demo2():# 利用numpy创建一个图片矩阵 快速创建图片窗口 不写窗口大小
    # 你可以使用np.zeros函数创建一个全零数组,这个数组可以表示一个空白图像。数组的形状应该符合图像的尺寸和通道数(例如,对于 RGB 图像,形状应为(height, width, 3))height, width,就是图片的宽高
    # 3通道是RGB 1通道是灰度图像
    cv2.namedWindow("image")
    image=np.zeros((300,200,3))
    cv2.imshow("image",image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    # 保存图片 cv2.imwrite(保存的路径(别忘了后缀),图片矩阵变量) 返回值是一个布尔值 保存成功为True 失败则False
    if cv2.imwrite("../../assets/images/black.png", image):
        print("保存成功")
    else:
        print("保存失败")
    pass
def demo3(): # 图片裁剪
    """
    假设你有一个图像 `img`,它的类型是 `numpy.ndarray`。`img[y:y+h, x:x+w]` 的含义如下:
    x: 子区域左上角的 x 坐标。
    y: 子区域左上角的 y 坐标。
    w: 子区域的宽度。
    h: 子区域的高度。
    切片操作
    img[y:y+h, x:x+w]提取的是从(x, y)开始,宽度为 `w`,高度为 `h` 的矩形区域。
    """

    # 从左上到右下 x,y是左上角的坐标 wh是宽和高
    x,y,w,h=200,150,300,100
    img=cv2.imread("../../assets/images/car.png")
    license_plate=img[y:y+h,x:x+w]
    cv2.namedWindow("image")
    cv2.namedWindow("image2")
    cv2.imshow("image",license_plate)
    cv2.imshow("image2",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    pass
def demo4():
    # `cv2.resize`是OpenCV库中的一个函数,用于调整图像的大小。这个函数在图像处理中非常常用,特别是在需要对图像进行缩放、放大或缩小以适应不同需求时。 cv2.resize(图片矩阵,(宽,高)) 图像的大小不是窗口的大小
    #
    # 获取图片规格 返回一个元组 为宽和高和通道数 img.shape 返回一个元组(宽,高,通道数)
    img = cv2.resize(cv2.imread("../../assets/images/car.png"), (100, 100))
    cv2.namedWindow("image")
    cv2.imshow("image", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    shape1=img.shape
    print(shape1)
def circle():# 图像绘制
    # 绘制圆形
    # cv2.circle()函数用于在图像上绘制圆形。该函数的语法如下:
    # cv2.circle(img, center, radius, color, thickness) 在img 上面绘制
    # img:要绘制圆形的图像。
    # center`:圆心的坐标。
    # radius`:圆的半径。
    # `color`:圆的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。
    # thickness`:圆的边界线条的厚度,如果为负值或`cv2.FILLED`,表示填充整个圆。
    img=cv2.imread("../../assets/images/car.png")
    cv2.namedWindow("img")
    center=(50,50)
    radius=50
    color=(255,0,0)
    w=5
    round1=cv2.circle(img,center=center,radius=radius,color=color,thickness=w)
    cv2.imshow("img",round1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    pass
def rectangle(): # 绘制矩形
    # cv2.rectangle()`函数用于在图像上绘制矩形。该函数的语法如下:
    # cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    # - `img`:要绘制矩形的图像。
    # - `pt1`:矩形的一个顶点。
    # - `pt2`:矩形对角线上的另一个顶点。
    # - `color`:矩形的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。
    # - `thickness`:矩形边框的厚度,如果为负值或`cv2.FILLED`,表示填充整个矩形内部
    img=np.zeros((400,400,3))
    cv2.namedWindow("img")
    rectangle1=cv2.rectangle(img,(50,50),(400,400),color=(255,0,0),thickness=10)
    cv2.imshow("img",rectangle1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
def putText():# 添加文本
    # cv2.putText` 是 OpenCV 库中的一个函数,用于在图像上添加文本。这个函数在图像处理和计算机视觉任务中非常有用,特别是在需要标注图像、显示信息或调试时。
    # cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
    """
    - img (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。
    - text (str): 要添加的文本字符串。
    - org (tuple): 文本的起始位置,是一个二元组 `(x, y)`,表示文本左下角的坐标。
    - fontFace
      (int): 字体类型,常见的字体类型包括:
      - `cv2.FONT_HERSHEY_SIMPLEX`: 正常大小的无衬线字体
      - `cv2.FONT_HERSHEY_PLAIN`: 小号的无衬线字体
      - `cv2.FONT_HERSHEY_DUPLEX`: 正常大小的无衬线字体,比 `FONT_HERSHEY_SIMPLEX` 更粗
      - `cv2.FONT_HERSHEY_COMPLEX`: 正常大小的有衬线字体
      - `cv2.FONT_HERSHEY_TRIPLEX`: 正常大小的有衬线字体,比 `FONT_HERSHEY_COMPLEX` 更粗
      - `cv2.FONT_HERSHEY_SCRIPT_SIMPLEX`: 手写风格的字体
      - `cv2.FONT_HERSHEY_SCRIPT_COMPLEX`: 手写风格的字体,比 `FONT_HERSHEY_SCRIPT_SIMPLEX` 更粗
      - `cv2.FONT_ITALIC`: 斜体修饰符,可以与其他字体类型组合使用
    - **fontScale** (float): 字体大小的比例因子。
    - **color** (tuple): 文本颜色,是一个三元组 `(B, G, R)`,表示蓝色、绿色和红色的值。
    - **thickness** (int, 可选): 文本线条的厚度,默认值为 1。
    - lineType
      (int, 可选): 线条类型,常见的线条类型包括:
      - `cv2.LINE_4`: 4 连通线
      - `cv2.LINE_8`: 8 连通线
      - `cv2.LINE_AA`: 抗锯齿线(默认值)
    返回值
    - **img** (numpy.ndarray): 添加文本后的图像。
    """
    img = cv2.imread("../../assets/images/car.png")
    # 定义字体的文本内容
    text = "后"
    # 起始坐标
    c = (100, 200)
    # 字体格式
    f = cv2.FONT_HERSHEY_PLAIN
    # 字体大小
    size = 2
    # 字体粗细
    w = 1
    # 字体颜色
    color = (0, 0, 255)
    # 写字
    # c_img = cv2.putText(img,text=text,org=c,fontScale=size,fontFace=f,color=color,thickness=w)
    # 换成中文
    font_path = "../../assets/myfont/simhei.ttf"
    c_img = put_text(img, "你好世界", c, font_path, 30, color)
    cv2.imshow("a", c_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    pass
def line():
    # cv2.line(img, pt1, pt2, color, thickness lineType) -> img
    # img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。
    # pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。
    # pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。
    # color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如 `(255, 0, 0)` 表示纯蓝色)。对于灰度图像,只需要一个整数值即可。
    # thickness: 可选参数,定义直线的宽度。默认值是 1。
    img = np.zeros((400, 400, 3))
    cv2.namedWindow("img")
    line1=cv2.line(img,(50,50),(400,400),color=(0,0,255),thickness=10)
    cv2.imshow("img",line1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    pass
def mouse(): # 控制鼠标
    # cv2.setMouseCallback是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。
    # 事件就是cv2的属性
    # 定义窗口
    cv2.namedWindow("img",cv2.WINDOW_NORMAL)
    img = np.zeros((400, 400, 3))
    # 执行鼠标操作的回调函数
    def draw_test(event,x, y, flag, param):
        global drawing
        if event==cv2.EVENT_LBUTTONDOWN:
            drawing=True
        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing:
                cv2.circle(img, (x, y), 15, (255, 0, 0), -1)
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            cv2.circle(img, (x, y), 15, (255, 0, 0), -1)
    # draw_test函数:
    # event`: 鼠标事件类型,如 `cv2.EVENT_LBUTTONDOWN` 表示左键按下。
    # x`, `y`: 鼠标事件发生时的坐标。
    # flags` 额外的标志位,通常不用。
    #`param: 传递给回调函数的参数,通常不用。
    # cv2.setMouseCallback('image', draw_test)` 设置鼠标回调函数,当在 'image' 窗口中发生鼠标事件时,调用 `draw_test` 函数
    cv2.setMouseCallback("img",draw_test)
    drawing=False
    while (True):
        cv2.imshow('img', img)
        if cv2.waitKey(20) == 27:  # 按ESC退出
            break
    cv2.destroyAllWindows()
    pass
def video():
    # cv2.VideoCapture是OpenCV库中的一个类,用于从摄像头或视频文件中捕获视频帧。这个类提供了多种方法来控制视频捕获的过程,包括打开视频文件、读取视频帧、获取视频属性等。
    # read()方法用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。
    # release()方法用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。
    # isOpened()方法用于检查视频捕获对象是否已经成功打开。返回布尔值
    # get()和 set()方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。 这个传入的参数是cv2的属性 set还要传入int大小
    cap=cv2.VideoCapture(0) # 0代表摄像头 可以换成视频路径 实例化视频类
    cv2.namedWindow("video",cv2.WINDOW_NORMAL)
    # 是否成功打开视频对象
    cap.isOpened()
    # 获取帧宽
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    # 获取帧高
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    # 获取帧率
    fps = cap.get(cv2.CAP_PROP_FPS)
    # 设置帧宽
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    # 设置帧高
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    while (True): #
        # 读取视频,ret 是否读取到,frame: 图片(帧)
        ret, frame = cap.read() # 循环读取视频
        if ret:
            cv2.imshow("video", frame)
        if cv2.waitKey(20) == 27:
            break
    # 必须调用release 释放资源占用
    cap.release()
    cv2.destroyAllWindows()

if __name__=="__main__":
    # demo1()
    # demo2()
    # demo3()
    # demo4()
    # circle()
    # rectangle()
    putText()
    # line()
    # mouse()
    # video()
    pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值