目录
本次实验素材来源于: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;
}
效果
2. 视频分解为多个图片
将vid.cpp打开中main第一个改为main1函数(C++只允许一个main函数),修改main2为main,使用到的源文件是 《1.mp4》,注意路径调用,也需要新建《D:/cv/CvToPic/pic》文件夹,点击运行
代码
//视频分解为多个图片
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》文件夹,点击运行
代码
//将图片合成视频+文字
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图像和视频简单处理,后期会分享更多有趣物联网的操作从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。