【OpenCV学习】使用OpenCV打开图片视频
一.使用代码打开一张图片
代码如下:
#include <opencv.hpp>
int main() {
cv::Mat img = cv::imread("D://My Code/Test_OpenCV/test_2/test1.jpg");
if (img.empty()) {
return -1;
}
// 实现一个名称赋予窗口, 第二个参数,打开的新窗口会自动适应图片的大小
cv::namedWindow("Example1", cv::WINDOW_AUTOSIZE);
// 只要Mat对象中拥有一个图像结构,都可以通过imshow函数进行显示
cv::imshow("Example1", img);
// 告诉体统暂停并且等待键盘事件
// 如果参数大于0,它会等待等同于该参数的毫秒时间,然后继续执行程序
// 如果该参数被设置为0或者一个负数,程序将会无限等待直到有键按下
cv::waitKey(0);
// 让窗口自动销毁,关闭窗口并且释放掉相关联的内存空间
cv::destroyWindow("Example1");
return 0;
}
二.使用OpenCV打开一个视频
代码如下:
#include <opencv.hpp>
int main() {
cv::namedWindow("ExampleVideo", cv::WINDOW_AUTOSIZE);
// 视频读取结构
cv::VideoCapture cap;
// 打开文件, 视频读取结构通过一个绝对路径的字符串打开视频文件
cap.open("D://My Code/Test_OpenCV/test_2/test_video.mp4");
// 保存视频帧的结构
cv::Mat frame;
while (1) {
cap >> frame;
if (frame.empty()) {
break;
}
cv::imshow("ExampleVideo", frame);
// 一旦显示了这帧图片,会等到33毫秒
// 如果用户在这段时间内键盘有任何输入,则退出循环,反之则跳过并执行下一个循环
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_dontest = 0;
// 回调函数需要访问帧结构读取g_cap
cv::VideoCapture g_cap;
// pos表示当前的位置
void onTrackbarSlide(int pos, void*) {
// 使进度条移到新的位置
// 第一个参数表示想要帧集合的读取位置
g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);
// 判断程序是否进入单步模式
if (!g_dontest) {
g_run = 1;
}
g_dontest = 0;
}
int main() {
cv::namedWindow("暴风影音", cv::WINDOW_AUTOSIZE);
g_cap.open("D://My Code/Test_OpenCV/test_2/test_video.mp4");
// 打开视频之后,用g_cap.get()确定总帧数以及视频的高和宽
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 << "Videos has " << frames << " frames of dimensions( " << tmpw << " ," << tmph << " )" << endl;
// 创建一个滑动条
cv::createTrackbar("播放进度", "暴风影音", &g_slider_position, frames, onTrackbarSlide);
cv::Mat frame;
while (1) {
if (g_run != 0) {
g_cap >> frame;
if (frame.empty()) {
break;
}
int cur_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);
g_dontest = 1;
cv::setTrackbarPos("播放进度", "暴风影音", cur_pos);
cv::imshow("暴风影音", frame);
// 让视频正常播放
g_run -= 1;
}
char c = (char)cv::waitKey(10);
if (c == 's') {
g_run = 1;
cout << "Single step, run = " << g_run << endl;
}
if (c == 'r') {
g_run = -1;
cout << "Run Mode, run = " << g_run << endl;
}
if (c == 27) {
break;
}
}
return 0;
}
如图:
1.createTrackbar函数
openCV提供createTrackbar指定图像窗口创建一个指定名称和范围的滑动条,使用户能够滑动调整输入,然后根据输入值执行程序。还提供了getTrackbarPos和setTrackbarPos以获取和修改bar的当前值。
CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
- trackbarname:滑动空间的名称
- winname:滑动空间用于依附的图像窗口的名称
- value:初始化阈值
- count:滑动控件的刻度范围
- TrackbarCallback是回调函数, 函数定义如下:
typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata);
2.setTrackbarPos函数
void setTrackbarPos(const String& trackbarname, const String& winname, int pos)
- trackbarname:滑动条名称
- winname:窗口名称
- pos:新位置
3.getTrackbarPos函数(代码中未使用)
int getTrackbarPos(const String& trackbarname, const String& winname)
- trackbarname:滑动条名称
- winname:窗口名称
注:我的代码在vs2017下跑的,配置了OpenCV4.0