OpenCV学习笔记 HigiGUI库1.图像与视频的载入、显示和输出到文件

15 篇文章 0 订阅
4 篇文章 0 订阅

图像


Ⅰ.头文件相关

#include opencv2/opencv.hpp 可包含所有可能用到的OpenCV函数等,但会延长编译时间
从文件、视频和摄像头读入图像的函数包含在highgui内

Ⅱ.OpenCV使用的命名空间

cv

Ⅲ.具体使用的部分

	#include "opencv2/highgui/highgui.hpp"
	using namespace cv;
	int main( int argc, char** argv ) {
	 Mat img = imread( argv[1], -1 );
	 if( img.empty() ) return -1;
	 namedWindow( "Example1", cv::WINDOW_AUTOSIZE );
	 imshow( "Example1", img );
	 waitKey( 0 );
	 destroyWindow( "Example1" );
	}
①Mat类型
用于保存图像以及其他矩阵数据的数据结构
此处不作详解
②namedWindow()
void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE ); 
用于创建一个窗口
第一个参数为窗口的名称
第二个参数定义窗口的属性
flags = WINDOW_NORMAL;//用户可改变窗口大小
flags = WINDOW_AUTOSIZE;//系统自动根据图像调整窗口大小,用户不能改变
flags = WINDOW_OPENGL;//窗口创建时支持OpenGL
③imread()
Mat imread(const string& filename, int flags=1 );
用于读入图像文件
第一个参数为文件(路径)名
第二个参数自带缺省值1,可省略,意为载入三通道的彩色图像,其他该版本有效值如下

常用的三个第二个参数的值

IMREAD_UNCHANGED 		//或<0的值,表示原图不作任何修改读入
IMREAD_GRAYSCALE 		//0,表示将原图作为灰度图像读入
IMREAD_COLOR 			//>0,表示将原图作为RGB图像读入
可读入的文件类型:BMP, DIB, JPEG, JPE, PNG,PBM, PGM, PPM, SR, RAS, and TIFF.
返回一个Mat类型
可这样使用
Mat img = imread(argc[1], -1);
if(img.empty())
	return -1;
④imshow()
void imshow(const string& winname, InputArray mat);
用于在指定的窗口中显示图像。如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则,将图像进行缩放以适合窗口。
第一个参数为要显示图像的窗口的名称,若指定窗口不存在则创建一个
第二个参数为要显示的图像

注:参数中的InputArray是定义在core.hpp中的一个类,具体内容比较复杂,用到的话再作详解,目前可简单理解为Mat
⑤imwrite()
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() );
用于输出图像到文件

对生成的文件而言,只有是8位、16位的PNG、JPG、Tiff文件而且是单通道或三通道的BGR图像才可以用这种方式保存;保存PNG文件时可以保存透明通道

⑥waitKey()
int waitKey(int delay=0)
让程序停止并无限等待一个按键操作或延时
如果参数为正,会等待参数值的毫秒数,然后无论有无按键操作都会继续运行
如果参数为0或负数,则会无限时间地等待按键操作
返回值:
	若按键,则返回按键的ascii值(>=0)
	若在规定时间内未按键则返回-1
⑦destroyWindow()
void destroyWindow(const string& winname);
关闭窗口并释放所有相关内存占用
参数为窗口名
官方建议:
	短小的程序中可省略这一步
	但在更长、大型的程序中应注意将无用窗口关闭使其更整洁并避免内存泄漏
⑧比着葫芦画瓢的
	#include<opencv2/highgui.hpp>
	using namespace cv;
	int main()
	{
 	   Mat img = imread("aete.jpg");
 	   namedWindow("aertaier", WINDOW_AUTOSIZE);
 	   imshow("aertaier", img);
 	   waitKey(0);
 	   destroyWindow("aertaier");
 	   return 0;
	}

视频


显示视频与显示图像相类似,只需执行循环,依次逐帧显示即可

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
int main( int argc, char** argv ) {
 cv::namedWindow( "Example3", cv::WINDOW_AUTOSIZE );
 cv::VideoCapture cap;
 cap.open( string(argv[1]) );
 cv::Mat frame;
 for(;;) {
 cap >> frame;
 if( frame.empty() ) break; // Ran out of film
 cv::imshow( "Example3", frame );
 if( cv::waitKey(33) >= 0 ) break;
 }
 return 0;
}
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <fstream>
using namespace std;
int g_slider_position = 0;
int g_run = 1, g_dontset = 0; //start out in single step mode
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( 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", &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);
 if( c == 's' ) // single step
 {g_run = 1; cout << "Single step, run = " << g_run << endl;}
 if( c == 'r' ) // run mode
 {g_run = -1; cout << "Run mode, run = " << g_run <<endl;}
 if( c == 27 )
 break;
 }
 return(0);
}

Ⅰ.VideoCapture类

具体定义
class CV_EXPORTS_W VideoCapture
{
public:
        CV_WRAP VideoCapture();
        CV_WRAP VideoCapture(const String& filename, int apiPreference = CAP_ANY);
        CV_WRAP VideoCapture(int index, int apiPreference = CAP_ANY);
        virtual ~VideoCapture();
    
    CV_WRAP virtual bool open(const String& filename, int apiPreference = CAP_ANY);

    CV_WRAP virtual bool open(int index, int apiPreference = CAP_ANY);
    
    CV_WRAP virtual bool isOpened() const;
    
    CV_WRAP virtual void release();
    
    CV_WRAP virtual bool grab();
    
    CV_WRAP virtual bool retrieve(OutputArray image, int flag = 0);
    
    virtual VideoCapture& operator >> (CV_OUT Mat& image);

    virtual VideoCapture& operator >> (CV_OUT UMat& image);

    CV_WRAP virtual bool read(OutputArray image);

    CV_WRAP virtual bool set(int propId, double value);

    CV_WRAP virtual double get(int propId) const;

    CV_WRAP String getBackendName() const;

protected:
    Ptr<CvCapture> cap;
    Ptr<IVideoCapture> icap;
}

使用
①构造函数

VideoCapture有三个构造函数:

VideoCapture();
VideoCapture(const String& filename, int apiPreference = CAP_ANY);
VideoCapture(int index, int apiPreference = CAP_ANY);

第一个为默认构造函数
第二个是打开本地视频文件 或 捕捉设备 或 IP视频流,若读取本地视频文件则参数为文件路径
第三个是打开摄像头获取视频,index默认自带摄像头为0,其他一般为1

②open()

也可先创建一个VideoCapture型对象,再通过成员函数open()打开

VideoCapture cap;
cap.open("test.avi");
③isOpened()

判断是否成功打开,若成功则返回true

④将视频帧读取到cv::Mat对象中

有以下两种方式

Mat frame;
cap >> frame;
cap.read(frame);
⑤grab()
⑥retrieve()
⑦get()
⑧set()
⑨release()

关闭视频文件或摄像头,无返回值

Ⅱ.cv::createTrackbar()

Ⅲ.cv::setTrackbarPos()


参考

1.《Learning OpenCV 3》
2.【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析
3.OpenCV–VideoCapture类
4.opencv学习—VideoCapture 类基础知识
5.opencv笔记(三十三)——Video Capture使用示例。读取视频
6.《OpenCV3 编程入门》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值