基于OpenCV实战(基础知识一)

目录

简介

1.计算机眼中的图像

2.图片的读取、显示与保存

3.视频的读取与显示


简介

OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C++语言编写,同时也支持Python、Java、C等语言。由于其开源和广泛使用的特点,在计算机视觉和机器学习领域得到了广泛的应用。

1.计算机眼中的图像

RGB图像是一种由红色(R)、绿色(G)和蓝色(B)三个颜色通道组成的彩色图像。每个像素点都有三个数值,分别代表其在红色、绿色和蓝色通道中的亮度。每个数的取值为(0-255),三个不同的值组合就形成一个像素点。

这三个通道共同组成了RGB图像,它们的组合形成了每个像素点的颜色。通过调整每个通道的亮度和色彩分布,可以改变图像的颜色和外观。

import cv2
import numpy as np

# 读取图片
image = cv2.imread('image/1.jpg')
#   打印图片的形状,即高宽和通道数
h, w, c = image.shape
print(h, w, c)

#  打印(60,60)的像素点的rgb值
pixel = image[60, 60]
print(pixel)

#  创建一个空数组和图像格式大小相同
pixels = np.zeros((h, w, c), dtype=np.uint8)
# 遍历每个像素点
for y in range(h):
    for x in range(w):
        # 获取像素点的数值
        pixel = image[y, x]
        # 将像素点的数值存储到新数组中
        pixels[y, x] = pixel

# 输出结果
print(pixels)

打印结果如下所示,这就是一张的图片在计算机眼中的结构,实操过程中可以采用断点方式依次打印。

当然以上是为了更好的看清图片的本质,我们可以直接用数组完成上述的操作

import cv2
import numpy as np

# 读取图片
image = cv2.imread('image.jpg')

# 将图像转换为NumPy数组
pixels = np.array(image)

# 输出结果
print(pixels)

结果也是一样的

2.图片的读取、显示与保存

import cv2

# 读取图片并转为灰度图
# image = cv2.imread('image/1.jpg')
image = cv2.imread('image/1.jpg', cv2.IMREAD_GRAYSCALE)
# 显示图片窗口,并命名为 'IMG'
cv2.imshow('IMG', image)

# 保存到image路径下并命名为jujingyi
cv2.imwrite('image/jujingyi.jpg', image)
# 等待键盘输入,参数为0表示一直等待,直到按下任意键
cv2.waitKey(0)

# 关闭所有打开的窗口
cv2.destroyAllWindows()

cv2.imread()函数用来读取图片

cv2.imwrite()函数用来保存图片

cv2.waitKey(0) 0表示按任意键停止,1000表示1000毫秒后关闭窗口

3.视频的读取与显示

import cv2

cap = cv2.VideoCapture(0)

while True:
    success, image = cap.read()
    cv2.imshow('IMG', image)
    
    # 等待1毫秒,检测键盘输入
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 循环结束后释放摄像头资源和关闭窗口
cap.release()
cv2.destroyAllWindows()

cv2.VideoCapture(0) 设为0 表示使用电脑自带的摄像头,使用外设的话,选择1或者2,具体查看你的外设摄像头在电脑中的编号。你也可以输入视频地址来读取指定视频。

使用while循环来遍历摄像头读取的每一帧图片,并存入image中。

我们使用了 cv2.waitKey(1) 函数等待1毫秒并检测键盘输入。使用位运算符 & 和函数 ord() 将键盘输入的字符与 ASCII 码中字符 'q'(即按下 'q' 键)进行比较。如果相等,则通过 break 语句退出循环。

当退出循环后,我们需要释放摄像头资源和关闭窗口。使用 cap.release() 释放摄像头资源,然后调用 cv2.destroyAllWindows() 关闭显示窗口。

这样,当按下键盘上的 "q" 键时,程序会退出循环,并释放摄像头资源和关闭窗口。

如果我们希望保存我们摄像头记录的图片

import cv2

cap = cv2.VideoCapture(0)

# 设置保存视频的参数
save_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
save_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (save_width, save_height))

while True:
    success, image = cap.read()
    cv2.imshow('IMG', image)
    
    # 保存每一帧图像到视频文件
    out.write(image)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

我们根据摄像头的参数设置视频保存的相关参数:保存的视频宽度和高度与摄像头的参数相同,使用四字符码(fourcc)定义视频编解码器为XVID,帧率设定为20.0,并指定保存的视频尺寸。

在进入循环之前,我们使用cv2.VideoWriter()函数创建一个用于保存视频的对象。其中,第一个参数是保存的视频文件名,第二个参数是指定视频编解码器,第三个参数是帧率,第四个参数是保存的视频尺寸。

在循环中,每一帧图像都会被保存到视频文件中,通过out.write(image)实现。

最后,在退出循环后,我们需要释放摄像头资源和关闭视频对象。使用cap.release()释放摄像头资源,out.release()关闭视频对象。

这样,当按下键盘上的 "q" 键时,程序会退出循环,并保存摄像头读取的数据为视频文件 "output.avi"。

其中

cv2.VideoWriter()函数用于创建一个用于保存视频的对象。它的参数解释如下:

  1. filename: 保存的视频文件名。 这里的 'output.avi' 是保存视频的文件名,可以根据需要自行更改。

  2. fourcc: 视频编解码器。 fourcc 是一个四字符码,用于指定视频的编解码器。常见的四字符码包括 MP4V、XVID、MJPG等,可以根据需要选择。在示例代码中,我们使用了 *'XVID' 表示使用 XVID 编解码器。

  3. fps: 帧率(Frames per Second)。 fps 表示保存视频时的帧率,即每秒播放的帧数。在示例代码中,我们将帧率设定为20.0,可以根据需要进行调整。

  4. frameSize: 视频尺寸。 frameSize 是保存视频时的尺寸,即每一帧图像的大小。在示例代码中,我们将尺寸设置为(save_width, save_height),其中 save_widthsave_height 是根据摄像头的参数获得的宽度和高度

如果你想保存为MP4格式的视频文件,你可以修改fourcc参数为适合MP4格式的编解码器

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (save_width, save_height))

在上述代码中,我们使用了*'mp4v'作为fourcc参数,表示使用MP4编解码器。同时,将保存的文件名改为 'output.mp4'

这样修改后,摄像头读取的数据将以MP4格式进行保存。请确保你的OpenCV版本支持该编解码器,否则可能会出现错误。

相关推荐
新缸中之脑7 分钟前
Llama 3.2 安卓手机安装教程
前端·人工智能·算法
人工智障调包侠9 分钟前
基于深度学习多层感知机进行手机价格预测
人工智能·python·深度学习·机器学习·数据分析
开始King1 小时前
Tensorflow2.0
人工智能·tensorflow
Elastic 中国社区官方博客1 小时前
Elasticsearch 开放推理 API 增加了对 Google AI Studio 的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎
infominer1 小时前
RAGFlow 0.12 版本功能导读
人工智能·开源·aigc·ai-native
涩即是Null1 小时前
如何构建LSTM神经网络模型
人工智能·rnn·深度学习·神经网络·lstm
本本的小橙子1 小时前
第十四周:机器学习
人工智能·机器学习
励志成为美貌才华为一体的女子2 小时前
《大规模语言模型从理论到实践》第一轮学习--第四章分布式训练
人工智能·分布式·语言模型
学步_技术2 小时前
自动驾驶系列—自动驾驶背后的数据通道:通信总线技术详解与应用场景分析
人工智能·机器学习·自动驾驶·通信总线
winds~2 小时前
自动驾驶-问题笔记-待解决
人工智能·笔记·自动驾驶