OpenCV基础知识

OpenCV

介绍

1.OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。

  • OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库
  • OpenCV最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国Willow Garage为OpenCV提供主要的支持
  • OpenCV可用于开发实时的图像处理,计算机视觉以及模式识别程序,目前在工业界以及科研领域广泛采用

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

3.opencv重要性

  • 计算机视觉:OpenCV 是计算机视觉领域的标准库之一,广泛应用于图像识别、物体检测、人脸识别、手势识别等。
  • 机器人技术:在机器人导航、环境感知和交互中,OpenCV 用于处理传感器数据和视觉信息。
  • 医学影像:在医学影像分析中,OpenCV 用于图像增强、分割和特征提取。
  • 自动驾驶:在自动驾驶汽车中,OpenCV 用于环境感知、障碍物检测和车道线识别。
  • 安全监控:在安全监控系统中,OpenCV 用于运动检测、人脸识别和行为分析。
  • 学习 OpenCV 不仅可以提升你的技术能力,还能为你在计算机视觉和图像处理领域的发展打开更多的门路。无论是学术研究、工业应用还是个人项目,OpenCV 都是一个不可或缺的工具

环境安装(在你使用的python虚拟环境下安装)

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

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

显示窗口

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

(1)函数原型

cv2.namedWindow(winname, flags=None)

(2)参数说明

  • winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。
  • flags (int, 可选): 窗口的标志,用于设置窗口的行为。默认值为

cv2.WINDOW_AUTOSIZE

(3)常见的标志包括:

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

4.示例

以下是一个简单的示例,展示如何使用 cv2.namedWindow 创建一个窗口并在其中显示图像:

python 复制代码
import cv2
def demo01():
    #创建窗口函数,image窗口名称,cv2.WINDOW_NORMAL允许手动调整窗口大小
    cv2.namedWindow('image', cv2.WINDOW_NORMAL)

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

    #读取一个图片,imread图片路径,cv2路径不能含中文路径,并且路径之间不能形成转义字符1形式,比如\t
    #图片路径:
        # 支持绝对路径和相对路径
        #图片路径不能是中文
        # 如图片路径如果有转义字符,要用r""表达式来进行转义字符
    # image = cv2.imread('images/car.png')
    image = cv2.imread('D:\huaqing\car.png')
    print(image)
    if image is None:# python判断为空不能为==,要用is判断
        print("没有读到图片")
        return #return不写可能无法停止程序,不写在函数中也无法添加return


    #用窗口来显示图片,第一个参数,窗口名称,第二个参数,图片对象
    cv2.imshow('image', image)

    #等待键盘操作,0代表无限等待,waitKey会返回一个ASCII值,
    while (True):
        key = cv2.waitKey()
        # 27指的是ESC键的ASCII值
        if key == 27:
            print("终止")
            break # 不在循环中无法添加break

    # cv2.waitKey(0)

    #释放资源或者是关闭窗口
    cv2.destroyWindow()

demo01()

#简写不能调试窗口代码
def demo02():
    image = cv2.imread(r'images/car2.png')
    print(image)
    if image is None:
        print("图片不存在")
        return
    #用窗口显示图片
    cv2.imshow('image',image)

    # 等待键盘操作,0代表无限等待,waitKey会返回一个ASCII值,
    while (True):
        key = cv2.waitKey()
        # 27指的是ESC键的ASCII值,点击ESC键,关闭图片
        #通过更换ASCII值可以指定不同的键盘键
        if key == 27:
            print("终止")
            break

    # cv2.waitKey(0)

    # 释放资源或者是关闭窗口
    cv2.destroyWindow()

demo02() # 函数没有在类中,所有可以不用主函数main去调用

5.详细解释

(1)读取图像:

image = cv2.imread('path/to/your/image.jpg')

(2)使用 cv2.imread 函数读取图像文件。

  • 创建窗口

    复制代码
    cv2.namedWindow('Image Window', cv2.WINDOW_NORMAL)

    使用 cv2.namedWindow 创建一个名为 "Image Window" 的窗口,并设置标志为 cv2.WINDOW_NORMAL,允许用户调整窗口大小。

  • 显示图像

    复制代码
    cv2.imshow('Image Window', image)

    使用 cv2.imshow 在指定的窗口中显示图像。

  • 等待用户按键

    cv2.waitKey(0)

    使用 cv2.waitKey 暂停程序执行,等待用户按键。参数 0 表示无限期等待,直到有按键事件发生。

    返回值:是一个ASCII值,

    q 键 ASCII 值为 113 ESC 键是27

(3)关闭所有窗口

cv2.destroyAllWindows()

使用 cv2.destroyAllWindows 关闭所有打开的窗口。

6.其他注意事项

  • 窗口名称:窗口名称必须是唯一的,否则会覆盖已有的同名窗口。
  • 窗口标志:选择合适的窗口标志可以提升用户体验,特别是在需要用户交互的场景中。

创建空白图像

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

2.函数写法

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

3.案例

python 复制代码
import cv2
import numpy as np

def test01():
    #创建一个图片矩阵
    #300是图片的高度, 500是图片的宽度, 3是通道(RGB), 1是灰度图像
    image = np.zeros((300, 500, 3), dtype=np.uint8)
    print(image)

    #显示图片
    cv2.imshow('image', image)

    #无限等待
    cv2.waitKey(0)

    #关闭窗口
    cv2.destroyAllWindows()

test01()

保存图片

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

2.函数原型

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

3.参数说明

  • filename (str): 要保存的文件路径和名称。支持的文件格式包括 .jpg, .png, .bmp, .tiff 等。
  • img (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值。

4.返回值

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

5.示例

以下是一个简单的示例,展示如何使用 cv2.imwrite 将图像保存到文件中:

python 复制代码
import cv2
import numpy as np
#读取图片
img = cv2.imread('images/car2.png')
image = np.zeros((300, 500, 3), dtype=np.uint8)

#保存图片, imwrite(保存图片路径,图像矩阵),返回值是布尔值
#第一参数:文件路径+图片的名称(自己命名)(save_image/car02.png),读取的图片对象
iss = cv2.imwrite('save_image/car01.png', img)
iss = cv2.imwrite('save_image/car02.png', image)

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

6.其他注意事项

  • 文件路径:确保提供的文件路径是有效的,如果路径不存在,OpenCV 会尝试创建它,但如果权限不足则会保存失败。

图像切片(裁剪)

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

2.语法解释

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

  • x: 子区域左上角的 x 坐标。
  • y: 子区域左上角的 y 坐标。
  • w: 子区域的宽度。
  • h: 子区域的高度。

3.切片操作

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

4.示例

假设你有一个图像 img,并且你想要从这个图像中提取一个特定的矩形区域,例如左上角坐标为 (50, 60),宽度为 100,高度为 150 的区域。

python 复制代码
import cv2
img = cv2.imread('images/car.png')
# 获取图片像素
h,w,c = img.shape
#高度:276, 宽度:754, 通道:3
print(f"高度:{h}, 宽度:{w}, 通道:{c}")

x = 300 # x坐标小于图片宽度
y = 150 # y坐标小于图片高度
w = 300 #裁剪后图片的像素
h = 90 ##裁剪后图片的像素

cai_img = img[y:y+h, x:w+x]
c_h,c_w,c_c = cai_img.shape
# 高度:90, 宽度:300, 通道:3
print(f"高度:{c_h}, 宽度:{c_w}, 通道:{c_c}")

cv2.imshow("old", img)
cv2.imshow("image", cai_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

其他注意事项

  • 边界检查 :确保 (x, y)(x+w, y+h) 都在图像的边界内,否则会导致数组索引越界错误。

  • 数据类型img 通常是 numpy.ndarray 类型,切片操作返回的也是 numpy.ndarray 类型。

调整图片大小

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

2.函数原型

cv2.resize(src, dsize, dst)

3.参数说明

  • src (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。
  • dsize (tuple): 输出图像的尺寸,是一个二元组 (width, height)。如果指定了 fxfy,则可以忽略此参数。

4.返回值

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

5.示例

以下是一个简单的示例,展示如何使用 cv2.resize 调整图像的大小:

python 复制代码
import cv2
img = cv2.imread('images/car.png')
print(img.shape)
#获取图片像素大小
(h,w) = img.shape[:2] #将h和w获取并赋给h和w
print(h,w)

# 调整图片大小
# dsize参数先宽后高
# 调整图片大小的作用:
    # 1.方便OCR文字识别,像素超过OCR文字的阈值,识别不出来,需要图片de大小调整
    # 2.逻辑训练的时候,像素的大小也会影响模型训练的复杂度
r_img = cv2.resize(img, (200,100))
(h,w) = r_img.shape[:2] #将h和w获取并赋给h和w
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,表示填充整个圆。

2.案例

python 复制代码
#绘制圆形
import cv2

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

# 圆心坐标
center = (50,50)

# 半径
radis = 50

# BGR颜色,RGB颜色
color = (0,0,255)

# 线条的宽度
w = 5

#画圆
c_img = cv2.circle(img, center, radis, color, w)
cv2.imshow('img', c_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制矩形

1.cv2.rectangle()`函数用于在图像上绘制矩形。该函数的语法如下:

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

其中,参数解释如下:

  • img:要绘制矩形的图像。
  • pt1:矩形的一个顶点。
  • pt2:矩形对角线上的另一个顶点。
  • color:矩形的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。
  • thickness:矩形边框的厚度,如果为负值或cv2.FILLED,表示填充整个矩形内部。
python 复制代码
import cv2
import numpy as np

#绘制矩形
img = np.zeros((200, 500, 3), dtype=np.uint8)

#定义绘制矩形的左上角坐标
left_top = (100, 100)

#定义绘制矩形的右下角坐标
right_bottom = (300, 200)

#定义矩形的颜色
color = (0,0,255)

#定义线条宽度
w = 5

#画矩形
r_img=cv2.rectangle(img, left_top, right_bottom, color, w)
cv2.imshow('img', r_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制文本

1.cv2.putText 是 OpenCV 库中的一个函数,用于在图像上添加文本。这个函数在图像处理和计算机视觉任务中非常有用,特别是在需要标注图像、显示信息或调试时。

2.函数原型

cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

3.参数说明

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

(2)text (str): 要添加的文本字符串。
(3)org (tuple): 文本的起始位置,是一个二元组 (x, y),表示文本左下角的坐标。

(4)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: 斜体修饰符,可以与其他字体类型组合使用

(5)fontScale (float): 字体大小的比例因子。

(6)color (tuple): 文本颜色,是一个三元组 (B, G, R),表示蓝色、绿色和红色的值。

(7)thickness (int, 可选): 文本线条的厚度,默认值为 1。

(6)lineType

(int, 可选): 线条类型,常见的线条类型包括:

  • cv2.LINE_4: 4 连通线
  • cv2.LINE_8: 8 连通线
  • cv2.LINE_AA: 抗锯齿线(默认值)

4.返回值

  • img (numpy.ndarray): 添加文本后的图像。

5.示例

以下是一个简单的示例,展示如何使用 cv2.putText 在图像上添加文本:

python 复制代码
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np


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 = 'hello world'

#起始坐标
c = (100, 200)

#字体的格式
f = cv2.FONT_HERSHEY_PLAIN

#字体大小
size = 5

#字体的粗细
w = 12

#字体颜色
color = (0,0,255)

#写子
# c_img = cv2.putText(img, text=text, org=c, fontScale=size, fontFace=f, color=color, thickness=w)
#换为中文
font_path = 'font/simhei.ttf'
c_img= put_text(img, "你好世界", c, font_path, 24, color)
cv2.imshow('img', c_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制直线

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

1.参数说明

  • img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。
  • pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。
  • pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。
  • color : 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如 (255, 0, 0) 表示纯蓝色)。对于灰度图像,只需要一个整数值即可。
  • thickness: 可选参数,定义直线的宽度。默认值是 1。

2.返回值

  • img : 返回的是经过修改后的图像,实际上就是传入的图像本身,因为 cv2.line() 是直接在原图上操作的。

3.cv2.line() 是 OpenCV 库中的一个函数,用于在图像上绘制直线。这个函数非常直观,它接受多个参数来定义直线的位置、颜色、厚度等属性。以下是 cv2.line() 函数的基本语法及其参数说明

python 复制代码
import cv2

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('img', l_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

控制鼠标

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

2.案例

python 复制代码
import cv2

#鼠标回调函数
#第一个参数:event鼠标事件,第二个参数x,y:鼠标在图像区域所在的坐标
# flag:标识
# param参数
def mytest(event, x, y, flag, param):
    print(event)
    print(f"坐标{x, y}")
    print(f"flag标识:{flag},param参数:{param}")


#定义一个窗口
cv2.namedWindow('name')

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

# 设置执行鼠标操作的回调函数,需要找到窗口名称
cv2.setMouseCallback('name', mytest)
cv2.imshow('name', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.代码解释

  1. mytest函数:

    • event: 鼠标事件类型,如 cv2.EVENT_LBUTTONDOWN 表示左键按下。

    • x, y: 鼠标事件发生时的坐标。

    • flags: 额外的标志位,通常不用。

    • param: 传递给回调函数的参数,通常不用。

4.cv2.setMouseCallback('image', draw_test) 设置鼠标回调函数,当在 'image' 窗口中发生鼠标事件时,调用 draw_circle 函数

5.案例:在图像上绘制圆形

python 复制代码
import cv2
import numpy as np

#创建鼠标回调函数
def draw_test(event,x,y,flag,param):
    global drawing
    # cv2.EVENT_LBUTTONDOWN  鼠键左键按下事件
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
    # cv2.EVENT_MOUSEMOVE  鼠键左键移动事件
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing:
            cv2.circle(img,(x,y),15,(255,0,0),-1)

    #cv2.EVENT_LBUTTONUP  鼠键左键释放事件
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.circle(img, (x, y), 15, (255, 0, 0), -1)

img= cv2.imread('../images/car.png')
cv2.namedWindow('image')
#设置鼠标回调函数
cv2.setMouseCallback('image', draw_test)
# 真正的标志,表示是否正在绘制
drawing = False
#永真循环,图像被绘制后显示图片,直到按下ESC键退出
while(True):
    cv2.imshow('image', img)
    if cv2.waitKey(20) == 27:  # 按ESC退出
        break
cv2.destroyAllWindows()

6.左键画线

python 复制代码
import cv2

#鼠标回调函数
#第一个参数:event鼠标事件,第二个参数x,y:鼠标在图像区域所在的坐标
# flag:标识
# param参数
def mytest(event, x, y, flag, param):
    global d
    # 鼠标左键按下事件
    if event == cv2.EVENT_LBUTTONDOWN:
        # cv2.circle(img, (x,y), 6, (0,0,255), -1)
        d = True
        print("鼠标按下")
    elif event == cv2.EVENT_LBUTTONUP:
        # cv2.circle(img, (x, y), 6, (0, 0, 255), -1)
        d = False
        print("鼠标左键释放")
    elif event == cv2.EVENT_MOUSEMOVE:
        if d == True:
            cv2.circle(img, (x, y), 6, (0, 0, 255), -1)
        print("鼠标移动了")


#定义一个窗口
cv2.namedWindow('name')
d = False


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

# 设置执行鼠标操作的回调函数,需要找到窗口名称
cv2.setMouseCallback('name', mytest)
while (True):
    cv2.imshow('name', img)
    # 按下esc键关闭程序
    if cv2.waitKey(20) == 27:
        break

# 关闭窗口
cv2.destroyAllWindows()

视频处理

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

2.常用方法

(1)read()

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

python 复制代码
ret, frame = cap.read()
if not ret:
    print("Failed to grab frame")
    break

(3)release()

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

python 复制代码
cap.release()

(3)isOpened()

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

python 复制代码
if not cap.isOpened():
    print("Error opening video stream or file")

(4)get()set()

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

python 复制代码
# 获取帧宽
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)

3.案例

python 复制代码
import cv2

# 打开视频文件或摄像头
# 使用 0 打开默认摄像头,或者替换为视频文件路径,例如 'video.mp4'
video_capture = cv2.VideoCapture('video/1.mp4')  # 0 表示使用摄像头
if not video_capture.isOpened():
      print("视频没有打开")
      exit()
# 获取视频的帧率
fps = video_capture.get(cv2.CAP_PROP_FPS)
delay = int(1000 / fps)  # 计算帧间延迟
while True:
    # 逐帧读取视频
    ret, frame = video_capture.read()
    # 显示当前帧
    cv2.imshow('Video', frame)
    # 按下 'q' 键退出
    if cv2.waitKey(delay) & 0xFF == ord('q'):
        break
# 释放视频捕获对象和关闭所有窗口
video_capture.release()
cv2.destroyAllWindows()
python 复制代码
import cv2

cv2.namedWindow('name', cv2.WINDOW_NORMAL)
cv2.resizeWindow('name', 500, 300)
# 参数
    # 0:开启开启摄像头,视频路径:开启视频
cap = cv2.VideoCapture('video/1.mp4')
while (True):
    # 读取视频 ret:是否读取到, frame:图片(一帧一帧)
    ret, frame = cap.read()
    if ret:
        cv2.imshow('name', frame)

    if cv2.waitKey(20) == 27:
        break

cv2.destroyAllWindows()

关于opencv 显示中文乱码问题解决

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

确保你已经安装了 opencv-pythonPillow 库。如果没有安装,可以通过 pip 安装:

注意:如果用的Anaconda ,是包含了这个库,可以不安装

pip install opencv-python pillow

镜像源安装

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

2 下载一个中文字体文件,常见的中文字体文件有 simhei.ttfsimsun.ttc 等。你可以从系统中找到这些字体文件,或者从互联网下载。

3 定义 put_text 函数

python 复制代码
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

4 .案例

python 复制代码
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
​
​
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
​
​
# 读取图像
image = cv2.imread('images/car.png')
​
# 定义文本内容、位置、字体路径、字体大小和颜色
text = "你好,世界!"
position = (50, 50)
font_path = "myfont/simhei.ttf"    # 替换为你的字体文件路径
font_size = 30
color = (0, 0, 255)  # BGR 格式
​
# 在图像上添加中文文本
image_with_text = put_text(image, text, position, font_path, font_size, color)
​
# 显示图像
cv2.imshow('Image with Text', image_with_text)
cv2.waitKey(0)
cv2.destroyAllWindows()
相关推荐
西猫雷婶2 分钟前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
OpenCSG10 分钟前
CSGHub开源版本v1.2.0更新
人工智能
weixin_5152024911 分钟前
第R3周:RNN-心脏病预测
人工智能·rnn·深度学习
Altair澳汰尔14 分钟前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
AI视觉网奇35 分钟前
人脸生成3d模型 Era3D
人工智能·计算机视觉
call me by ur name38 分钟前
VLM--CLIP作分类任务的损失函数
人工智能·机器学习·分类
云空1 小时前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
编码小哥1 小时前
opencv中的色彩空间
opencv·计算机视觉
吃个糖糖1 小时前
34 Opencv 自定义角点检测
人工智能·opencv·计算机视觉
禁默1 小时前
2024年图像处理、多媒体技术与机器学习
图像处理·人工智能·microsoft