10.31学习日志

OpenCV

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 demo_01():
    # 创建窗口函数,第一个是窗口名称,第二个cv2.WINDOW_NORMAL 允许手动调整窗口大小
    cv2.namedWindow('cv1031',cv2.WINDOW_NORMAL)
    #设置窗口大小,窗口名称必须和namedWindow的窗口名一致
    cv2.resizeWindow("cv1031",500,300)

    #上面的写法可以省略,写出来可以控制窗口大小
    # 创建图片
    # 1.可以用绝对路径或者相对路径 2.路径不能有中文 3.出现转义字符可以用r表达式转义

    img = cv2.imread("images/car.png")
    if img is None:
        print('没有读取到图片')
        return
    # while True:
        # 用窗口显示图片
        # cv2.imshow('cv1031', img)
        # key = cv2.waitKey()
        # 27指的是ESC键的ASCII值
        # if key == 27:
        #     print('终止')
        #     break
    # 用窗口显示图片
    cv2.imshow('cv1031', img)
    # 等待键盘操作,0代表无限等待
    cv2.waitKey(0)
    # 释放资源或者关闭窗口
    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)
def test_01():
    # (width,height,channel)
    img = np.zeros((300,300,3),dtype=np.uint8)
    print(img)
    cv2.imshow("img1",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    img_dtype = img.dtype  # 数据类型
    print(img_dtype)

    (b, g, r) = img[55, 55]  # 对应的是BGR而不是RGB
    print((b, g, r))

    b = img[55, 55, 0]
    print(b)
    g = img[55, 55, 1]
    print(g)
    r = img[55, 55, 2]
    print(r)
    cv2.imshow("img1",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

保存图片

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

函数原型

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

参数说明

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

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

返回值

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

def save():
    # 读取图片
    img = cv2.imread("images/car.png")
    # 保存图片(返回值是个布尔值,成功True,失败False)
    iss = cv2.imwrite('images/save1.png',img)
    if iss :
        print('保存成功')
    else:
        print('保存失败')

其他注意事项

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

图像切片(裁剪)

在 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 的矩形区域。

def cut1():
    img = cv2.imread("images/car.png")
    h,w,c = img.shape
    print(h,w,c)
    x,y,w,h = 500,50,100,1500
    img_cut = img[y:y+h, x:x+w]
    cv2.imshow("img", img)
    cv2.imshow("img_cut", img_cut)
    cv2.waitKey(0)

    cv2.destroyAllWindows()

其他注意事项

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

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

调整图片大小

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

函数原型

cv2.resize(src, dsize, dst)

参数说明

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

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

返回值

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

def resize_img():
    img = cv2.imread("images/car.png")
    (h,w) = img.shape[:2]
    print(h,w)
    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()

图像绘制

绘制圆形

cv2.circle()函数用于在图像上绘制圆形。该函数的语法如下:

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/car2.png")
    center = (300,300)
    radius = 50
    color = (0,0,255)
    thickness = 5
    cv2.circle(img,center,radius,color,thickness)

    cv2.imshow("circle",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

绘制矩形

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

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

其中,参数解释如下:

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

  • pt1:矩形的一个顶点。

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

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

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

def draw_rectangle():
    img = cv2.imread("images/car2.png")
    left_top = (100, 100)  # 左上角顶点
    rightfoot= (300, 200)  # 右下角顶点
    color = (0, 255, 0)  # 颜色为绿色
    width = 2
    cv2.rectangle(img, left_top, rightfoot, color, width)

    cv2.imshow("rectangle",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

绘制文本

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): 添加文本后的图像。

def draw_txt():
    img = cv2.imread("images/car2.png")
    # 定义文本内容和位置
    text = "hello world!"
    # 文本的左下角位置
    position = (270, 290)
    # 设置字体类型
    font = cv2.FONT_HERSHEY_SIMPLEX
    # 字体大小
    font_scale = 1
    # 字体颜色
    font_color = (0, 255, 0)
    # 字体线条的粗细
    line_type = 2
    # 在图像上绘制文本
    cv2.putText(img, text, position, font, font_scale, font_color, line_type)

    cv2.imshow("txt",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

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

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

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

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

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
def draw_txt2():
    img = cv2.imread("images/car2.png")
    # 定义文本内容和位置
    text = "你好,世界!"
    # 文本的左下角位置
    position = (270, 290)
    font_path = "myfont/simhei.ttf"  # 替换为你的字体文件路径
    # 设置字体类型
    font_size = 30
    # BGR 格式
    color = (255, 0, 0)
    # 在图像上绘制文本
    image_with_text = put_text(img, text, position, font_path, font_size, color)

    cv2.imshow("txt",image_with_text)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

绘制直线

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: 返回的是经过修改后的图像,实际上就是传入的图像本身,因为 cv2.line() 是直接在原图上操作的。

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

def draw_line():
    img = cv2.imread("images/car2.png")
    # 定义直线的起点和终点
    start_point = (50, 50)  # 起点坐标 (x1, y1)
    end_point = (450, 450)  # 终点坐标 (x2, y2)

    # 定义颜色 (B, G, R) 和线条粗细
    color = (0, 255, 0)  # 蓝色
    thickness = 2  # 线条的宽度

    # 使用 cv2.line() 在图像上绘制直线
    cv2.line(img, start_point, end_point, color, thickness)

    cv2.imshow("line",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

控制鼠标

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

drawing = None

def mouse():
    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/car2.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()

代码解释

  1. draw_test函数:

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

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

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

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

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

视频处理

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

常用方法

  1. read()

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

ret, frame = cap.read()
if not ret:
    print("Failed to grab frame")
    break
  1. release()

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

cap.release()
  1. isOpened()

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

if not cap.isOpened():
    print("Error opening video stream or file")
  1. get()set()

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

def video():
    video_1 = cv2.VideoCapture(0)
    while True:
        ret,frame = video_1.read()
        cv2.namedWindow('name',cv2.WINDOW_NORMAL)
        cv2.resizeWindow("name", 1000, 1000)
        if ret:
            cv2.imshow('name',frame)
        if cv2.waitKey(20) == 27:
            break
    cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值