欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习OpenCV(一)图像和视频的简易处理

程序员文章站 2022-05-29 09:21:17
...

利用Qt作为IDE,Qt+OpenCV环境配置在之前的博客中

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);
}

相关标签: 机器视觉