图像
Ⅰ.头文件相关
#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 编程入门》