【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学习】使用OpenCV打开图片视频

二.使用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;
}

如图:

【OpenCV学习】使用OpenCV打开图片视频

三.打开一个视频,并添加进度条

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

如图:

【OpenCV学习】使用OpenCV打开图片视频

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