【基于VS C++的Opencv图像和视频简单处理】

本文介绍了使用OpenCV在C++环境下进行视频和图像操作的实验,包括显示图像、视频分解为图片、图片合成视频、添加文字、视频读取与保存。实验详细展示了代码实现过程,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 测试环境

2. 视频分解为多个图片

3. 多个图片合成视频

4. 将图片合成视频+文字

5. 视频读取与保存为视频

6. 总结


 

本次实验素材来源于:Opencv在C++上运行视频和图片操作

1. 测试环境

为了测试环境是否安装正常,首先将vid.cpp打开,然后运行,先显示一下lena图像吧!

代码

// vid.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<opencv.hpp>
#include<highgui.hpp>
#include<core.hpp>
#include<imgproc.hpp>
#include <stdio.h>

using namespace cv;
using namespace std;

//显示lena
int main()
{
	cv::Mat img = cv::imread("lena.png");
	cv::imshow("test", img);
	cv::waitKey(0);
	return 0;
}

效果

e6057ecf1a614f7a958b83b2b4ceba18.png

2. 视频分解为多个图片

将vid.cpp打开中main第一个改为main1函数(C++只允许一个main函数),修改main2为main,使用到的源文件是 《1.mp4》,注意路径调用,也需要新建《D:/cv/CvToPic/pic》文件夹,点击运行

9dbe07aed64c47c2ad201f31011b1375.png

 

代码

//视频分解为多个图片
int main()
{


	VideoCapture cap;

	cap.set(3, 300);

	cap.open("1.mp4");
	if (!cap.isOpened())
		std::cout << "not opened";

	Mat frame;
	int i = 0;
	char c;

	char filename[100];


	namedWindow("v窗口", WINDOW_NORMAL);
	namedWindow("v窗口", WINDOW_AUTOSIZE);
	moveWindow("v窗口", 20, 20);
	resizeWindow("v窗口", 512, 512);

	while (1)
	{

		cap >> frame;
		if (frame.empty())
		{
			std::cout << "empty";
			break;
		}
		//f.copyTo(segm);
		//cv::flip(segm, segm, 1);

		//if (i > 0)
		imshow("v窗口", frame);
		i++;
		sprintf_s(filename, "D:/cv/CvToPic/pic/w%d.jpg", i);
		c = waitKey(30);
		imwrite(filename, frame);
		if (c == 27) break;
	}
	cap.release();
	return 1;

}

3. 多个图片合成视频

将vid.cpp打开中main第一个改为main2函数(C++只允许一个main函数),修改main3为main,使用到的源文件是 《1.mp4》,注意路径调用,也需要新建《D:/cv/CvToPic/pic》文件夹,点击运行

代码

//多个图片合成视频
int main()
{


	int j = 0;
	char c;
	Mat img;
	VideoWriter writer;

	img = imread("D:/cv/CvToPic/pic/w1.jpg");
	bool isColor = (img.type() == CV_8UC3);
	int code = VideoWriter::fourcc('M', 'J', 'P', 'G');


	Mat cimg = imread("D:/cv/CvToPic/2.jpg");
	resize(cimg, cimg, img.size(), 0, 0, 0);

	double fps = 25.0;
	writer.open("D:/cv/CvToPic/vi/out1.avi", code, fps, img.size(), isColor);

	char filename[100];
	char s[100];

	namedWindow("v窗口", WINDOW_NORMAL);
	namedWindow("v窗口", WINDOW_AUTOSIZE);
	moveWindow("v窗口", 20, 20);
	resizeWindow("v窗口", 512, 512);

	for (j = 400; j > 2; j--)
	{
		sprintf_s(filename, "D:/cv/CvToPic/pic/w%d.jpg", j);
		img = imread(filename);
		writer.write(img);


		//sprintf_s(s, "moveint text page=%d", j);

		if (j % 40 == 0)
		{
			for (int a = 0; a < 20; a++)
				writer.write(cimg);
			//putText(cimg, s, Point(1 + j, 100), 2, 1, Scalar(200, 200, 200));
			imshow("v窗口", cimg);
		}
		else
		{
			//putText(img, s, Point(1 + j, 100), 2, 1, Scalar(200, 200, 200));
			imshow("v窗口", img);
		}



		c = waitKey(100);
		if (c == 27) break;

	}/**/
	return 1;

}

4. 将图片合成视频+文字

将vid.cpp打开中main第一个改为main3函数(C++只允许一个main函数),修改main4为main,使用到的源文件是 《1.mp4》和《2.jpg》,注意路径调用,也需要新建《D:/cv/CvToPic/pic》文件夹,点击运行

db2c54357f2341a3a11bf54a44ed1df5.png

 

代码

//将图片合成视频+文字
int main()
{
	int j = 0;
	char c;
	Mat img;
	VideoWriter writer;

	img = imread("D:/cv/CvToPic/pic/w1.jpg");
	bool isColor = (img.type() == CV_8UC3);
	int code = VideoWriter::fourcc('M', 'J', 'P', 'G');

	double fps = 25.0;
	writer.open("D:/cv/CvToPic/vi/out2.avi", code, fps, img.size(), isColor);

	char filename[100];
	char s[100];

	namedWindow("v窗口", WINDOW_NORMAL);
	namedWindow("v窗口", WINDOW_AUTOSIZE);
	moveWindow("v窗口", 20, 20);
	resizeWindow("v窗口", 512, 512);

	for (j = 200; j > 2; j--)
	{
		sprintf_s(filename, "D:/cv/CvToPic/pic/w%d.jpg", j);
		img = imread(filename);
		writer.write(img);
		//putText(img, "hhhhh", Point(1+j, 1+j), 2, 1, Scalar(200, 200, 200));

		sprintf_s(s, "dddddd/w%d.jpg", j);
		//putText(img, "moving text", Point(1+j, 100), 2, 1, Scalar(200, 200, 200));
		putText(img, s, Point(1 + j, 100), 2, 1, Scalar(200, 200, 200));
		imshow("v窗口", img);
		c = waitKey(900);
		if (c == 27) break;

	}
	return 1;

}

5. 视频读取与保存为视频

将vid.cpp打开中main第一个改为main4函数(C++只允许一个main函数),修改main5为main,使用到的源文件是 《1.mp4》,注意路径调用,也需要新建《D:/cv/CvToPic/pic》文件夹,点击运行

代码

//视频读取与保存为视频
int main()
{
	VideoCapture cap;
	Mat frame;
	VideoWriter writer;

	cap.open("1.mp4");

	if (!cap.isOpened())
		std::cout << "not opened";

	cap >> frame;
	if (frame.empty())
	{
		cout << "真错误是的这里啊" << endl;
		return -1;
	}

	int  w, h;
	w = cap.set(3, 400);
	h = cap.set(4, 600);
	namedWindow("v窗口", WINDOW_NORMAL);
	namedWindow("v窗口", WINDOW_AUTOSIZE);
	moveWindow("v窗口", 20, 20);
	resizeWindow("v窗口", 512, 512);

	bool isColor = (frame.type() == CV_8UC3);
	int code = VideoWriter::fourcc('M', 'J', 'P', 'G');
	double fps = 25.0;
	writer.open("D:/cv/CvToPic/vi/out3.avi", code, fps, frame.size(), isColor);
	int i = 0;
	char c;

	while (1)
	{
		if (!cap.read(frame))
		{
			std::cout << "empty";
			break;
		}

		i++;
		c = waitKey(100);
		writer.write(frame);
		imshow("v窗口", frame);

		if (c == 27) break;
	}
	cap.release();
	return 1;
}

完整代码

// vid.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<opencv.hpp>
#include<highgui.hpp>
#include<core.hpp>
#include<imgproc.hpp>
#include <stdio.h>

using namespace cv;
using namespace std;

//显示lena
int main()
{
	cv::Mat img = cv::imread("lena.png");
	cv::imshow("test", img);
	cv::waitKey(0);
	return 0;
}

//视频分解为多个图片
int main2()
{


	VideoCapture cap;

	cap.set(3, 300);

	cap.open("1.mp4");
	if (!cap.isOpened())
		std::cout << "not opened";

	Mat frame;
	int i = 0;
	char c;

	char filename[100];


	namedWindow("v窗口", WINDOW_NORMAL);
	namedWindow("v窗口", WINDOW_AUTOSIZE);
	moveWindow("v窗口", 20, 20);
	resizeWindow("v窗口", 512, 512);

	while (1)
	{

		cap >> frame;
		if (frame.empty())
		{
			std::cout << "empty";
			break;
		}
		//f.copyTo(segm);
		//cv::flip(segm, segm, 1);

		//if (i > 0)
		imshow("v窗口", frame);
		i++;
		sprintf_s(filename, "D:/cv/CvToPic/pic/w%d.jpg", i);
		c = waitKey(30);
		imwrite(filename, frame);
		if (c == 27) break;
	}
	cap.release();
	return 1;

}

//多个图片合成视频
int main3()
{


	int j = 0;
	char c;
	Mat img;
	VideoWriter writer;

	img = imread("D:/cv/CvToPic/pic/w1.jpg");
	bool isColor = (img.type() == CV_8UC3);
	int code = VideoWriter::fourcc('M', 'J', 'P', 'G');


	Mat cimg = imread("D:/cv/CvToPic/2.jpg");
	resize(cimg, cimg, img.size(), 0, 0, 0);

	double fps = 25.0;
	writer.open("D:/cv/CvToPic/vi/out1.avi", code, fps, img.size(), isColor);

	char filename[100];
	char s[100];

	namedWindow("v窗口", WINDOW_NORMAL);
	namedWindow("v窗口", WINDOW_AUTOSIZE);
	moveWindow("v窗口", 20, 20);
	resizeWindow("v窗口", 512, 512);

	for (j = 400; j > 2; j--)
	{
		sprintf_s(filename, "D:/cv/CvToPic/pic/w%d.jpg", j);
		img = imread(filename);
		writer.write(img);


		//sprintf_s(s, "moveint text page=%d", j);

		if (j % 40 == 0)
		{
			for (int a = 0; a < 20; a++)
				writer.write(cimg);
			//putText(cimg, s, Point(1 + j, 100), 2, 1, Scalar(200, 200, 200));
			imshow("v窗口", cimg);
		}
		else
		{
			//putText(img, s, Point(1 + j, 100), 2, 1, Scalar(200, 200, 200));
			imshow("v窗口", img);
		}



		c = waitKey(100);
		if (c == 27) break;

	}/**/
	return 1;

}

//将图片合成视频+文字
int main4()
{
	int j = 0;
	char c;
	Mat img;
	VideoWriter writer;

	img = imread("D:/cv/CvToPic/pic/w1.jpg");
	bool isColor = (img.type() == CV_8UC3);
	int code = VideoWriter::fourcc('M', 'J', 'P', 'G');

	double fps = 25.0;
	writer.open("D:/cv/CvToPic/vi/out2.avi", code, fps, img.size(), isColor);

	char filename[100];
	char s[100];

	namedWindow("v窗口", WINDOW_NORMAL);
	namedWindow("v窗口", WINDOW_AUTOSIZE);
	moveWindow("v窗口", 20, 20);
	resizeWindow("v窗口", 512, 512);

	for (j = 200; j > 2; j--)
	{
		sprintf_s(filename, "D:/cv/CvToPic/pic/w%d.jpg", j);
		img = imread(filename);
		writer.write(img);
		//putText(img, "hhhhh", Point(1+j, 1+j), 2, 1, Scalar(200, 200, 200));

		sprintf_s(s, "dddddd/w%d.jpg", j);
		//putText(img, "moving text", Point(1+j, 100), 2, 1, Scalar(200, 200, 200));
		putText(img, s, Point(1 + j, 100), 2, 1, Scalar(200, 200, 200));
		imshow("v窗口", img);
		c = waitKey(900);
		if (c == 27) break;

	}
	return 1;

}

//视频读取与保存为视频
int main5()
{
	VideoCapture cap;
	Mat frame;
	VideoWriter writer;

	cap.open("1.mp4");

	if (!cap.isOpened())
		std::cout << "not opened";

	cap >> frame;
	if (frame.empty())
	{
		cout << "真错误是的这里啊" << endl;
		return -1;
	}

	int  w, h;
	w = cap.set(3, 400);
	h = cap.set(4, 600);
	namedWindow("v窗口", WINDOW_NORMAL);
	namedWindow("v窗口", WINDOW_AUTOSIZE);
	moveWindow("v窗口", 20, 20);
	resizeWindow("v窗口", 512, 512);

	bool isColor = (frame.type() == CV_8UC3);
	int code = VideoWriter::fourcc('M', 'J', 'P', 'G');
	double fps = 25.0;
	writer.open("D:/cv/CvToPic/vi/out3.avi", code, fps, frame.size(), isColor);
	int i = 0;
	char c;

	while (1)
	{
		if (!cap.read(frame))
		{
			std::cout << "empty";
			break;
		}

		i++;
		c = waitKey(100);
		writer.write(frame);
		imshow("v窗口", frame);

		if (c == 27) break;
	}
	cap.release();
	return 1;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

注意细节:

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
 

6. 总结

        本文完成了基于VS C++的Opencv图像和视频简单处理,后期会分享更多有趣物联网的操作从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2345VOR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值