什么是网站域名?,仪征建设局招投标网站,怎样切图做网站,建工网校怎么样文章目录 图片视频从文件读取视频保存一个视频绘图函数 图片
OpenCV#xff08;Open Source Computer Vision Library#xff09;是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的图像处理工具和算法#xff0c;使得开发者能够轻松实现各种图像处理任务。… 文章目录 图片视频从文件读取视频保存一个视频绘图函数 图片
OpenCVOpen Source Computer Vision Library是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的图像处理工具和算法使得开发者能够轻松实现各种图像处理任务。 包括 从文件中读取图像 通过OpenCV窗口展示图像 将一个图像写入文件 代码 import cv2 as cv
import sys# 通过cv.samples.findFile()函数读取图像文件
img cv.imread(cv.samples.findFile(img_2.png))# 检查图像是否成功加载
if img is None:sys.exit(Could not read the image.) # 如果加载失败退出程序并显示错误消息# 显示图像窗口
cv.imshow(Display window, img)# 等待用户按键输入返回按键的ASCII码以毫秒为单位0表示一直等待
k cv.waitKey(0)# 如果用户按下键盘上的 s 键
if k ord(s):# 将图像保存为 starry_night.pngcv.imwrite(starry_night.png, img)print(Image saved as starry_night.png) # 显示保存成功的消息
解释使用OpenCV加载名为 “img_2.png” 的图像文件。如果图像加载失败程序将显示错误消息并退出。然后它将图像显示在一个窗口中等待用户按键输入。如果用户按下键盘上的 “s” 键程序将保存当前图像为 “starry_night.png” 并显示保存成功
视频
在图像处理中经常需要从摄像头中捕获视频流进行处理。OpenCV为我们提供了一个简单而强大的接口来实现这个任务。在这个入门任务中将如何从摄像头通常是笔记本电脑上的摄像头捕获视频流将视频转换为灰度图像然后显示出来。
包括 读取视频显示视频和保存视频。 从相机中捕获视频和展示它。 将会使用到这些函数cv.VideoCapture()cv.VideoWriter()
首先我们需要创建一个VideoCapture对象这个对象用于捕获视频。它的参数可以是设备的索引或者是视频文件的名称。设备的索引用于区分连接到计算机的不同摄像头通常我们会使用0或者-1表示默认连接的摄像头如果有多个摄像头可以使用1、2等数字来指定不同的摄像头。
接着我们可以使用VideoCapture对象的方法逐帧捕获视频进行处理。在处理完视频之后不要忘记释放摄像头资源以确保其他应用程序可以正常使用摄像头。
import numpy as np
import cv2 as cv# 打开摄像头设备索引为0通常表示默认连接的摄像头
cap cv.VideoCapture(0)# 检查摄像头是否成功打开
if not cap.isOpened():print(Cannot open camera) # 如果打开失败输出错误消息exit()while True:# 逐帧捕获视频ret, frame cap.read()# 如果ret为False说明未成功捕获帧可能是视频流结束if not ret:print(Cant receive frame (stream end?). Exiting...)break # 退出循环# 将彩色帧转换为灰度图像gray cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显示处理后的灰度帧cv.imshow(frame, gray)# 等待用户按键输入如果是q键则退出循环if cv.waitKey(1) ord(q):break# 释放摄像头资源
cap.release()# 关闭所有窗口
cv.destroyAllWindows()
cap.read()函数返回一个布尔值如果成功读取到帧返回True否则返回False。因此我们可以通过检查这个返回值来判断视频是否到达结尾。
有时cap对象可能没有成功初始化这时候代码会出现错误。我们可以使用cap.isOpened()函数来检查是否成功初始化。如果返回True说明初始化成功否则我们可以使用cap.open()函数尝试重新打开它。
此外我们还可以使用cap.get(propld)函数获取视频的属性其中propld是一个从0到18的数字代表视频的不同属性。你可以查看OpenCV文档中关于cv::VideoCapture::get()函数的详细信息。一些属性的值可以使用cap.set(propld, value)函数进行设置value是你想要设置的值。 当处理视频时我们经常需要获取和设置帧的属性例如宽度和高度。OpenCV提供了方便的方法来实现这些操作。例如我们可以使用cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)来获取帧的默认宽度和高度它们默认返回值是640×480。 如果我们希望修改帧的尺寸比如将宽度和高度设置为320×240我们只需调用以下代码
ret_width cap.set(cv.CAP_PROP_FRAME_WIDTH, 320) # 设置帧的宽度为320
ret_height cap.set(cv.CAP_PROP_FRAME_HEIGHT, 240) # 设置帧的高度为240这里的ret_width和ret_height将返回设置操作的结果通常为True表示设置成功False表示设置失败。通过这种方式我们可以方便地控制视频帧的尺寸以满足特定需求。
注如果一直报错请确保摄像头开启。
从文件读取视频
从文件中读取视频和从摄像头中捕获视频的基本原理是相同的唯一的区别在于需要将设备下标在这种情况下是视频文件的路径传递给cv.VideoCapture()函数。然后在使用cv.waitKey()时我们需要设置适当的等待时间来控制视频的播放速度。
如果等待时间设置得太短视频将以非常快的速度播放难以观察。而如果等待时间设置得太长视频会变得非常慢这就是制作慢动作视频的方法之一。通常情况下等待时间应该在正常速度下的每帧间隔内一般为25毫秒。
import numpy as np
import cv2 as cv# 打开视频文件fan.mp4是视频文件的路径
cap cv.VideoCapture(fan.mp4)while cap.isOpened():# 逐帧读取视频ret, frame cap.read()# 如果ret为False说明未成功读取帧可能是视频流结束if not ret:print(Cant receive frame (stream end?). Exiting...)break # 退出循环# 将彩色帧转换为灰度图像gray cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显示处理后的灰度帧cv.imshow(frame, gray)# 等待25毫秒如果用户按下q键则退出循环if cv.waitKey(25) ord(q):break# 释放视频文件资源
cap.release()# 关闭所有窗口
cv.destroyAllWindows()
确保安装了合适版本的ffmpeg或者gstreamer。大多数视频捕获出错就是因为安装了错误的ffmpeg/gstreamer。
保存一个视频
当我们想要一帧一帧地捕获视频、进行处理并保存为视频文件时我们需要创建一个 VideoWriter 对象。首先我们要确定输出文件的名字例如‘output.avi’。接下来我们需要选择合适的 FourCC 编码确定帧率fps和尺寸。最后我们还需要设置一个标志 isColor以确定编码器是接受彩色帧还是灰度帧。 FourCC是一个用来指定视频编解码器的4字节代码可用代码列表可以在 fourcc.org 中找到。不同平台系统有不同代码下面这些是我认为比较适用的
•在Fedora(Linux)DIVX, XVID, MJPG, X264, WMV1, WMV2XVID最合适MJPG用来生成高规格的视频而X264正相反 •在WindowsDIVX写这个的人也不确定是不是最好的 •在OSXMJPG (.mp4), DIVX (.avi), X264 (.mkv)
FourCC的传参方式以MJPG为例可以像cv.VideoWriter_fourcc(‘M’, ‘J’, ‘P’, ‘G’)或者cv.VideoWriter_fourcc(*‘MJPG’)
import numpy as np
import cv2 as cv# 打开默认摄像头设备下标为0
cap cv.VideoCapture(0)# 定义视频编解码器和创建VideoWriter对象fourcc是用于指定视频编码格式的四字符代码
fourcc cv.VideoWriter_fourcc(*DIVX) # 使用DIVX编码器
out cv.VideoWriter(output.avi, fourcc, 20.0, (640, 480)) # 输出视频的文件名、编解码器、帧率和帧大小while cap.isOpened():# 逐帧读取视频ret, frame cap.read()# 如果ret为False说明未成功读取帧可能是视频流结束if not ret:print(Cant receive frame (stream end?). Exiting...)break # 退出循环# 将帧上下颠倒镜像效果frame cv.flip(frame, 0)# 将帧写入输出视频文件out.write(frame)# 显示处理后的帧cv.imshow(frame, frame)# 等待1毫秒如果用户按下q键则退出循环if cv.waitKey(1) ord(q):break# 释放摄像头和输出视频文件资源
cap.release()
out.release()# 关闭所有窗口
cv.destroyAllWindows()
绘图函数
通过OpenCV绘画不同的几何形状 使用到这些函数cv.line()、cv.circle()、cv.rectangle()、cv.ellipse()、cv.putText()等等。 包括 img: 你想绘图的地方
color: 形状的颜色通过元组给参。对于灰度只需要传递标量值。
thickness: 线或者圆的厚度。如果是-1将填充封闭图形。缺省值 thickness 1
lineType: 线条的种类
画线
import numpy as np
import cv2 as cv# 创建一个全黑的图像大小为512x5123表示RGB颜色通道
img np.zeros((512, 512, 3), np.uint8)# 画一条厚度为5px的蓝线起点为(0, 0)终点为(511, 511)颜色为蓝色 (255, 0, 0)线宽为5px
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)# 画一个矩形左上角坐标为(384, 0)右下角坐标为(510, 128)颜色为绿色 (0, 255, 0)线宽为3px
cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)# 画一个实心圆圆心为(447, 63)半径为63颜色为红色 (0, 0, 255)-1表示填充圆
cv.circle(img, (447, 63), 63, (0, 0, 255), -1)# 画一个椭圆中心为(256, 256)长轴和短轴分别为100和50椭圆角度为0到180度颜色为白色 (255, 255, 255)-1表示填充椭圆
cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)# 定义多边形的顶点坐标
pts np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
# 将多边形的顶点坐标变为3维数组
pts pts.reshape((-1, 1, 2))
# 画一个多边形True表示闭合多边形颜色为黄色 (0, 255, 255)
cv.polylines(img, [pts], True, (0, 255, 255))# 定义字体类型
font cv.FONT_HERSHEY_SIMPLEX
# 在图像上添加文字OpenCV起始坐标为(10, 500)字体大小为4颜色为白色 (255, 255, 255)线宽为2px线型为抗锯齿
cv.putText(img, OpenCV, (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)# 在窗口中显示图像
cv.imshow(demo, img)# 等待用户按下任意键后关闭窗口
cv.waitKey(0)
在画一条线的时候你需要传递线条的开始和结束的坐标。下面的代码创建了黑色的背景以及画了一条从左上到右下的蓝色直线。
画长方形 为了画矩形你需要给出矩形的左上和右下坐标。这次会在右上画出一个绿色的矩形。
cv.circle(img, (447, 63), 63, (0, 0, 255), -1)画椭圆 椭圆需要的参数会比较多。第一个参数是中心的位置(x, y)。第二个参数是垂直的两条轴的长度。angle是椭圆沿逆时针方向旋转的角度。startAngle和endAngle是沿顺时针方向椭圆弧端点的夹角0和360代表了完整的椭圆。更多的细节可以查看文档。下面的例子在中心画了半个椭圆弧。
cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)画多边形 首先你需要所有顶点的坐标。把这些坐标放入一个数据类型为int32的 1×2的矩阵中。下面的例子画了一个黄色四边形
pts np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
pts pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (0, 255, 255))如果第三个参数是False你只会得到折线而不是封闭图形。 cv.pplylines()可以画出折线。只需要把所有你想画的线条放进一个列表然后传参进去。这比用cv.lines一条一条画要快得多。
给图像添加文字
当使用cv.putText()函数时确定以下信息
要写入的文字数据确定想要在图像上写入的文本内容例如OpenCV。放置的位置坐标选择文字的起始点坐标通常是左下角作为起点例如(10, 500)。字体选择适合的字体。OpenCV提供了不同的字体可以在文档中查找支持的字体选项。字的大小指定文字的大小通常以字体高度为单位。例如字体大小为4。颜色选择文字的颜色以RGB格式表示。例如白色可以表示为(255, 255, 255)。线宽和线条种类可以选择文本的厚度通常用整数表示。例如线宽为2。同时你也可以指定线条的种类例如cv.LINE_AA这样可以获得更好的视觉效果。比如下面的代码在图像上写了白色的OpenCV
font cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, OpenCV, (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)