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

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

本次实验素材来源于: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;
}

效果

image.png

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》文件夹,点击运行

4.png

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图像和视频简单处理,后期会分享更多有趣物联网的操作从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。

 

目录
相关文章
|
2月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
126 1
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
544 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
56 4
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
519 3
|
2月前
|
编解码 关系型数据库 计算机视觉
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
本文介绍了如何在OpenCV中通过使用cisco开源的openh264库来解决不支持H.264编码的问题,并提供了完整的代码示例。
153 0
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
|
3月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
69 11
|
4月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
4月前
|
计算机视觉 索引
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
本文介绍了解决OpenCV读取视频失败的错误,指出问题通常由视频路径错误或摄像头索引错误导致,并提供了相应的解决方法。
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
|
3月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
32 3