【OpenCV基础】图像翻转、旋转变换、视频加载、摄像头调用

本文主要是介绍【OpenCV基础】图像翻转、旋转变换、视频加载、摄像头调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处

文章目录

  • 一、图像翻转和旋转变换
    • 1.API- flip
    • 2.效果展示
    • API- transpose
  • 二、视频加载与摄像头调用
    • 1.API-VideoCapture
    • 2.关键设置
    • 播放速度的设置
    • if (c == 27) { break};的解释
    • 3.代码演示
      • 视频加载
      • 摄像头调用


一、图像翻转和旋转变换

1.API- flip

函数原型:

void flip(InputArray src, OutputArray dst, int flipCode)

参数含义:

src,输入矩阵

dst,翻转后矩阵,类型与src一致

flipCode,翻转模式,
flipCode==0垂直翻转(沿X轴翻转);
flipCode>0水平翻转(沿Y轴翻转);
flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)

2.效果展示

在这里插入图片描述
在这里插入图片描述

API- transpose

作用:获得转置矩阵
函数原型:

void transpose(InputArray src, OutputArray dst);

transpose结合flip可以实现图像的90、180、270度的顺时针旋转
1.顺时针旋转90度

transpose(frame, frame);
flip(frame, frame, 1);

2.顺时针旋转180度

flip(frame, frame, -1);

3.顺时针旋转270度

transpose(frame, frame);
flip(frame, frame, 0);

二、视频加载与摄像头调用

1.API-VideoCapture

1.调用电脑摄像头:VideoCapture cap(1);
2.调用USB外接摄像头:VideoCapture cap(0);
3.选择可用的摄像头:VideoCapture cap(-1);
4.获取IP视频流:例如:VideoCapture video(“D:/images/balltest.mp4”);VideoCapture cap( “http:/ / youku.elecfans.com/video.flv”);
其他表示方法:
例如VideoCapture cap(0);等同于
VideoCapture capture;
capture.open(0);

2.关键设置

播放速度的设置

等速:1000/video.get(CAP_PROP_FPS),1000毫秒(1秒)除以帧率(FPS)等于每帧图像播放时停留的时间,意味着播放速度等于原视频的速度,一般视频播放速度大于25帧/s,因此当频率为25/s时,1000/video.get(CAP_PROP_FPS)等于40毫秒

		char c = waitKey(1000/video.get(CAP_PROP_FPS));if (c == 27) { // ESC退出break;}

加速:X<1000/video.get(CAP_PROP_FPS),假如X小于40,则会加速播放;
减速:X>1000/video.get(CAP_PROP_FPS)。

		char c = waitKey(X);if (c == 27) { // ESC退出break;}

if (c == 27) { break};的解释

waitKey(delay)返回值:
等待期间有按键:返回按键的ASCII码(比如:Esc的ASCII码为27);
因此按了esc之后就会break,退出程序。

3.代码演示

视频加载

#include<iostream>
#include<opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{   //获取摄像头:电脑自带摄像头 为1 ,外部 0;VideoCapture video("视频路径以及名称")VideoCapture video("D:/images/balltest.mp4");//判断视频能否正常打开if (video.isOpened()) {cout << "width=" << video.get(CAP_PROP_FRAME_WIDTH);cout << "fps=" << video.get(CAP_PROP_FPS) << endl;//读取视频流中的频率;}else{printf("请确认视频文件路径是否正确");return -1;}//循环发布图像while (1)//循环显示每一帧{Mat frame;//存储每一帧图像video >> frame;//读取当前帧if (frame.empty()){break;}imshow("video", frame);//播放速度设置char c = waitKey(1000/video.get(CAP_PROP_FPS));if (c == 27) { // ESC退出break;}	}video.release();//释放资源	waitKey();return 0;
}

摄像头调用

#include<iostream>
#include<opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{   //获取摄像头:电脑自带摄像头 为1 ,外部 0;VideoCapture video("视频路径以及名称")VideoCapture video(0);//判断视频能否正常打开if (video.isOpened()) {cout << "width=" << video.get(CAP_PROP_FRAME_WIDTH);cout << "height=" << video.get(CAP_PROP_FRAME_HEIGHT) << endl;}else{printf("请确认视频文件路径是否正确");return -1;}//循环发布图像while (1)//循环显示每一帧{Mat frame;//存储每一帧图像video >> frame;//读取当前帧if (frame.empty()){break;}flip(frame, frame, 1);//左右翻转imshow("video", frame);char c = waitKey(5);if (c == 27) { // ESC退出break;}	}video.release();//释放资源	waitKey();return 0;
}

循环发布图像可以改为:

//循环发布图像Mat frame;//存储每一帧图像while (video.read(frame)) {if (frame.empty()){break;}flip(frame, frame, 1);//左右翻转imshow("video", frame);char c = waitKey(5);if (c == 27) { // ESC退出break;}}video.release();//释放资源	waitKey();return 0;
}

这篇关于【OpenCV基础】图像翻转、旋转变换、视频加载、摄像头调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

SpringBoot加载profile全面解析

《SpringBoot加载profile全面解析》SpringBoot的Profile机制通过多配置文件和注解实现环境隔离,支持开发、测试、生产等不同环境的灵活配置切换,无需修改代码,关键点包括配置文... 目录题目详细答案什么是 Profile配置 Profile使用application-{profil

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.