本人c++小白,初学opencv,如您对代码有更好的意见。欢迎斧正!
VideoCapture 类提供了C++ API,主要用来处理视频文件、图像序列或者摄像机实时拍摄的画面
先来了解VideoCapture的各种API φ(≧ω≦)♪*
VideoCapture();//默认的构造函数
VideoCapture (const String &filename);//打开视频文件或者摄像设备或者IP视频流VideoCapture (const String &filename, int
apiPreference);使用API来打开视频文件或者摄像设备或者IP视频流VideoCapture (int index);//打开摄像机
virtual ~VideoCapture ();//析构函数
virtual double get (int propId) const;//获取视频的一些属性
virtual bool grab ();// 提取视频的下一帧
virtual bool isOpened () const;// 确认视频捕捉已初始化
virtual bool open (const String &filename);//打开视频文件或者摄像设备或者IP视频流
virtual bool open (int index);//打开摄像机
bool open (int cameraNum, int apiPreference);//打开摄像机
virtual bool open (const String &filename, int
apiPreference);//使用API来打开视频文件或者摄像设备或者IP视频流virtual VideoCapture & operator>> (Mat &image);// 使用流运算符来读取视频下一帧;
virtual VideoCapture & operator>> (UMat &image);// 使用流运算符来读取视频下一帧;
virtual bool read (OutputArray image);// 提取、解码并返回视频下一帧
virtual void release ();// 关闭视频或捕捉设备
virtual bool retrieve (OutputArray image, int
flag=0);//解码并返回所提取的视频帧virtual bool set (int propId, double value);// 设置属性
下面总结一下通用属性标识符(比较全)
问题来了,那么如何实现滑动条呢?(⊙⊙?)
来了解几个函数
int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange=0, void*userdata=0)
void setTrackbarPos(const String& trackbarname, const String& winname, int pos)
void setTrackbarPos(const String& trackbarname, const String& winname, int pos)
想实现滑动条还需有一个重要的函数O(∩_∩)O (从下方代码中理解)
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
可以得到该视频的总帧数为675,每帧宽度为720,高度为1280.
#include
#include
using namespace cv;
using namespace std;
int g_slider_position = 0;//全局变量,用于creatTrackbar()函数中的第三个参数,初始化阈值
VideoCapture g_cap;//创建VideoCapture类对象g_cap
//回调函数
void onTrackbarSlide(int pos, void*) {
g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);//设置属性
}
int main() {
cv::namedWindow("pipihan21", CV_WINDOW_NORMAL);//创建窗口
g_cap.open("C:/Users/xihua/Videos/Captures/动漫.avi");//读取视频
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("阈值", "pipihan21", &g_slider_position, frames, onTrackbarSlide);//creatTrackbar()函数实现滑动条的创建
cv::Mat frame;//定义一个Mat类对象frame,用于储存每一帧图像
while (1) {
g_cap >> frame;//读取当前帧
if (frame.empty())//判断当前帧是否为空
break;
int current_pos = (int)g_cap.get(CAP_PROP_POS_FRAMES);//获取滑条的当前位置
setTrackbarPos("阈值", "pipihan21", current_pos);//设置滑动条的新位置,从而实现滑动条的跟随
imshow("pipihan21", frame);//显示图像
char c = (char)cv::waitKey(33);//若33毫秒内按下键,字符c储存该键
if (c == 27) //“Esc”的ASKII为27
{
destroyWindow("pipihan21");//销毁窗口
cout << "成功销毁窗口" << endl;
break;
}
}
cv::destroyWindow("pipihan21");
cout << "成功销毁窗口" << endl;
return 0;
}