学习OpenCV(一)图像和视频的简易处理
程序员文章站
2022-05-29 09:21:17
...
利用Qt作为IDE,Qt+OpenCV环境配置在之前的博客中
本系列的目的是详解demo代码,快速学习OpenCV相关操作
显示图片
#include <opencv2/opencv.hpp>
int main( int argc, char** argv ) {
//imread()函数根据文件名确定要加载的文件格式,自动分配图像数据结构所需的内存
cv::Mat img = cv::imread(argv[1],-1);
if( img.empty() ) return -1;
//namedWindow()在屏幕创建一个窗口,将显示图片包含于该窗口
//窗口标题为Example1,第二个参数为窗口属性,窗口根据图像大小进行调整
cv::namedWindow( "Example1", cv::WINDOW_AUTOSIZE );
//在创建好的窗口中,显示img图像
cv::imshow( "Example1", img );
//使程序暂停,0或负数表示等待用户案件操作
cv::waitKey( 0 );
//销毁显示文件的窗口,同时释放内存
cv::destroyWindow( "Example1" );
return 0;
}
播放视频
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
int main( int argc, char** argv ) {
//创建一个窗口,命名为Example3
cv::namedWindow( "Example3", cv::WINDOW_AUTOSIZE );
//实例化一个对象cap
cv::VideoCapture cap;
//open()通过参数确定要读入的视频文件
cap.open( string(argv[1]) );
//实例化一个对象frame保存视频帧
cv::Mat frame;
//无限循环,与while(1)具有相同效果,在以前的编译器优化中for效率更高
for(;;) {
//逐帧读取
cap >> frame;
//帧中没有图像退出循环
if( frame.empty() ) break;
//显示读取的帧
cv::imshow( "Example3", frame );
//当前帧被显示,等待33ms
//这里设置33ms是简单假设每秒30帧,可以等待任意时间长度
//如果用户触发按键(ASCII码>=0),则退出循环,否则33ms后继续执行循环
if( cv::waitKey(33) >= 0 ) break;
}
return 0;
}
播放控制–增加滚动条
//播放控制--增加滚动条
//为了增加程序可读性,在全局变量前面加g_
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <fstream>
using namespace std;
//定义全局变量g_slider_positio,保持滑块位置
int g_slider_position = 0;
//g_run数字不为0时,显示新帧
int g_run = 1;
//保证在不触发单步模式是更新滑块的位置
int g_dontset = 0; // start out in single-step mode
//捕获对象,用于回调
cv::VideoCapture g_cap;
//参数pos为新的滑块位置
void onTrackbarSlide( int pos, void *) {
//set()函数可以配置cv::VideoCapture对象的属性,与之对应的是get()函数
//利用set()函数将视频推进到新的位置
//CAP_PROP_POS_FRAMES这个参数表示以帧数设置读入位置
g_cap.set( cv::CAP_PROP_POS_FRAMES, pos );
//在进入下一个新帧的时候进入单步模式
if( !g_dontset )
g_run = 1;
g_dontset = 0;
}
int main( int argc, char** argv ) {
cv::namedWindow( "Example2_4", cv::WINDOW_AUTOSIZE );
g_cap.open( string(argv[1]) );
//获取视频的帧数和长宽等信息
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;
//利用cv::createTrackbar创建滑动条的名称Position并且确定所属的窗口Example2_4
//frames为滑动条的最大值
//当滑动条被滑动时候的回调函数onTrackbarSlide
cv::createTrackbar("Position", "Example2_4", &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", "Example2_4", current_pos);
//显示滑动后当前位置的帧图像
cv::imshow( "Example2_4", frame );
g_run-=1;
}
//检查键盘输入
char c = (char) cv::waitKey(10);
//按下s进入单步模式
if( c == 's' ) // single step
{g_run = 1; cout << "Single step, run = " << g_run << endl;}
//按下r进入连续模式
if( c == 'r' ) // run mode
{g_run = -1; cout << "Run mode, run = " << g_run <<endl;}
//按下esc退出
if( c == 27 )
break;
}
return(0);
}
推荐阅读
-
图像处理和opencv:split和merge的用法
-
webrtc学习笔记五(视频流和datachannel一起使用的例子)
-
番外篇2.2:图像处理与深度学习-CNN的发展和结构
-
深度学习图像的一些处理--持续更新
-
webrtc学习笔记五(视频流和datachannel一起使用的例子)
-
荐 从零写一个具有IOC-AOP-MVC功能的框架---学习笔记---11. MVC功能之http请求处理器的编写---简易框架最后一公里!
-
[opencv自学笔记]读写图像、视频和几何图形的绘制
-
(三)OpenCV中的图像处理之形态转换和图像梯度
-
(三)OpenCV中的图像处理之canny边缘检测和图像金字塔
-
学习OpenCV(一)图像和视频的简易处理