学习Opencv(蝴蝶书/C++)代码——2.OpenCV初探

2023-11-20 22:21

本文主要是介绍学习Opencv(蝴蝶书/C++)代码——2.OpenCV初探,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0. 图像读取与显示
  • 1. 视频文件读取与操作
    • 1.1 示例代码
    • 1.1 OpenCV支持的视频格式
  • 2. 加入滑动条
    • 2.1 示例代码
    • 2.2 报错/Warning
    • 2.3 关于toolbar
  • 3. 简易视频播放器
    • 3.1 OpenCV检测方向键被按下
      • 3.1.1 Windows下
      • 3.1.2 linux下
    • 3.1 方向键控制视频变化
  • 4. 简单的变换
  • 5. 写视频
    • 5.1 关于写视频时的编码格式
      • 5.1.1 系统可用的编码格式
      • 5.1.2 编解码器tag表示意义
      • 5.1.3 使用编解码器
    • 5.2 对数极坐标变换
    • 5.3 RGB三通道写视频
    • 5.4 打开多个窗口cv::waitKey()无响应问题/响应迟钝
    • 5.5. cv::waitKey(0)和cv::waitKey(1)
    • 5.6 OpenCV VideoWriter()保存慢,写入文件fps与源文件不同
    • 5.7 报错[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd09c21ed40] moov atom not found
  • 6.课后练习
  • X. 插件

0. 图像读取与显示

示例1,来自learning OpenCV 3的配套源码
https://github.com/oreillymedia/Learning-OpenCV-3_examples/blob/master/example_02-01.cpp

//Example 2-1. A simple OpenCV program that loads an image from disk and displays it
//on the screen
#include <opencv2/opencv.hpp>void help(char** argv ) {std::cout << "\n"<< "A simple OpenCV program that loads and displays an image from disk\n"<< argv[0] <<" <path/filename>\n"<< "For example:\n"<< argv[0] << " ../fruits.jpg\n"<< std::endl;
}int main( int argc, char** argv ) {if (argc != 2) {help(argv);return 0;}cv::Mat img = cv::imread( argv[1], -1 );if( img.empty() ) return -1;cv::namedWindow( "Example 2-1", cv::WINDOW_AUTOSIZE );cv::imshow( "Example 2-1", img );cv::waitKey( 0 );cv::destroyWindow( "Example 2-1" );return 0;
}

1. 视频文件读取与操作

1.1 示例代码

示例1:
https://github.com/opencv/opencv/blob/4.x/samples/cpp/videocapture_starter.cpp

示例2:
来自cv::VideoCapture Class Reference的Detailed Description

如果觉得上面那个写的比较复杂,不直观,可以看看简单的:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>using namespace cv;
int main(int argc, char **argv)
{Mat frame;// 初始化一个VIDEOCAPTURE对象capVideoCapture cap;// 使用默认的API打开默认的相机// cap.open(0);// 或者更先进的用法,选择任意一个API后端int deviceID = 0;        // 0 = open default cameraint apiID = cv::CAP_ANY; // 0 = autodetect default API// 使用选择的API打开选择的相机cap.open(deviceID, apiID);// 判断是否正确打开视频流if (!cap.isOpened()){std::cerr << "ERROR! Unable to open camera\n";return -1;}// 开始读取视频std::cout << "Start grabbing" << std::endl<< "Press any key to terminate" << std::endl;for (;;){// 等待从视频读入新帧并把它存储到'frame'中cap.read(frame);// 检查是否读取成功if (frame.empty()){std::cerr << "ERROR! blank frame grabbed\n";break;}// 实时显示,每5ms显示一帧图像直到有任意按键imshow("Live", frame);if (waitKey(5) >= 0)break;}// 相机对象会在VideoCapture析构函数中自动释放return 0;
}

示例3:
来自learning OpenCV 3的配套源码
https://github.com/oreillymedia/Learning-OpenCV-3_examples/blob/master/example_02-03.cpp

int main(int argc, char **argv)
{cv::namedWindow("Example2");cv::VideoCapture cap;// VideoCapture可以打开和关闭很多ffmpeg支持的视频文件cap.open(std::string(argv[1]));cv::Mat frame;if (cap.isOpened()){for (;;){cap >> frame;// Stream operator to read the next video frameif (frame.empty())break;cv::imshow

这篇关于学习Opencv(蝴蝶书/C++)代码——2.OpenCV初探的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397859

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

C++的模板(八):子系统

平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。 但这不是唯一的用法。试想一下。如果在模板内限制调用参数类型的构造函数会发生什么?参数类的对象在模板内无法构造。他们只能从模板的成员函数传入。模板不保存这些对象或者只保存他们的指针。因为构造函数被分离,这些指针在模板外

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

C++工程编译链接错误汇总VisualStudio

目录 一些小的知识点 make工具 可以使用windows下的事件查看器崩溃的地方 dumpbin工具查看dll是32位还是64位的 _MSC_VER .cc 和.cpp 【VC++目录中的包含目录】 vs 【C/C++常规中的附加包含目录】——头文件所在目录如何怎么添加,添加了以后搜索头文件就会到这些个路径下搜索了 include<> 和 include"" WinMain 和

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备