C++ opencv:视频读取、变换颜色风格、保存

这篇具有很好参考价值的文章主要介绍了C++ opencv:视频读取、变换颜色风格、保存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过此文章可快速了解C++opencv的关于视频读取、颜色风格、视频保存相关的知识点。

目录

1. 相关知识点

2. 代码

编写代码main.cpp:

编写CmakeLists.txt:

编译并执行:

3. 效果展示


1. 相关知识点

1.1 VideoCapture

        在C++中,使用OpenCV库中的VideoCapture类来捕获视频流;VideoCapture构造函数接受一个参数,指定要打开的视频文件的路径或者设备的索引号。

类定义:

class CV_EXPORTS_W VideoCapture
{
public:
    CV_WRAP VideoCapture();
    CV_WRAP VideoCapture(const String& filename, int apiPreference = CAP_ANY);
    CV_WRAP VideoCapture(int index, int apiPreference = CAP_ANY);
    CV_WRAP virtual ~VideoCapture();
    CV_WRAP virtual bool open(const String& filename, int apiPreference = CAP_ANY);
    CV_WRAP virtual bool open(int index, int apiPreference = CAP_ANY);
    CV_WRAP virtual void release();
    CV_WRAP virtual bool isOpened() const;
    CV_WRAP virtual bool grab();
    CV_WRAP virtual bool retrieve(OutputArray image, int flag = 0);
    CV_WRAP virtual bool read(OutputArray image);
    CV_WRAP virtual bool set(int propId, double value);
    CV_WRAP virtual double get(int propId) const;
    CV_WRAP virtual bool set(const String& propName, double value);
    CV_WRAP virtual double get(const String& propName) const;
};

1.2 applyColorMap

        它是OpenCV中的一个函数,用于将彩色映射应用到输入图像上。它通过将图像的灰度级映射到不同的颜色上来增强图像的视觉效果。

        函数定义:

void applyColorMap(InputArray src, OutputArray dst, int colormap)

        参数说明:

  • src:输入图像,可以是单通道灰度图像或三通道彩色图像。
  • dst:输出图像,与输入图像具有相同的尺寸和深度。
  • colormap:选择要应用的彩色映射,可以是以下之一:
    • cv::COLORMAP_AUTUMN:秋季调色板
    • cv::COLORMAP_BONE:骨骼调色板
    • cv::COLORMAP_JET:喷射器调色板
    • cv::COLORMAP_WINTER:冬季调色板
    • cv::COLORMAP_RAINBOW:彩虹调色板
    • cv::COLORMAP_OCEAN:海洋调色板
    • cv::COLORMAP_SUMMER:夏季调色板
    • cv::COLORMAP_SPRING:春季调色板
    • cv::COLORMAP_COOL:凉爽调色板
    • cv::COLORMAP_HSV:HSV调色板
    • cv::COLORMAP_PINK:粉红调色板
    • cv::COLORMAP_HOT:热调色板

1.3 VideoWriter

        VideoWriter类用来创建和写入视频文件。VideoWriter类提供了一组方法来设置输出视频的参数,如帧率、分辨率、编解码器等,并且可以通过write方法将帧写入视频文件。

        类定义如下:

class CV_EXPORTS_W VideoWriter
{
public:
    CV_WRAP VideoWriter();
    CV_WRAP VideoWriter(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true);
    CV_WRAP virtual ~VideoWriter();
    CV_WRAP virtual bool open(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true);
    CV_WRAP virtual void release();
    CV_WRAP virtual bool isOpened() const;
    CV_WRAP virtual void write(InputArray image);
    CV_WRAP virtual bool set(int propId, double value);
    CV_WRAP virtual double get(int propId) const;
    CV_WRAP virtual bool set(const String& propName, double value);
    CV_WRAP virtual double get(const String& propName) const;
};

2. 代码

2.1 编写代码main.cpp

        这里我们定义了一个函数videoRW,有两个参数:输入视频的地址,保存结果视频的地址;在main函数中,通过命令行参数来指定输入视频、输出视频的地址,即可运行、实时可视化,并保存结果到指定路径:

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

using namespace cv;


void videoRW(String video_path, String out_path) {
    std::cout << video_path << std::endl;
    std::cout << out_path << std::endl;
    VideoCapture video(video_path);
    if (!video.isOpened())
    {
        std::cout << "Read Video Error!" << std::endl;
        return;
    }

    int width = cvRound(video.get(CAP_PROP_FRAME_WIDTH));
    int higth = cvRound(video.get(CAP_PROP_FRAME_HEIGHT));
    std::cout << "Weight: " << width << std::endl;
    std::cout << "Height: " << higth << std::endl;
    std::cout << "FPS: " << video.get(CAP_PROP_FPS) << std::endl;
    std::cout << "Frame num: " << video.get(CAP_PROP_FRAME_COUNT) << std::endl;

    VideoWriter writer(out_path, video.get(CAP_PROP_FOURCC), video.get(CAP_PROP_FPS),
        Size(width*2, higth));

    Mat frame, dst;
    int index = 0;
    while (true) {
        video.read(frame);
        if (frame.empty()){
            break;
        }

        index++;
        applyColorMap(frame, dst, cvRound(index/10) % 21);
        
        Mat big(higth, width * 2, CV_8UC3);
        frame.copyTo(big(Rect(0, 0, width, higth)));
        dst.copyTo(big(Rect(width, 0, width, higth)));
        
        String wname = "video";
        namedWindow(wname, 0);
        imshow(wname, big);
        writer.write(big);

        int key = waitKey(10);
        if (key == 27) {
            break;
        }
    }

    video.release();
    writer.release();
}


int main(int argc, char **argv)
{
	std::cout << "arg count: " << argc << "\narg value: " << argv << std::endl;


    std::cout << "video demo~" << std::endl;
	const String video_path = argv[1];
	String out_path = argv[2];

	videoRW(video_path, out_path);


	cv::destroyAllWindows();

	std::cout<<"\n------Demo Over!------\n"<<std::endl;
	return 0;
}

2.2 编写CmakeLists.txt

        这里在CmakeLists.txt中指定了我们所支持的最小cmake版本VERSION 3.1, 调用的是cmake_minimum_required();也制定了工程名称、指定了opencv库、打印了一些信息、添加了源文件、链接形成应用程序:

# cmake needs this line
cmake_minimum_required(VERSION 3.1)

# Define project name
project(opencv_example_project)

# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)

# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    config: ${OpenCV_DIR}")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")


aux_source_directory(. ALL_SRCS)

# Declare the executable target built from your sources
add_executable(demo ${ALL_SRCS})

# Link your application with OpenCV libraries
target_link_libraries(demo PRIVATE ${OpenCV_LIBS})

2.3 编译并执行

# 编译
mkdir build
cd build
cmake ..
make

# 运行:需指定输入视频的路径和视频保存的路径
./demo input.mp4 output.mp4

3. 效果展示

        运行后,可以看到如下的效果:

C++ opencv:视频读取、变换颜色风格、保存,C++ opencv,opencv,人工智能,计算机视觉

        视频如下: 

视频风格变换与拼接文章来源地址https://www.toymoban.com/news/detail-634272.html

到了这里,关于C++ opencv:视频读取、变换颜色风格、保存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • OpenCV实现视频的读取、显示、保存

    目录 1,从文件中读取视频并播放 1.2代码实现 1.3效果展示 2,保存视频 2.1    代码实现 2.2   结果展示 下面将详细介绍如何使用OpenCV实现视频的读取、显示和保存,并解释其原理。 视频读取: 使用OpenCV可以通过 cv2.VideoCapture 类来读取视频文件。该类提供了一系列方法用于操

    2024年02月03日
    浏览(59)
  • Python|OpenCV-读取视频,显示视频并保存视频(3)

    前言 本文是该专栏的第3篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV处理视频的时候,不论是摄像头画面还是视频文件,通常情况下都要使用VideoCapture类来进行每一帧图像的处理。对于OpenCV而言,只要使用视频文件作为参数,它就可以打开视频文

    2024年02月11日
    浏览(44)
  • opencv视频文件的读取,处理与保存

    opencv视频文件的读取,处理与保存 一、视频文件的读取: 1、cv::VideoCapture是OpenCV库中用于处理视频输入的类,它提供了一种简单的方法来从摄像头,视频文件、或图像序列中读取帧; (1)打开摄像头: (2)打开视频文件: (3)打开网络摄像头: (4)打开图像序列: 2、

    2024年02月04日
    浏览(44)
  • 【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日
    浏览(43)
  • OpenCV 视频处理(关于摄像头和视频文件的读取、显示、保存等等)

    OpenCV不仅能够处理图像,还能够处理视频 视频是由大量的图像构成的 ,这些图像是以固定的时间间隔从视频中获取的。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到处理视频的目的。要想处理视频,需要先对视频进行读取、显示、保存等相关操作。为此

    2024年03月14日
    浏览(50)
  • opencv基础: 视频,摄像头读取与保存的常用方法

    当然还可以从视频中抓取截图,所以现在聊一下常用的抓取视频截图的的方法。 上面有三种构造方法, 第一种是无法构造方法。 第二种参数device是一个数字。 一般笔记本如此写cv2.VideoCapture(0); 因为默认是0 ,如果有多个摄像头,就需要看设置的摄像头代表的数字了。 第二种

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

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

    2024年02月08日
    浏览(53)
  • OpenCV学习之视频读取与帧的提取、显示及保存

    OpenCV支持从摄像头或视频文件(AVI)中抓取图像并保存为另一视频文件. 一、 从摄像头获取初始化: 从视频文件filename.avi获取初始化: 抓取帧: 要从多个摄像头同时获取图像, 首先从每个摄像头抓取一帧. 在抓取动作都结束后再恢复帧图像. 释放抓取源(和释放单幅图像时类似):

    2024年02月14日
    浏览(44)
  • OpenCV从入门到精通(一) ——OpenCV简介、模块、常用函数、图像视频读取显示保存

    说明:关于OpenCV的教程和书籍已经很多了,所以,我不想重复别人已经做过的事情。如何系统全面的掌握OpenCV?我想这是每个学习OpenCV的人都想要做到的事情。说到底,OpenCV只是一个数字图像处理函数库,要全面掌握OpenCV的使用,只需要明白有哪些函数,每个函数怎么使用。

    2024年02月07日
    浏览(57)
  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(398)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包