【自我提升】openCV基本操作

写在前面:本篇博客主要是记录opnecv的基本操作,不记录安装等步骤。方便回顾和查找方法。

一、图像的IO操作,读取和保存方法

读取图像

        在OpenCV中,读取图像的函数是imread()。该函数可以从指定的文件中加载图像,返回值是一个包含图像数据的多维数组。imread()函数的原型如下:

cv2.imread(filename[, flags])

参数:

  • filename:一个字符串,指定要读取的图像文件的名称和路径。该文件的路径可以是相对路径也可以是绝对路径。

  • flags:该参数是可选的,用于指定加载图像的方式。可能的值包括:

    • cv2.IMREAD_COLOR:读取彩色图像。这是默认参数,此参数下,图像的透明度会被忽略,总是返回三通道的图像。(可以使用参数1代替)

    • cv2.IMREAD_GRAYSCALE:以灰度模式读取图像。(可以使用参数0代替)

    • cv2.IMREAD_UNCHANGED:读取图像中包含的所有通道,包括透明度通道。(可以使用参数-1代替)

例如,以下代码会以灰度模式加载图像:

img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

注意:如果加载的路径有误,不会报错,会返回一个None值。

 显示图像

imshow()函数的原型如下:

cv2.imshow(winname, mat)
  • winname:一个字符串,指定显示图像的窗口的名称。

  • mat:需要显示的图像,通常是使用imread()函数读取的图像。

注意:需要使用waitKey()函数来暂停程序,等待用户按键,如果不使用这个函数,图像窗口会立刻关闭,你可能看不到图像。

例如,以下代码会在一个名为"Image"的窗口中显示图像:

img = cv2.imread('image.jpg')
cv2.imshow('Image', img)
cv2.waitKey(0)//参数为0代表永远的显示下去

在显示图像之后,你可以使用destroyAllWindows()函数来关闭所有打开的窗口。

cv2.destroyAllWindows()

保存图像

imwrite()函数的原型如下:

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

参数说明:

  • filename:一个字符串,指定要保存的图像文件的名称和路径。该文件的路径可以是相对路径也可以是绝对路径。

  • img:需要保存的图像,通常是你处理过的图像数据。

  • params:该参数是可选的,表示一系列指定的写入参数。例如,对于JPEG图像,可以使用cv2.IMWRITE_JPEG_QUALITY来控制图像的质量。

例如,以下代码会保存一幅图像:

cv2.imwrite('output.jpg', img)

注意: imwrite()函数总是尝试将图像写入到文件中,如果指定的文件已经存在,它将会被新的图像文件覆盖。此外,虽然OpenCV支持多种图像格式,但是不是所有的图像格式都支持所有的颜色和像素深度。例如,JPEG不支持透明度通道,如果你试图保存一个包含透明度通道的图像为JPEG格式,透明度通道将会被忽略。因此,你应该选择合适的图像格式来保存你的图像。

pycharm运行测试:

import cv2 as cv

# 1 读取图像
img = cv.imread('readImage/image/springboot.png')
# 2 显示图像
# 2.1 利用opencv展示图像
cv.imshow('springboot', img)
cv.waitKey(0)
cv.destroyAllWindows()
# 3 保存图像
cv.imwrite('readImage/image/messigray.png', img)

 

转换图像的颜色空间

cvtColor()函数的原型如下:

cv2.cvtColor(src, code[, dst[, dstCn]])

参数说明:

  • src:输入图像。

  • code:颜色空间转换的类型。例如,cv2.COLOR_BGR2GRAY表示从BGR到灰度的转换,cv2.COLOR_BGR2HSV表示从BGR到HSV的转换。

  • dst:输出图像,通常不需要指定。

  • dstCn:输出图像的通道数,如果该参数有指定,那么这个通道数将应用到输出图像,否则,通道数将从src和code推断出来。

例如,下面的代码将一个BGR图像转换为灰度图像:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

注意: cvtColor()函数需要输入的图像是颜色图像,如果输入的是灰度图像,然后试图进行某些颜色空间的转换,例如从BGR到HSV的转换,将会产生错误。同时,不同的颜色空间转换类型需要的输入图像的通道数是不同的,例如,从BGR到灰度的转换需要3通道的输入图像,而从灰度到BGR的转换只需要1通道的输入图像。如果输入图像的通道数和颜色空间转换类型不匹配,将会产生错误。

图像的基本操作(获取像素值,修改像素值,获取图像的形状等)

在OpenCV和Python中,图像被表示为NumPy数组。这意味着我们可以使用标准的NumPy操作和函数来操作图像的像素和获取图像的属性。

1. 获取和修改像素值

        通过索引来访问和修改图像的像素值。例如,假设你有一幅BGR图像,你可以这样获取第y行第x列的像素的蓝色分量的值:

blue = img[y, x, 0]

修改这个像素的蓝色分量的值:

img[y, x, 0] = 255

2. 获取图像的形状

        可以使用NumPy的shape属性来获取图像的形状,这将返回一个元组,元素的顺序是(高度,宽度,通道数)。例如:

height, width, channels = img.shape

注意,对于灰度图像,shape属性将只返回高度和宽度。

3. 获取图像的数据类型

        可以使用NumPy的dtype属性来获取图像的数据类型。这对于调试非常有用,因为大部分在OpenCV中的错误是由无效的数据类型导致的。例如:

print(img.dtype)

注意: 因为像素值通常是无符号的8位整数(即范围在0到255之间),所以当你修改像素值时,需要确保新的像素值在这个范围内。如果像素值超出这个范围,将会被截断。例如,如果你尝试设置像素值为260,实际上会被设置为4。

二、视频的IO操作,读取和保存方法

读取视频文件或摄像头流

使用cv2.VideoCapture()函数来读取视频文件或摄像头流。例如:

cap = cv2.VideoCapture('video.mp4')  # 从文件读取
cap = cv2.VideoCapture(0)  # 从第一个摄像头读取

读取帧

ret, frame = cap.read()

        这个方法返回两个值:一个布尔值ret,如果帧已经正确读取,它将是True,否则是False;一个frame,这是读取的帧。

显示帧

cv2.imshow('Frame', frame)

保存帧

cv2.imwrite('frame.jpg', frame)

写入视频

使用cv2.VideoWriter()函数来创建一个VideoWriter对象,然后使用write()方法来写入帧。

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
out.write(frame)

注意,VideoWriter_fourcc()函数用于指定视频编码,VideoWriter()的参数分别是输出文件名、编码、帧率和帧大小。

释放资源

cap.release()
out.release()

案例:读取一个视频文件,将每一帧转换为灰度,然后写入到一个新的视频文件中.

import cv2

# 创建一个 VideoCapture 对象
cap = cv2.VideoCapture('video/ceshi1.mp4')

# 检查是否成功打开
if not cap.isOpened():
    print("Could not open video")
    exit()

# 获取一些视频的基本信息
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)

# 创建一个 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (frame_width, frame_height), isColor=False)

while True:
    # 读取一帧
    ret, frame = cap.read()

    # 如果帧没有正确读取,就退出循环
    if not ret:
        break

    # 转换帧到灰度
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 写入帧到输出文件
    out.write(gray)

    # 显示帧
    cv2.imshow('Frame', gray)

    # 等待用户按下 'q' 键
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放 VideoCapture 和 VideoWriter
cap.release()
out.release()

# 关闭所有窗口
cv2.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记录菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值