1.影像图片分帧并保存(按照自己设计的帧率),然后将图片裁剪为所需要的大小

//视频分帧
#include <opencv2/opencv.hpp>
#include <tchar.h>?
#include <stdio.h> ?
#include <iostream> ?
#include <math.h> ?
#include <ostream>?using namespace std;
using namespace cv;void main()
{//类VideoCapture实例化再初始化//VideoCapture capture;//capture.open("Megamind.avi");//类VideoCapture实例化的同时初始化VideoCapture capture("G:\\建筑垃圾再生料数据集\\5segment\\vedio2.mp4");if (!capture.isOpened()){return;}int frameRate = 5; //帧数截取间隔(每隔100帧截取一帧)int imgIndex = 18938;for (;;){Mat frame;capture >> frame;if (frame.empty()){break;}if (imgIndex % frameRate == 0){imshow("帧图", frame);char* imageSaveName = new char[200];//将图片的路径及名称输入到imageSaveName中//sprintf(imageSaveName, "F:\\2020.6.22照片\\双目相机照片\\%05d.jpg", imgIndex);sprintf(imageSaveName, "G:\\建筑垃圾再生料数据集\\5segment\\原图\\%06d.png", int(imgIndex/ frameRate);//将每一帧图像frame保存到imageSaveName指定的文件中imwrite(imageSaveName, frame);//裁剪图片Mat temp;temp = frame;string s = "G:\\建筑垃圾再生料数据集\\5segment\\240_240\\" + to_string(int(imgIndex/ frameRate)) + ".png";resize(temp, temp, Size(240, 240));imwrite(s, temp);delete[] imageSaveName;}imgIndex++;}cout << "total frames: " << imgIndex << endl;
}

2.批量图像数据增强

1)生成文件夹下图片的路径txt文件

点击win+R,输入cmd打开命令提示符窗口,输入cd F:\face_recognition_database\testset进入到指定目录(路径为图片的路径),再输入F:按回车即可看到当前所在路径,再输入dir /b/s/p/w *.png>inputimage.txt生成包含testset文件夹下所有图片文件名的文本文件(inputimage为该文本文件的文件名),如下图。其中png可以更改为jpg等格式

对于文件夹中有多种类型的图片,可以分别记录其路径,最后将路径合并在一个文件夹即可

dir /b/s/p/w *.jpeg>inputimage_jpeg.txt

dir /b/s/p/w *.jpg>inputimage_jpg.txt

dir /b/s/p/w *.png>inputimage_png.txt

2)批量镜像处理后,垂直和水平翻转(若没有裁剪加上裁剪)

#define _CRT_SECURE_NO_WARNINGS
#include<opencv2\opencv.hpp>
#include<iostream>
#include<vector>
#include<fstream>using namespace std;
using namespace cv;
int GetTxtLine(const char *filename);
int main() {string ss;ifstream fin("G:\\建筑垃圾再生料数据集\\disqualification\\原图\\inputimage.txt");int i =0;while (getline(fin, ss)){if (ss.length() != 0) {Mat temp = imread(ss,1);       string s = "G:\\建筑垃圾再生料数据集\\disqualification\\240_240\\"+ to_string(i) + ".png";cout << s << endl;i=i+2;resize(temp, temp, Size(240, 240));imwrite(s, temp);           // 垂直和水平翻转cv::Mat resultImage;cv::flip(temp, resultImage, -1);string s_1 = "G:\\建筑垃圾再生料数据集\\disqualification\\240_240\\" + to_string(i-1) + ".png";cout << s_1 << endl;imwrite(s_1, resultImage);imshow("图", resultImage);}else{break;}}waitKey(0);getchar();return 0;
}

还可以加上旋转角度等函数

// 对图像进行旋转函数,默认为顺时针方向
Mat rotateImage(Mat img, int degree)
{degree = -degree;//warpAffine默认的旋转方向是逆时针,所以加负号表示转化为顺时针double angle = degree  * CV_PI / 180.; // 弧度  double a = sin(angle), b = cos(angle);int width = img.cols;int height = img.rows;int width_rotate = int(height * fabs(a) + width * fabs(b));int height_rotate = int(width * fabs(a) + height * fabs(b));//旋转数组map// [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]// [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]float map[6];Mat map_matrix = Mat(2, 3, CV_32F, map);// 旋转中心CvPoint2D32f center = cvPoint2D32f(width / 2, height / 2);CvMat map_matrix2 = map_matrix;cv2DRotationMatrix(center, degree, 1.0, &map_matrix2);//计算二维旋转的仿射变换矩阵map[2] += (width_rotate - width) / 2;map[5] += (height_rotate - height) / 2;Mat img_rotate;//对图像做仿射变换//CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。//如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.//CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,warpAffine(img, img_rotate, map_matrix, Size(width_rotate, height_rotate), 1, 0, 0);return img_rotate;
}

3.对于数据集特别少的,可以将图片先裁剪为几个部分,在对图像进行图像增强操作

3-1)图像裁剪和缩放

#include <opencv2/core/core.hpp>
#include "opencv2/opencv.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
using namespace std;
using namespace cv;
//出现to_string重载时的模板!
#include <string>
#include <type_traits>
namespace std
{template<typename T>typename enable_if<is_convertible<T, _Longlong>::value, string>::type     to_string(T rhs){return to_string(static_cast<_Longlong>(rhs));}
}
int main()
{       //设置分割后图像存储路径string outpath = "G:\\建筑垃圾再生料数据集\\7segment\\图像增强\\";Mat img = imread("G:\\建筑垃圾再生料数据集\\7segment\\原图\\14.jpg"); //将图像放在项目工程里,使用imread函数读取int t = 0;int m = cvFloor(img.cols / (240 * 4));    //m*n是切割后子图像的个数int n = cvFloor(img.rows / (240 * 4)); //cvFloor()不大于参数的最小整数值Vector<Mat> ceil_img;  //迭代器ceil_img存储子图像Vector<int> name;     //迭代器name存储子图像的名字,从0到m*n-1for (t; t < m*n; t++)name.push_back(t);Mat image_cut, roi_img, tim_img;for (int j = 0; j <n; j++){for (int i = 0; i < m; i++){Rect rect(i * 960, j * 960, 960, 960);image_cut = Mat(img, rect);roi_img = image_cut.clone();resize(roi_img, roi_img, Size(240, 240));ceil_img.push_back(roi_img);}}for (int t = 0; t < m*n; t++)imwrite(outpath + to_string(name[t]+13*12) + ".png", ceil_img[t]);return 0;
}

3-2)图像批量增强

//图像批量增强
#define _CRT_SECURE_NO_WARNINGS
#include<opencv2\opencv.hpp>
#include<iostream>
#include<vector>
#include<fstream>using namespace std;
using namespace cv;Mat rotateImage(Mat img, int degree);int main() {string ss;ifstream fin("G:\\建筑垃圾再生料数据集\\7segment\\图像增强\\inputimage.txt");int i = 0;while (getline(fin, ss)){if (ss.length() != 0) {//1保留原图Mat temp = imread(ss, 1);string s_1 = "G:\\建筑垃圾再生料数据集\\7segment\\240_240\\" + to_string(i) + ".png";cout << s_1 << endl;imwrite(s_1, temp);//2水平翻转        i = i+1;Mat resultImage2;flip(temp, resultImage2, 1);string s_2 = "G:\\建筑垃圾再生料数据集\\7segment\\240_240\\" + to_string(i) + ".png";cout << s_2 << endl;imwrite(s_2, resultImage2);//3垂直翻转i = i + 1;Mat resultImage3;flip(temp, resultImage3, 0);string s_3= "G:\\建筑垃圾再生料数据集\\7segment\\240_240\\" + to_string(i) + ".png";cout << s_3 << endl;imwrite(s_3, resultImage3);//4垂直和水平翻转i = i + 1;Mat resultImage4;flip(temp, resultImage4, -1);string s_4 = "G:\\建筑垃圾再生料数据集\\7segment\\240_240\\" + to_string(i) + ".png";cout << s_4 << endl;imwrite(s_4, resultImage4);//5镜像顺时针45度i = i + 1;Mat img_shun45 = rotateImage(temp, 45);resize(img_shun45, img_shun45, cv::Size(224, 224), cv::INTER_LINEAR);string s_5 = "G:\\建筑垃圾再生料数据集\\7segment\\240_240\\" + to_string(i) + ".png";cout << s_5 << endl;imwrite(s_5, img_shun45);//6镜像顺时针135度i = i + 1;Mat img_shun135 = rotateImage(temp, 135);resize(img_shun135, img_shun135, cv::Size(224, 224), cv::INTER_LINEAR);string s_6 = "G:\\建筑垃圾再生料数据集\\7segment\\240_240\\" + to_string(i) + ".png";cout << s_6 << endl;imwrite(s_6, img_shun135);//7镜像顺时针225度i = i + 1;Mat img_shun225 = rotateImage(temp, 225);resize(img_shun225, img_shun225, cv::Size(224, 224), cv::INTER_LINEAR);string s_7 = "G:\\建筑垃圾再生料数据集\\7segment\\240_240\\" + to_string(i) + ".png";cout << s_7 << endl;imwrite(s_7, img_shun225);}else{break;}}waitKey(0);getchar();return 0;
}// 对图像进行旋转函数,默认为顺时针方向
Mat rotateImage(Mat img, int degree)
{degree = -degree;//warpAffine默认的旋转方向是逆时针,所以加负号表示转化为顺时针double angle = degree  * CV_PI / 180.; // 弧度double a = sin(angle), b = cos(angle);int width = img.cols;int height = img.rows;int width_rotate = int(height * fabs(a) + width * fabs(b));int height_rotate = int(width * fabs(a) + height * fabs(b));//旋转数组map// [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]// [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]float map[6];Mat map_matrix = Mat(2, 3, CV_32F, map);// 旋转中心CvPoint2D32f center = cvPoint2D32f(width / 2, height / 2);CvMat map_matrix2 = map_matrix;cv2DRotationMatrix(center, degree, 1.0, &map_matrix2);//计算二维旋转的仿射变换矩阵map[2] += (width_rotate - width) / 2;map[5] += (height_rotate - height) / 2;Mat img_rotate;//对图像做仿射变换//CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。//如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.//CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,warpAffine(img, img_rotate, map_matrix, Size(width_rotate, height_rotate), 1, 0, 0);return img_rotate;
}

4.批量对文件进行加前缀操作,区分各类图像

#include<opencv2\opencv.hpp>
#include<iostream>using namespace std;
using namespace cv;vector<Mat> RenamePic(cv::String Path);int main()
{cv::String Path = "G:\\建筑垃圾再生料数据集\\7segment\\240_240\\*.png";vector<Mat> images = RenamePic(Path);return 0;
}vector<Mat> RenamePic(cv::String Path)
{vector<cv::String> filenames;glob(Path, filenames, false);vector<Mat> images;size_t count = filenames.size();for (size_t i = 0; i < count; i++){stringstream str;str <<"7segment-"<< i << ".png";string img_path = "G:\\建筑垃圾再生料数据集\\7segment\\111\\";imwrite(img_path + str.str(), imread(filenames[i]));}return images;
}

Opencv c++从影像分帧开始,制作数据集相关推荐

  1. 将视频分帧后用于制作图片数据集方法

    简介 进行图片数据的制作是我们进行AI实践的必须操作,除了公开的官方数据集,我们自己制作数据集将会是更好的方法.在这里我将介绍用一种方法来制作图片数据集:先拍个视频然后把视频转化成图片.用ffmpeg ...

  2. 【手把手带你入门深度学习之150行代码的汉字识别系统】学习笔记 ·001 用OpenCV制作数据集

    立即学习:https://edu.csdn.net/course/play/24719/279505?utm_source=blogtoedu 目录 一.制作数据集代码 二.思路总结 1.数据集目录的 ...

  3. python 批量视频编辑_python实现批量视频分帧、保存视频帧

    本篇博客介绍利用python脚本实现视频分帧,并将每一帧保存到本地.主要基于opencv包来实现,在运行代码前确保opencv包已正确安装.下面是主要代码: import os import cv2 ...

  4. OpenCV C++案例实战二十一《制作视频播放器》

    OpenCV C++案例实战二十一<制作视频播放器> 前言 一.源码 二.效果 总结 前言 本文将使用OpenCV C++ 制作简易视频播放器,用于实现视频播放基本功能. 1.通过创建滑动 ...

  5. Python对视频进行分帧保存图片

    原文地址 分类目录--万能的Python系列 直接上程序,注释说明 import cv2 import os from application.processbar.progressbar impor ...

  6. 基于MATLAB的语音信号的时域特性分析(一)——分帧、窗函数

      语音信号是一个非稳态的.时变的信号.但在"短时间"范围内可以认为语音信号是稳态的.时不变的.这个短时间一般值10~30ms.由于有这个特性,故常把语音信号称为"准稳态 ...

  7. 语音信号的分帧加窗的matlab实现

    [x,fs,nbits]=wavread('5_1.wav'); x1=enframe(x,200,100);%分帧 x2=enframe(x,hamming(200),100);%加窗 figure ...

  8. 音频处理四:(音频的分帧)

    程序设计四:音频的分帧 一:需求分析 为了分析读人数据,通常进行分帧处理.在分帧中,往往设置在相邻两帧之间有一部分重叠.其原因是:语音信号是时变的,在短时范围内特征变化较小,所以作为稳态来处理;但超出 ...

  9. python快速检测视频跳过帧_python实现视频分帧效果

    本文实例为大家分享了python实现视频分帧的具体代码,供大家参考,具体内容如下 import cv2 vidcap = cv2.VideoCapture('005.avi') success,ima ...

最新文章

  1. Java fork join ForkJoinPool 用法例子
  2. 《Hadoop权威指南》第二章 关于MapReduce
  3. java中注解的使用与实例(一)
  4. python模块之 paramiko(转载)
  5. 数据大牛都在啃的10本书
  6. Panoptic Segmentation论文笔记
  7. 华为鸿蒙怎么体验,华为鸿蒙 HarmonyOS 2.0 发布,教你如何升级体验
  8. 算法----字符串拷贝
  9. Linux安装的分区问题
  10. 获取阿里云播放器当前播放速率
  11. SIP协议详解(二)
  12. Unity快速搭建城市场景
  13. 【足迹C++primer】51、面向对象编程概述
  14. 蜂鸣器驱动电路中二极管的作用
  15. 史上最全Maven教程(四)
  16. 百度目前开放的AI平台
  17. LeetCode 区间子数组个数
  18. 从零开始学python第12天,每天至少半小时
  19. creo2.0安装方法
  20. 第1个ARM裸板程序及引申(第004节_汇编与机器码)【修改机器码点亮led2]

热门文章

  1. 我的世界服务器物品无法合成,《我的世界》MC玩家无法合成的五大物品,最后一个已经被移除了!...
  2. 过年为什么要贴门神?
  3. ABCD四个人说真话的概率都是1/3。假如A声称B否认C说D是说谎了,那么D说过的那句话真话的概率是多少...
  4. 网易邮箱游戏双第一不保,谁来取而代之?
  5. 低代码平台,企业服务新战场
  6. 不想写日报、周报,这个报表自动化软件太牛了,仅需三分钟
  7. matlab偏分赋值错误,MATLAB ode45求解高阶微分方程组,出现“无法执行赋值,因为左侧和右侧的元素数目不同”问题...
  8. 哲哲打游戏(简单模拟,重点理解题意)
  9. 高清摄像机的发展历程及市场现状分析
  10. C++ Problems