OpenCV基础01

目录

一、环境安装

二、显示窗口

三、创建图片

四、图片保存

五、图像裁剪

六、调整图片大小

七、图像绘制

1、绘制圆形

2、绘制矩形

3、绘制文本

4、绘制直线

5、中文文本

八、控制鼠标

九、鼠标事件

十、视频处理


OpenCV作为C和C++语言的源代码文件,实现了许多常用的计算机视觉算法。

  • OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库

  • OpenCV最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国Willow Garage为OpenCV提供主要的支持

  • OpenCV可用于开发实时的图像处理,计算机视觉以及模式识别程序,目前在工业界以及科研领域广泛采用

cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时。

opencv的重要性

  • 计算机视觉:OpenCV 是计算机视觉领域的标准库之一,广泛应用于图像识别、物体检测、人脸识别、手势识别等。

  • 机器人技术:在机器人导航、环境感知和交互中,OpenCV 用于处理传感器数据和视觉信息。

  • 医学影像:在医学影像分析中,OpenCV 用于图像增强、分割和特征提取。

  • 自动驾驶:在自动驾驶汽车中,OpenCV 用于环境感知、障碍物检测和车道线识别。

  • 安全监控:在安全监控系统中,OpenCV 用于运动检测、人脸识别和行为分析。

    学习 OpenCV 不仅可以提升技术能力,还能在计算机视觉和图像处理领域的发展打开更多的门路。无论是学术研究、工业应用还是个人项目,OpenCV 都是一个不可或缺的工具

一、环境安装

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

 

二、显示窗口

cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时。

cv2.namedWindow(winname, flags=None)

 参数

  • winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。

  • flags (int, 可选): 窗口的标志,用于设置窗口的行为。默认值为 cv2.WINDOW_AUTOSIZE

        常见的标志包括:

              cv2.WINDOW_NORMAL: 允许调整窗口大小。

              cv2.WINDOW_AUTOSIZE: 窗口大小根据图像大小自动调整,不能手动调整。

完整写法:

# 完整写法
def demo01():
    # 创建窗口函数,image 窗口名称 cv2.WINDOW.NORMAL 允许手动调整窗口大小
    cv2.namedWindow("image", cv2.WINDOW_NORMAL)

    # 设置窗口大小,image 窗口名称,必须和namedWindow的窗口名称一致
    cv2.resizeWindow("image", 500, 300)

    # 读取图片,imread 图片路径
    """
    图片路径
      1、支持绝对和相对路径
      2、路径中不能使用中文
      3、图片路径如果有转义字符,用r""表达式进行转义
        image = cv2.imread(r'images/tar.png')
    """
    image = cv2.imread('images/car.png')

    # 用窗口显示图片
    cv2.imshow("image", image)

    # 等待键盘操作,0:无限等待,waitKey 返回一个ASCII值
    while True:
        key = cv2.waitKey(0)
        if key == 113:
            print('退出')
            break

    # 释放资源(关闭窗口)
    cv2.destroyAllWindows()

 简写:

# 简写
def demo02():
    # 读取图片,imread 图片路径
    """
    图片路径
      1、支持绝对和相对路径
      2、路径中不能使用中文
      3、图片路径如果有转义字符,用r""表达式进行转义
        image = cv2.imread(r'images/tar.png')
    """
    image = cv2.imread('images/car.png')
    print(image)
    if image is None:
        print("图片不存在")
        return

    # 用窗口显示图片
    cv2.imshow("image", image)

    # 等待键盘操作,0:无限等待,waitKey 返回一个ASCII值
    while True:
        key = cv2.waitKey(0)
        if key == 113:
            print('退出')
            break

    # 释放资源(关闭窗口)
    cv2.destroyAllWindows()

 

三、创建图片

可以使用 np.zeros 函数创建一个全零数组,这个数组可以表示一个空白图像。数组的形状应该符合图像的尺寸和通道数(例如,对于 RGB 图像,形状应为 (height, width, 3))。

# 创建一个 500x500 像素的空白图像,3 个通道(RGB)
height, width, channels = 500, 500, 3
blank_image = np.zeros((height, width, channels), dtype=np.uint8)

 创建黑白图片

import cv2
import numpy as np


def create_picture():
    # 创建一个图片矩阵
    # 300 高度, 500 宽度, 3 通道(RGB), 1 灰度图像
    image = np.zeros((300, 500, 3), dtype=np.uint8)
    cv2.imshow('image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


create_picture()

 


 

四、图片保存

cv2.imwrite 是 OpenCV 库中的一个函数,用于将图像保存到文件中。这个函数在图像处理和计算机视觉任务中非常常用,特别是在需要将处理后的图像结果保存到磁盘时。

cv2.imwrite(filename, img[, params])

参数 

  • filename (str): 要保存的文件路径和名称。支持的文件格式包括 .jpg, .png, .bmp, .tiff 等。

  • img (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值。

返回值

  • bool: 成功保存图像返回 True,否则返回 False

import cv2
import numpy as np

# 读取图片
# img = cv2.imread("images/car.png")
img = np.zeros((300, 500, 3), dtype=np.uint8)

# 保存图片:imwrite(保存图片路径,图像矩阵),返回布尔值
# iss = cv2.imwrite("save_image/car01.png",img)
iss = cv2.imwrite("save_image/black.png", img)

if iss:
    print("保存成功")
else:
    print("保存失败")

 


 

五、图像裁剪

在 OpenCV 中,图像切片用于从图像中提取一个子区域(矩形区域)。这种操作在图像处理中非常常见,特别是在进行目标检测、ROI(Region of Interest,感兴趣区域)提取等任务时。

语法

假设你有一个图像 img,它的类型是 numpy.ndarrayimg[y:y+h, x:x+w] 的含义如下:

  • x: 子区域左上角的 x 坐标。

  • y: 子区域左上角的 y 坐标。

  • w: 子区域的宽度。

  • h: 子区域的高度。

切片操作

  • img[y:y+h, x:x+w] 提取的是从 (x, y) 开始,宽度为 w,高度为 h 的矩形区域。

import cv2

img = cv2.imread("images/car.png")

# # 获取原图片像素
# h, w, c = img.shape
# print(f'高{h},宽{w},通道{c}')

# 定义坐标
x = 100
y = 150
w = 300
h = 100
"""
img[y:y+h, x:x+w] 的含义如下:
  x: 子区域左上角的 x 坐标。
  y: 子区域左上角的 y 坐标。
  w: 子区域的宽度。
  h: 子区域的高度
"""
car_img = img[y:y+h, x:x+w]
cv2.imshow("old", img)
cv2.imshow("image", car_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 


 

六、调整图片大小

cv2.resize 是 OpenCV 库中的一个函数,用于调整图像的大小。这个函数在图像处理中非常常用,特别是在需要对图像进行缩放、放大或缩小以适应不同需求时。

cv2.resize(src, dsize, dst)

 参数

  • src (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。

  • dsize (tuple): 输出图像的尺寸,是一个二元组 (width, height)。如果指定了 fxfy,则可以忽略此参数。

返回值

  • dst (numpy.ndarray): 缩放后的图像。

作用

  • 方便OCR文字识别,像素超过OCR文字的阈值时无法识别,需要调整图片大小。
  • 模型训练中,像素大小也会影响模型训练的复杂度。
import cv2

"""
调整图片大小作用
  1、方便OCR文字识别,像素超过OCR文字的阈值时无法识别,需要调整图片大小
  2、模型训练中,像素大小也会影响模型训练的复杂度
"""

# 读取图片
img = cv2.imread("images/car.png")
# print(img.shape)  # (276, 754, 3)

# 获取图片大小
(h, w) = img.shape[:2]

# 调整大小
r_img = cv2.resize(img, (200, 100))
(h, w) = r_img.shape[:2]
print(h, w)

cv2.imshow('old', img)
cv2.imshow('new', r_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

 


 

七、图像绘制

1、绘制圆形

cv2.circle()函数用于在图像上绘制圆形。

cv2.circle(img, center, radius, color, thickness)

参数 

  • img:要绘制圆形的图像。

  • center:圆心的坐标。

  • radius:圆的半径。

  • color:圆的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。

  • thickness:圆的边界线条的厚度,如果为负值或cv2.FILLED,表示填充整个圆。

 

"""
绘制圆形
  cv2.circle(img, center, radius, color, thickness)
    - `img`:要绘制圆形的图像。
    - `center`:圆心的坐标。
    - `radius`:圆的半径。
    - `color`:圆的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。
    - `thickness`:圆的边界线条的厚度,如果为负值或`cv2.FILLED`,表示填充整个圆。
"""
def draw_circle():
    img = cv2.imread('images/car.png')
    # 圆心坐标
    center = (50, 50)
    # 半径
    radis = 50
    # 颜色 (BGR RGB都可以) RGB红色(0,0,255)
    color = (0, 0, 255)
    # 线条宽度
    w = 3
    # 画圆
    c_img = cv2.circle(img, center, radis, color, w)

    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2、绘制矩形

cv2.rectangle()函数用于在图像上绘制矩形。

cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

参数

  • img:要绘制矩形的图像。

  • pt1:矩形的一个顶点。

  • pt2:矩形对角线上的另一个顶点。

  • color:矩形的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。

  • thickness:矩形边框的厚度,如果为负值或cv2.FILLED,表示填充整个矩形内部。

"""
绘制矩形
  cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    - `img`:要绘制矩形的图像。
    - `pt1`:矩形的一个顶点。
    - `pt2`:矩形对角线上的另一个顶点。
    - `color`:矩形的颜色,通常是一个表示BGR颜色的元组,例如`(255, 0, 0)`表示蓝色。
    - `thickness`:矩形边框的厚度,如果为负值或`cv2.FILLED`,表示填充整个矩形内部。
"""
def draw_rectangle():
    img01 = np.zeros((200, 500, 3), dtype=np.uint8)
    # 定义绘制矩形的左上角坐标
    left_top = (100, 100)
    # 定义绘制矩形的右下角坐标
    right_bottom = (200, 200)
    # 定义颜色
    color = (0, 0, 255)
    # 定义线条宽度
    w = 5
    # 绘制矩形
    cv2.rectangle(img01, left_top, right_bottom, color, w)
    cv2.imshow('Rectangle', img01)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

3、绘制文本

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: 抗锯齿线(默认值)

4、绘制直线

cv2.line(img, pt1, pt2, color, thickness lineType)

参数

  • img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。

  • pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。

  • pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。

  • color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如 (255, 0, 0) 表示纯蓝色)。对于灰度图像,只需要一个整数值即可。

  • thickness: 可选参数,定义直线的宽度。默认值是 1。

"""
绘制直线
"""
def draw_line():
    img = cv2.imread('images/car.png')
    # 直线起始坐标
    start = (100, 150)
    # 截止坐标
    end = (200, 150)
    # 颜色
    color = (0, 0, 255)
    # 宽度
    w = 10
    l_img = cv2.line(img, start, end, color, w)
    cv2.imshow('line', l_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

5、中文文本

在使用 OpenCV 的 cv2.putText 函数添加中文时,可能会遇到显示乱码的问题。这是因为 OpenCV 默认使用的字体不支持中文字符。为了在图像上正确显示中文,可以使用 PIL(Pillow)库来处理文本,然后将文本渲染到图像上。

  1. 安装opencv-python和pillow库:
    pip install opencv-python pillow
  2. 下载中文字体文件,常见的中文字体文件有 simhei.ttfsimsun.ttc 等。
  3. 定义put_text函数
    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
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


img = cv2.imread('images/car.png')
# 定义文本内容
text = '你好,世界!'
# 起始坐标 org (x,y)
position = (350, 180)
# 字体格式 fontFace
font_path = 'font/simhei.ttf'
# 字体大小 fontScale
font_size = 30
# 字体颜色 BGR红色 (255,0,0)
color = (255, 0, 0)
# 绘制字体
c_img = put_text(img, text, position, font_path, font_size, color)
cv2.imshow('chinese_text', c_img)

cv2.waitKey(0)
cv2.destroyAllWindows()


 

八、控制鼠标

cv2.setMouseCallback 是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。

import cv2

"""
鼠标回调函数
  event: 鼠标事件
  x,y: 鼠标在图像区域所在的坐标
  flag: 标识
  param: 参数
"""


def mouse_callback(event, x, y, flag, param):
    print(event)
    print(f'坐标{(x,y)}')
    print(f'flag={flag}')
    print(f'param={param}')


img = cv2.imread('images/car.png')

# 创建对应窗口
cv2.namedWindow('name')
# 设置执行鼠标操作的回调函数
cv2.setMouseCallback('name', mouse_callback)
cv2.imshow('name', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

九、鼠标事件

案例:在图片上通过操控鼠标来进行绘制图像

import cv2

"""
鼠标回调函数
  event: 鼠标事件
  x,y: 鼠标在图像区域所在的坐标
  flag: 标识
  param: 参数
"""


def mouse_control(event, x, y, flag, param):
    global d
    # 鼠标左键按下的事件
    if event == cv2.EVENT_LBUTTONDOWN:
        print("鼠标左键按下")
        cv2.circle(img, (x, y), 50, (0, 255, 0), 2)
        d = True
    elif event == cv2.EVENT_LBUTTONUP:
        print("鼠标左键释放")
        # cv2.circle(img, (x, y), 40, (255, 255, 255), 2)
        d = False
    elif event == cv2.EVENT_MOUSEMOVE:
        print("鼠标移动")
        # d为True时才会触发
        if d:
            cv2.circle(img, (x, y), 25, (255, 0, 0), 2)


img = cv2.imread('images/car.png')
# 定义窗口
cv2.namedWindow('mouse_control')
d = False
# 设置执行鼠标操作的回调函数
cv2.setMouseCallback('mouse_control', mouse_control)
while True:
    cv2.imshow('mouse_control', img)
    # 按下ESC键 关闭程序
    if cv2.waitKey(20) == 27:
        break
# 关闭窗口
cv2.destroyAllWindows()

 

十、视频处理

cv2.VideoCapture 是 OpenCV 库中的一个类,用于从摄像头或视频文件中捕获视频帧。这个类提供了多种方法来控制视频捕获的过程,包括打开视频文件、读取视频帧、获取视频属性等。

常用方法

  • read()

read() 方法用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。

  • release()

release() 方法用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。

  • isOpened()

isOpened() 方法用于检查视频捕获对象是否已经成功打开。

  • get() 和 set()

get()set() 方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。

import cv2

# 0:开启摄像头; 参数如果是视频路径则是开启视频
cap = cv2.VideoCapture('video/1.mp4')
# 创建窗口函数,image 窗口名称
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
# 设置窗口大小,image 窗口名称,必须和namedWindow的窗口名称一致
cv2.resizeWindow("video", 500, 300)

while True:
    # 读取视频 ret:是否读取到;frame:图片(帧)
    ret, frame = cap.read()
    if ret:
        cv2.imshow('video', frame)
    if cv2.waitKey(20) == 27:
        break
cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值