OpenCV初体验

OpenCV提供了一些实用工具来读取从视频流到摄像机画面的各种各样的图像格式,这些工具都是HighGUI的一部分。下面几个小例子可以让初学者提前体验一下OpenCV的功能。

1. 打开一张图像并且将其显示在屏幕上

#include "stdafx.h"
#include <opencv2/opencv.hpp>int main( int argc, char** argv )
{// 载入图像cv::Mat img = cv::imread("C:\\Users\\Bello\\Desktop\\test.jpg", -1);// 检查图像是否真的被载入,如果没有返回-1,结束程序if ( img.empty() ) return -1;// 由High GUI模块提供,会将一个名称赋给窗口,未来High GUI的和这个窗口的交互函数将由这个名称来指定要与哪个窗口交互。// 第二个参数说明了Windows的特性,这个可以设置为0(默认),也可设为cv::WINDOW_AUTOSIZE,窗口会在图像载入的时候// 自动缩放以适应图像的真实大小,也可能由用户自行调整。cv::namedWindow("Example1", cv::WINDOW_AUTOSIZE );// 将图像数据显示为图像,将建一个窗口(若不存在,会自动调用cv::namedWindow()新建窗口)。cv::imshow( "Example1", img );// 系统暂停并且等待键盘事件。// 如果传入了一个大于0的参数,它将会等待等同于该参数的毫秒数时间,然后继续执行程序。// 如果参数被设置为0或一个负数,程序将会无限等待知道有键被按下。cv::waitKey( 1000 );// 关闭窗口并释放掉相关联的内存空间cv::destroyWindow("Example1");return 0;
}

2. 播放视频文件

#include "stdafx.h"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>int main()
{cv::namedWindow( "Example3", cv::WINDOW_AUTOSIZE );// 视频读取结构cv::VideoCapture cap;// 视频读取结构通过传入字符串打开文件,这个字符串指示了想要打开的视频文件的路径。// 视频打开后,视频读取结构将会包含所有的关于这个视频文件可以读取的属性,包括状态信息。cap.open( "D:\\mgtv\\[高清]《妈妈是超人》第二季先导片:安吉“魔音”乱入吓哭小鱼儿 鬼马精灵包饺子实力坑妈.mp4" );// 声明一个可以保存视频帧的结构。cv::Mat frame;for ( ; ; ){// 按照帧从视频流中读取视频文件cap >> frame;// 检查是否读取成功if ( frame.empty() ){break;}// 显示图片cv::imshow("Example3", frame);// 等待33毫秒,在此等待时间内按任何键推出循环,若没有进行下一层循环。// 注:设置为33ms是因为这能让视频以30FPS的速度播放,并能允许用户在播放的时候打断。if(cv::waitKey(33) >= 0 ){break;}}cv::destroyWindow("Example3");return 0;
}

3. 加入了滑动条的基本浏览窗口

// example2-4.cpp: 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <fstream>using namespace std;// 全局变量,存储滑动条位置
int g_slider_position = 0;
// g_run为1进入单步模式;g_dontset用来避免调整进度条位置的时候触发单例模式
int g_run = 1, g_dontset = 0;
// 数据读取结构
cv::VideoCapture g_cap;// 用户调整滑动条时将触发的回调函数,来重新定位视频读取的位置
void onTrackbarSlide(int pos, void *) {// 根据滑动条位置重定向视频读取位置g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);if (!g_dontset)g_run = 1;g_dontset = 0;
}int main()
{cv::namedWindow("Example4", cv::WINDOW_AUTOSIZE );g_cap.open("D:\\mgtv\\[高清]《妈妈是超人》第二季先导片:安吉“魔音”乱入吓哭小鱼儿 鬼马精灵包饺子实力坑妈.mp4");// 确定总帧数int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);// 确定视频的宽度int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);// 确定视频的高度int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);// 输出视频的信息cout << "Video has " << frames << " frames of dimensions(" << tmpw << ", " << tmph << ")." << endl;// 创建滑动条,第一个参数是滑动条标签,第二个参数指定窗口,第三个参数是滑动条的初始位置,第四个参数是视频总帧数,第五个参数是回调函数,不要时可设置为0cv::createTrackbar("Position", "Example4", &g_slider_position, frames, onTrackbarSlide);cv::Mat frame;for (;;) {if (g_run != 0) {// 按帧从视频流中读取视频文件g_cap >> frame;if (frame.empty()){break;}// 获取当前帧集合读取的位置int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);g_dontset = 1;// 更新进度条位置,将触发回调函数cv::setTrackbarPos("Position", "Example4", current_pos);// 显示图片cv::imshow("Example4", frame);// 若为单步模式,那么此运算后g_run为0,则之后的循环无法进入该语句段;// 若为连续模式,那么此运算后g_run依旧不为0,所以可以连续播放视频。g_run -= 1;}// 从键盘输入获取值char c = (char)cv::waitKey(10);// 如果按键是s,则进入单步模式if (c == 's') {g_run = 1;cout << "Single step, run = " << g_run << endl;}// 如果按键是r,则恢复连续模式else if(c == 'r'){g_run = -1;cout << "Run mode, run = " << g_run << endl;}// 如果按键是esc,则退出播放else if(c == 27){break;}}return 0;
}

对于上述添加滑动条并实现单步模式和连续模式切换的代码,逻辑上有一点绕,具体分析如下:

① 初始状态,g_run=1,g_dontset=0,则采用单步模式。当第一次循环结束,g_run=0,g_dontset=0,则在不输入r、s或esc的情况下,不会进入视频读取的代码段,因此图片显示会停留在当前状态。

② 当按下“s”键后,g_run=1,g_dontset=0,和初始状态相同,则运行过程如①所示。

③ 当按下“r”键后,g_run=-1,g_dontset=0,采用连续模式。在每次循环后g_run减少1,则g_run永远是负值不为0,因此在没有其他操作情况下,会继续执行,实现连续播放。

④ 当手动调整进度条时,没有进入for循环中的if,所以g_dontset=0,此时则满足回调函数中的if条件,则g_run=1,g_dontset=0,和初始状态相同,采用单步模式继续进行。

⑤ 注意,在系统自动调用回调函数前g_dontset都被赋值为1,因此不会使得g_run=1,单步模式不会生效;只有当用户手动触发滑动条事件时,g_dontset=0,使得回调函数将g_run赋值为1,单步模式生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“CRISPR婴儿”计划疯狂重启 顶级科学家们表示无力阻止

来源&#xff1a; 生物通新的“CRISPR婴儿”计划启动&#xff0c;顶级科学人士感到震惊&#xff0c;却表示他们无力阻止它6月10日&#xff0c;俄罗斯分子生物学家Denis Rebrikov表示计划开展基因编辑婴儿实验&#xff0c;并公开了他将跨越“红线”的研究计划。两位有影响力的学…

写一些脚本的心得总结系列第3篇------同步数据到其他表

3.同步数据到其他表的。 这种又分插入和更新字段两种情况&#xff0c;除了sql方面的逻辑外&#xff0c;要考虑记录执行sql和变化前后数据记录。总是要做最坏的打算&#xff0c;一旦更新错了还能回滚数据。 比如在更新之前先记录被更新的数据记录到某表&#xff08;新建表&#…

PyMC3和Lasagne构建神经网络(ANN)和卷积神经网络(CNN)

转自http://www.sohu.com/a/162460147_505915 源地址https://twiecki.io/blog/2016/07/05/bayesian-deep-learning/ 今天&#xff0c;我们将使用Lasagne构建一个更有趣的模型&#xff0c;这是一个灵活的Theano图书馆&#xff0c;用于构建各种类型的神经网络。你可能知道&…

OpenCV高斯滤波GaussianBlur

图像处理中&#xff0c;常用的滤波算法有均值滤波、中值滤波以及高斯滤波等。 三种滤波器的对比滤波器种类基本原理特点均值滤波使用模板内所有像素的平均值代替模板中心像素灰度值易收到噪声的干扰&#xff0c;不能完全消除噪声&#xff0c;只能相对减弱噪声中值滤波计算模板内…

(附视频) | AI奠基人、美国AI科学家特伦斯谈深度学习​

来源&#xff1a;笑看国际风云特伦斯 谢诺夫斯基&#xff08;Terrence Sejnowski&#xff09;&#xff1a;世界十大人工智能科学家之一&#xff0c;还是美国仅3位在世的‘四院院士’之一&#xff0c;同时兼任全球人工智能顶级会议NIPS基金会主席。1989年&#xff0c;特伦斯加入…

Chapter 3.GDI/DirectDraw Internal Data Structures

说明&#xff0c;在这里决定跳过第二章&#xff0c;实在是因为里面涉及的内容太理论&#xff0c;对我而言又太艰深 3.1 HANDLES AND OBJECT-ORIRNTED PROGRAMMING In normal object-oriented programming practice,information hiding is achieved by declaring certain member…

OpenCV图像金字塔

图像金字塔是图像多尺度表达的一种&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低&#xff0c;且来源于同一张原始图的图像集合。其通过梯次向下采样获得&#xff0c;直到达到某个终止条件才停止采…

带你深入理解图灵机--天才所在的时代

来源&#xff1a;人机与认知实验室这几年由于区块链的大热&#xff0c;以太坊独特的solidity语言实现智能合约功能&#xff0c;图灵完备这个词走进大家的视线。没有计算机专业知识的同学其实很难理解这个词的意思&#xff0c;其实计算机专业的同学都没有深入理解图灵机&#xf…

用PyMC3进行贝叶斯统计分析(代码+实例)

问题类型1&#xff1a;参数估计 真实值是否等于X&#xff1f; 给出数据&#xff0c;对于参数&#xff0c;可能的值的概率分布是多少&#xff1f; 例子1&#xff1a;抛硬币问题 硬币扔了n次&#xff0c;正面朝上是h次。 参数问题 想知道 p 的可能性。给定 n 扔的次数和 h …

2015总结及2016计划

2015计划完成情况&#xff1a; 1.网站建起来&#xff08;未完成&#xff09; 2.发布一款游戏&#xff08;cocos2dx或u3d&#xff09;&#xff08;未完成&#xff09; 3.稳定一年工作&#xff08;完成&#xff09; 4.学习C或C&#xff0c;能够使用其中一种进行windows编程&#…

华为: 即将发布5G+VR的颠覆式智能眼镜

来源&#xff1a;VR每日必看6月27日MWC19上海期间&#xff0c;华为手机业务总裁何刚在全球终端峰会发表演讲&#xff0c;提及华为终端在5G时代的全场景战略是“18N”。“1”就是华为手机&#xff0c;“8”则囊括了TV、平板、PC、耳机、车机、手表、眼镜、音响八项终端产品&…

OpenCV的数据类型——基础数据类型

OpenCV有很多数据类型&#xff0c;从组织结构的角度来看&#xff0c;OpenCV的基础类型类型主要分为三类。第一类是直接从C原语中继承的基础数据类型&#xff1b;第二类是辅助对象&#xff1b;第三类是大型数据类型。本文主要介绍OpenCV的基础数据类型。 目录 Point类 Scalar…

Process finished with exit code -1073741819 (0xC0000005)

运行TensorFlow出现如下错误&#xff0c;尝试了很多网上的方法都不行&#xff0c;最后把代码中的中文路径改为英文后就解决了

LeetCode - Partition List

题目&#xff1a; Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example, Given 1-…

Cell:重大突破!三位学术大咖,打造全新“DNA显微镜”

来源&#xff1a;中国生物技术网传统上&#xff0c;科学家们使用光、X射线和电子来观察组织和细胞的内部。如今&#xff0c;科学家们能够在整个大脑中追踪线状的神经纤维&#xff0c;甚至可以观察活的小鼠胚胎如何产生原始心脏中的跳动细胞。但是这些显微镜无法看到的是&#x…

OpenCV的数据类型——辅助对象

在上一篇文章中&#xff0c;主要介绍了OpenCV的基础数据类型。接下来在本篇文章中将主要对OpenCV的辅助对象进行介绍。 cv::TermCriteria类 在很多算法中都存在着循环嵌套&#xff0c;只有满足终止条件时才会退出。通常情况下&#xff0c;终止条件的形式要么是达到允许的有限…

概率密度函数某一点的意义

在连续型随机变量的概率密度函数中&#xff0c;某一点的值不等于该点的概率值&#xff0c;就像不能计算汽车在某一点的速度&#xff0c;因为速度是距离除以时间&#xff0c;对某一点来说不存在距离的概念。如果要计算某一点x的概率的话&#xff0c;就要对x取邻域&#xff08;无…

eclipse中monokai插件的安装

eclipse中monokai插件的安装转载于:https://www.cnblogs.com/zhujiabin/p/5099675.html

Science Robotics近日刊登CMU重大突破,无需手术,普通人就能用意念操控机械臂!...

来源&#xff1a;机器人大讲堂导读顶尖学术期刊《科学》旗下的Science Robotics本月19号刊登了脑机接口&#xff08;BCI&#xff09;领域的一项突破成果。美国卡内基梅隆大学的贺斌教授带领其研究团队与明尼苏达大学合作&#xff0c;成功开发出第一款非侵入式的意念控制机械臂&…

使用pymc3可能遇到的问题及解决方法

PyMC3机器学习库&#xff0c;基于heano, NumPy, SciPy, Pandas, 和 Matplotlib。 安装 pip install pymc3&#xff0c;pip命令可以安装pymc3并安装其依赖库 首次运行报错 这可能是缺少某些依赖库导致的&#xff0c;根据报错信息安装即可 运行出现一长串c代码&#xff0c;或…