Opencv-C++笔记 (6) : opencv-图片和视频操作

这篇具有很好参考价值的文章主要介绍了Opencv-C++笔记 (6) : opencv-图片和视频操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、读取函数imread

cv::Mat cv::imread(const String & filename,int  flags=IMREAD_COLOR)

filename:需要读取图像的文件名称,包含图像地址、名称和图像文件扩展名
flags:读取图像形式的标志,如将彩色图像按照灰度图读取,默认参数是按照彩色图像格式读取,可

选参数在表2-3给出。

函数用于读取指定的图像并将其返回给一个Mat类变量,如果图像文件不存在、破损或者格式不受支持时,则无法读取图像,此时函数返回一个空矩阵,因此可以通过判断返回矩阵的data属性是否为空或者empty()函数是否为真来判断是否成功读取图像,如果读取图像失败,data属性返回值为0,empty()函数返回值为1。函数能够读取多种格式的图像文件,但是在不同操作系统由于使用的编解码器不同,因此在某个系统中能够读取的图像文件可能在其他系统中就无法读取。无论在哪个系统中,bmp文件和dib文件都是始终可以读取的,在Windows和Mac系统中,默认情况下使用OpenCV自带的编解码器(libjpeg,libpng,libtiff和libjasper),因此可以读取JPEG(jpg、jpeg、jpe),PNG,TIFF(tiff、tif)文件,在Linux系统中需要自行安装这些编解码器,安装后同样可以读取这些类型的文件。不过需要说明的是,该函数能否读取文件数据与扩展名无关,而是通过文件的内容确定图像的类型,例如将一个扩展名由png修改成exe时,该函数一样可以读取该图像,但是将扩展名exe改成png,该函数不能加载该文件。

该函数第一个参数以字符串形式给出待读取图像的地址,第二个函数是设置读取图像的形式,默认的参数是以彩色图的形式读取,针对不同需求可以更改参数,在OpenCV
4.1中给出了13种模式读取图像的形式,总结起来分别是以原样式读取、灰度图读取、彩色图读取、多位数读取、在读取时将图像缩小一定尺寸等形式读取,具体可选择的参数及作用在表2-3种给出,这里需要指出的是,将彩色图像转成灰度图通过编解码器内部转换,可能会与OpenCV程序中将彩色图像转成灰度图的结果存在差异。这些标志参数在功能不冲突的前提下可以同时声明多个,不同参数之间用“|”隔开。
Opencv-C++笔记 (6) : opencv-图片和视频操作

二、图片窗口函数namedWindow

void cv::namedWindow(const String & winname,int  flags = WINDOW_AUTOSIZE)

winname:窗口名称,用作窗口的标识符
flags:窗口属性设置标志

该函数会创建一个窗口变量,用于显示图像和滑动条,通过窗口的名称引用该窗口,如果在创建窗口时已经存在具有相同名称的窗口,则该函数不会执行任何操作。创建一个窗口需要占用部分内存资源,因此通过该函数创建窗口后,在不需要窗口时需要关闭窗口来释放内存资源。OpenCV提供了两个关闭窗口资源的函数,分别是cv::destroyWindow()函数和cv::destroyAllWindows(),通过名称我们可以知道前一个函数是用于关闭一个指定名称的窗口,即在括号内输入窗口名称的字符串即可将对应窗口关闭,后一个函数是关闭程序中所有的窗口,一般用于程序的最后。不过事实上,在一个简单的程序里,我们并不需要调用这些函数,因为程序退出时会自动关闭应用程序的所有资源和窗口。虽然不主动释放窗口也会在程序结束时释放窗口资源,但是OpenCV 4.0版本在结束时会报出没有释放窗口的错误,而OpenCV 4.1版本则不会报错。

该函数的第一个参数是声明窗口的名称,用于窗口的唯一识别,第二个参数是声明窗口的属性,主要用于设置窗口的大小是否可调、显示的图像是否填充满窗口等,具体可选择的参数及含义在表2-4中给出,默认情况下,函数加载的标志参数为“WINDOW_AUTOSIZE
| WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED”。

Opencv-C++笔记 (6) : opencv-图片和视频操作

三、 图片保存Imwrite和显示函数Imshow

bool cv::imwrite	(	const String & 	filename,
	InputArray 	img,
	const std::vector< int > & 	params = std::vector< int >() 
)	

16 位无符号 CV 16U 图像可以保存成 PNG JPEG TIFF 式文件
32 位浮点 CV_32F 图像可以保存成 PFM TIFF OpenEXR Radiance HDR 格式文化
4 通道 (Alpha 通道 图像可以保存成 PNG 式文件.
Opencv-C++笔记 (6) : opencv-图片和视频操作

void cv::imshow(const String & winname,InputArray mat)

winname:要显示图像的窗口的名字,用字符串形式赋值
mat:要显示的图像矩阵

该函数会在指定的窗口中显示图像,如果在此函数之前没有创建同名的图像窗口,就会以WINDOW_AUTOSIZE标志创建一个窗口,显示图像的原始大小,如果创建了图像窗口,则会缩放图像以适应窗口属性。该函数会根据图像的深度将其缩放,具体缩放规则为:

如果图像是8位无符号类型,则按照原样显示
如果图像是16位无符号类型或者32位整数类型,则会将像素除以256,将范围由[0,255*256]映射到[0,255]
如果图像时32位或64位浮点类型,则将像素乘以255,即将范围由[0,1]映射到[0,255]

函数中第一个参数为图像显示窗口的名称,第二个参数是需要显示的图像Mat类矩阵。这里需要特殊说明的是,我们看到第二个参数并不是常见的Mat类,而是InputArray,这个是OpenCV定义的一个类型声明引用,用作输入参数的标识,我们在遇到它时可以认为是需要输入一个Mat类数据。同样,OpenCV对输出也定义了OutputArray类型,我们同样可以认为是输出一个Mat类数据。
注意
此函数运行后会继续执行后面程序,如果后面程序执行完直接退出的话,那么显示的图像有可能闪一下就消失了,因此在需要显示图像的程序中,往往会在imshow()函数后跟有cv::waitKey()函数,用于将程序暂停一段时间。waitKey()函数是以毫秒计的等待时长,如果参数缺省或者为“0”表示等待用户按键结束该函数。

四、视频数据的读取

Opencv-C++笔记 (6) : opencv-图片和视频操作

cv :: VideoCapture :: VideoCapture(); //默认构造函数
cv :: VideoCapture :: VideoCapture(const String& filename,int apiPreference =CAP_ANY)
  • filename:读取的视频文件或者图像序列名称
  • apiPreference:读取数据时设置的属性,例如编码格式、是否调用OpenNI等,详细参数及含义在

表2-5给出。
该函数是构造一个能够读取与处理视频文件的视频流,在代码清单2-27中的第一行是VideoCapture类的默认构造函数,只是声明了一个能够读取视频数据的类,具体读取什么视频文件,需要在使用时通过open()函数指出,例如cap.open(“1.avi”)是VideoCapture类变量cap读取1.avi视频文件。

第二种构造函数在给出声明变量的同时也将视频数据赋值给变量。可以读取的文件种类包括视频文件(例如video.avi)、图像序列或者视频流的URL。其中读取图像序列需要将多个图像的名称统一为“前缀+数字”的形式,通过“前缀+%02d”的形式调用,例如在某个文件夹中有图片img_00.jpg、img_01.jpg、img_02.jpg……加载时文件名用img_%02d.jpg表示。函数中的读取视频设置属性标签默认的是自动搜索合适的标志,所以在平时使用中,可以将其缺省,只需要输入视频名称即可。与imread()函数一样,构造函数同样有可能读取文件失败,因此需要通过isOpened()函数进行判断,如果读取成功则返回值为true,如果读取失败,则返回值为false。

通过构造函数只是将视频文件加载到了VideoCapture类变量中,当我们需要使用视频中的图像时,还需要将图像由VideoCapture类变量里导出到Mat类变量里,用于后期数据处理,该操作可以通过“>>”运算符将图像按照视频顺序由VideoCapture类变量复制给Mat类变量。当VideoCapture类变量中所有的图像都赋值给Mat类变量后,再次赋值的时候Mat类变量会变为空矩阵,因此可以通过empty()判断VideoCapture类变量中是否所有图像都已经读取完毕。

VideoCapture类变量同时提供了可以查看视频属性的get()函数,通过输入指定的标志来获取视频属性,例如视频的像素尺寸、帧数、帧率等,常用标志和含义在表2-5中给出。
Opencv-C++笔记 (6) : opencv-图片和视频操作

#include<iostream>
//#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

int main(int argc,char** argv) {
    cout<<"OpenCv Version: "<<CV_VERSION<<endl;
    VideoCapture video("/home/wyh/Documents/C++demo/project_video.mp4");
    if(video.isOpened()){
        cout<<"视频中图像的宽度 = "<<video.get(CAP_PROP_FRAME_WIDTH)<<endl;
        cout<<"视频中图像的高度 = "<<video.get(CAP_PROP_FRAME_HEIGHT)<<endl;
        cout<<"视频帧率 = "<<video.get(CAP_PROP_FPS)<<endl;
        cout<<"视频的总帧数 = "<<video.get(CAP_PROP_FRAME_COUNT)<<endl;
    }
    else{
        cout<<"请确认视频文件名称是否正确"<<endl;
        return -1;
    }
    while(1){
        Mat frame;
        video>>frame;
        if(frame.empty()){
            break;;
        }
        imshow("video",frame);
        waitKey(1000/video.get(CAP_PROP_FPS));
    }
    waitKey();
    return 0;
}

五、摄像头直接调用

cv :: VideoCapture :: VideoCapture(int index,int apiPreference = CAP_ANY)
  • opencv常用读视频函数 cv2.VideoCapture 、cv2.VideoCapture.get 等,可以参考这里
  • opencv常用写视频函数 cv2.VideoWriter 等可以参考这里 ,其中视频格式可以参考这里
  • videoCapture.read() 是按帧读取视频,ret,frame 是获 .read() 方法的两个返回值。其中 ret
    是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame 就是每一帧的图像,是个三维矩阵。
  • 可以使用 cv2.putText 来添加文字,具体参数可以参考这里

调用摄像头与读取视频文件相比,只有第一个参数不同。调用摄像头时,第一个参数为要打开的摄像头设备的ID,ID的命名方式从0开始。从摄像头中读取图像数据的方式与从视频中读取图像数据的方式相同,通过“>>”符号读取当前时刻相机拍摄到的图像。并且读取视频时VideoCapture类具有的属性同样可以使用。文章来源地址https://www.toymoban.com/news/detail-494015.html

//本例程将读取一个视频,并个视频加上流动水印后保存为一个新视频。
import cv2

#读取视频并获取视频帧率、分辨率、总帧数
VideoCapture = cv2.VideoCapture("VideoExample.mp4")
fps = VideoCapture.get(cv2.CAP_PROP_FPS)
size = (int(VideoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(VideoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
totalFrames = int(VideoCapture.get(7))

#创建新视频
ViideoWrite = cv2.VideoWriter("VideoWriterExample.avi",cv2.VideoWriter_fourcc('I','4','2','0'),
                              fps,size)

x=10 #水印坐标
y=10 #水印坐标
i=1
step_x=5
step_y=5

success,frame = VideoCapture.read() #读取视频第一帧
print("第"+str(i)+"帧, 共"+str(totalFrames)+"帧")
while success:
        cv2.waitKey(1)
        # 给图片添加水印
        cv2.putText(frame,'hello,opencv',(x,y),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),3)
        cv2.imshow("frame",frame)
        ViideoWrite.write(frame) #给新视频添加新帧

        # 水印坐标变化
        if(x>size[0]):step_x=-5
        if(x<0):step_x=5
        if(y>size[1]):step_y=-5
        if(y<0):step_y=5
        x += step_x
        y += step_y
        success,frame = VideoCapture.read()
        i += 1
        print("第"+str(i)+"帧, 共"+str(totalFrames)+"帧")

print ('Quitted!') #提示程序已停止
cv2.destroyAllWindows() #程序停止前关闭所有窗口
//本例程将读取并显示摄像头图像,在图像窗口按下按键“S”将开始录制摄像头视频,
//按下按键“X”将停止录制摄像头视频,按下按键“Q”将停止程序。
import cv2

#读取视频并获取视频帧率、分辨率
cameraCapture  = cv2.VideoCapture(0)
fps = cameraCapture .get(5)
size = (int(cameraCapture .get(cv2.CAP_PROP_FRAME_WIDTH)),int(cameraCapture .get(cv2.CAP_PROP_FRAME_HEIGHT)),)


#创建新视频
cameraWriter = cv2.VideoWriter("CameraExample.avi",cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)


x=10 #水印坐标
y=10 #水印坐标
i=1
step_x=5
step_y=5

#读取视频第一帧
success,frame = cameraCapture.read()


#提示停止方法
print ('Showing camera. Press key "Q" to quit.')
print ('Press key "S" to start recording.')
Quit=1 #是否继续运行标志位
Record=0 #录制视频标志位

while success and Quit:
    keycode=cv2.waitKey(1)
    if keycode & 0xFF == ord('q'): #如果按下“Q”键,停止运行标志位置1,跳出while循环,程序停止运行
        Quit = 0
    if keycode & 0xFF == ord('s'): #如果按下“S”键,开始录制摄像头视频
        Record = 1
    if keycode & 0xFF == ord('x'): #如果按下“X”键,停止录制摄像头视频
        Record = 0

    if Record:

        # 给图片添加水印
        cv2.putText(frame,'hello,opencv',(x,y),cv2.FONT_HERSHEY_SIMPLEX,3,(0,255,255),3)
        cameraWriter.write(frame)# 给新视频添加新帧
        # 水印坐标变化
        if x > size[0]:
            step_x = -5
        if x < 0:
            step_x = 5
        if y > size[1]:
            step_y = -5
        if y < 0:
            step_y = 5
        x += step_x
        y += step_y
        print("第" + str(i) + "帧,")
        i = i + 1
        print('Press key "X" to end recording.')
        print("\n\t")

    cv2.imshow('frame',frame)
    success,frame = cameraCapture.read() # 逐帧读取视频

if success == 0: #提示由于摄像头读取失败停止程序
    print ('Camera disconnect !')
print('Quitted!')  # 提示程序已停止
#释放摄像头
cameraCapture.release()
#程序停止前关闭所有窗口
cv2.destroyAllWindows()

到了这里,关于Opencv-C++笔记 (6) : opencv-图片和视频操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用OpenCV调用摄像头和读取视频图片

    要捕获视频,你需要创建一个 VideoCapture 对象。它的参数是设备索引的名称。设备索引就是指定哪个摄像头的数字。正常情况下,内部摄像头可以通过传入0来调用,传递1来选择外置的第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。 直

    2024年02月08日
    浏览(38)
  • 使用OpenCV读取视频、图片并做简单处理

    在conda中安装opencv,打开Anaconda Prompt 使用国内镜像源安装opencv,命令如下: 也可以安装opencv的另一个扩展包opencv-contrib-python,不安装扩展包也可以使用,命令如下: 卸载opencv,使用命令 Pycharm中没有cv2库的提示时,找到cv2安装的路径,将虚拟环境中的 site-packagescv2 中的 cv2

    2024年02月03日
    浏览(41)
  • Opencv-C++笔记 (10) : opencv-图像像素计算

    我们可以将数字图像理解成一定尺寸的矩阵,矩阵中每个元素的大小表示了图像中每个像素的亮暗程度,因此统计矩阵中的最大值,就是寻找图像中灰度值最大的像素,计算平均值就是计算图像像素平均灰度,可以用来表示图像整体的亮暗程度。因此针对矩阵数据的统计工作

    2024年02月09日
    浏览(23)
  • Opencv-C++笔记 (5) : opencv-形态学

    形态学运算是针对二值图像依据数学形态学(Mathematical Morphology)的集合论方法发展起来的图像处理方法。数学形态学起源于岩相学对岩石结构的定量描述工作,近年来在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析方法和理论。 结构元素

    2024年02月09日
    浏览(27)
  • OpenCV基础操作_图片读取和保存

    目录 1 图片读取 2 图片保存 在OpenCV中,加载图片采用imread()函数。 函数详细说明在:Reading and Writing Images and Video — OpenCV 2.4.13.7 documentation Python:   cv2. imread (filename[, flags])  函数功能: imread 功能是加载图像文件成为一个 Mat 对象。 imread支持的文件类型有: Windows bitmaps

    2023年04月19日
    浏览(76)
  • 【Python】OpenCV读取视频帧并保存为图片

    vid = cv2.VideoCapture(0) VideoCapture()中参数是0,表示打开笔记本的内置摄像头 参数是视频文件路径则打开视频,如 vid= cv2.VideoCapture(\\\'video.mp4\\\') retval, frame = vid.read() vid.read()按帧读取视频 retval, frame是获vic.read()方法的两个返回值。其中retval是布尔值,如果读取帧是正确的则返回True,

    2023年04月12日
    浏览(34)
  • Opencv-C++笔记 (9) : opencv-多通道分离和合并

    在图像颜色模型中不同的分量存放在不同的通道中,如果我们只需要颜色模型的某一个分量,例如只需要处理RGB图像中的红色通道,可以将红色通道从三通道的数据中分离出来再进行处理,这种方式可以减少数据所占据的内存,加快程序的运行速度。同时,当我们分别处理完

    2024年02月09日
    浏览(30)
  • opencv入门到精通——图片,视频,摄像头的读取与保存

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

    2024年02月08日
    浏览(38)
  • Opencv-C++笔记 (18) : 轮廓和凸包

    轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。 所以边缘提取的阈值选定会影响最终轮廓发现结果 轮廓查找步骤: 输入图像转为灰度图像cvtColor 使用Canny进行边缘提取或者threshold阈值操作,得到二值图像 使用findContours寻找轮廓 使用drawContours绘制轮廓 在二值图像

    2024年02月11日
    浏览(22)
  • Opencv-C++笔记 (3) : opencv的库介绍以及和C++对接转换

    calib3d 主要包含相机标定,立体视觉的功能:物体姿势估计,三维重建,摄像头标定 core,包含库的基本结构和操作,比如数据结构,绘图函数,数组操作等函数 dnn,深度学习模块,包含构建网络,加载序列化的模型,但是不支持训练,只能推理 features2d,处理图像特征点,特

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包