前言

在做深度学习相关的项目时,往往最麻烦的是样本的收集,或者只有很少的一些样本,训练根本达不到想要的效果,很多网络模型的配置文件里面都有样本增强的定义,是对样本做旋转,变换之类的操作,但没有给样本加一些背景来制造增强样本的数量。

一、样本准备

1.我做一个发票检测位置到识别里面文字的项目,但我手里并没有多少张发票样本,在网上也很难找到能用的样本,我的应用场景是把发票放在桌面上拍照之后,检测识别。所以我先去网上下一些木纹桌面的样本,放在一个目录,完成之后从0开始命名如下:
2.我自己手中有发票样本也放在一个目录,也从0开始命名如下:

二、代码

1.代码用到OpenCV的基本库,读写文件就随便写了个循环读写,最好是改成boost库来读写文件。
2.代码的思想,大概是要的发票样本按任意角度旋转,再与背景图像融合。
3.代码:

bool ROI_AddImage(Mat &cv_back, Mat &cv_front, Mat &cv_dst)
{Mat cv_mask = cv_front.clone();if (!cv_back.data){std::cout << "读入图片失败" << std::endl;return false;}if (!cv_front.data){std::cout << "读入图片失败" << std::endl;return false;}int w = (cv_back.cols - cv_front.cols) / 2;int h = (cv_back.rows - cv_front.rows) / 2;Mat imageROI = cv_back(Rect(w, h, cv_front.cols, cv_front.rows));Mat mask;cv::cvtColor(cv_mask, mask, COLOR_BGR2GRAY);cv_front.copyTo(imageROI, mask);  cv_dst = cv_back.clone();
}int main()
{string back = "C:/Users/matt/Desktop/8/";string front = "C:/Users/matt/Desktop/80/";string save = "C:/Users/matt/Desktop/data/";for (int i = 0; i < 20; i++){string back_name = back + to_string(i) + ".jpg";string front_name = front + to_string(i) + ".jpg";Mat back = imread(back_name);Mat cv_front = imread(front_name);for (int j = 0; j < 5; j++){Mat cv_back = back.clone();Mat cv_rotata;int a = rand() % 180;rotateImage2(cv_front, cv_rotata, a, 0);Mat cv_png;toPng(cv_rotata, cv_png, 0);if (cv_png.rows > cv_back.rows){resize(cv_back, cv_back, cv_png.size(), 0.0, 0.0, INTER_NEAREST);resize(cv_png, cv_png, Size(cv_png.cols / 1.2, cv_png.rows / 1.2));}if (cv_png.rows < cv_back.rows){resize(cv_png, cv_png, cv_back.size(), 0.0, 0.0, INTER_NEAREST);resize(cv_png, cv_png, Size(cv_png.cols / 1.2, cv_png.rows / 1.2));}Mat cv_dst;ROI_AddImage(cv_back, cv_png, cv_dst);string save_name = save + to_string(i) + to_string(j) + ".jpg";imwrite(save_name, cv_dst);}}waitKey(0);return 0;
}void toPng(cv::Mat &src, cv::Mat &dst, int mark)
{cv::Mat cv_input = src.clone();if (cv_input.channels() != 4){cv::cvtColor(cv_input, dst, CV_BGR2BGRA);}else{return;}for (int y = 0; y < dst.rows; ++y){for (int x = 0; x < dst.cols; ++x){cv::Vec4b & pixel = dst.at<cv::Vec4b>(y, x);if (pixel[0] == mark && pixel[1] == mark && pixel[2] == mark){pixel[3] = 0;}}}
}int rotateImage(Mat &img, Mat & imgout, int degree, int border_value)
{if (img.empty())return 1;degree = -degree;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(width * fabs(b) + height * fabs(a));int height_rotate = int(height * fabs(b) + width * fabs(a));if (width_rotate <= 20 || height_rotate <= 20){width_rotate = 20;height_rotate = 20;}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;int chnnel = img.channels();if (chnnel == 3)warpAffine(img, imgout, map_matrix, Size(width_rotate, height_rotate), 1, 0, Scalar(0, 0, 0));elsewarpAffine(img, imgout, map_matrix, Size(width_rotate, height_rotate), 1, 0, 255);return 0;
}

4.可以自己设置融合多少次,运行之后的结果如下:

注:有兴趣于图像处理学习的可以加

OpenCV图像处理——深度学习样本制造相关推荐

  1. 深度学习-82:OpenCV与深度学习

    深度学习-82:OpenCV与深度学习 深度学习原理与实践(开源图书)-总目录, 建议收藏,告别碎片阅读! 随着机器学习,计算机视觉和计算能力的日益成熟,计算机视觉被广泛应用于人机互动.物体识别.图像 ...

  2. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

  3. 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较

    OpenCV图像处理入门学习教程系列,上一篇第五篇:基于背景差分法的视频目标运动侦测 一.网络爬虫简介(Python3) 网络爬虫,大家应该不陌生了.接下来援引一些Jack-Cui在专栏<Pyt ...

  4. tensorflow 语义slam_研究《视觉SLAM十四讲从理论到实践第2版》PDF代码+《OpenCV+TensorFlow深度学习与计算机视觉实战》PDF代码笔记...

    我们知道随着人工神经网络和深度学习的发展,通过模拟视觉所构建的卷积神经网络模型在图像识别和分类上取得了非常好的效果,借助于深度学习技术的发展,使用人工智能去处理常规劳动,理解语音语义,帮助医学诊断和支 ...

  5. 采用OpenCV和深度学习的钢印识别

    采用OpenCV和深度学习的钢印识别 [这个帖子标题党了很久,大概9月初立贴,本来以为比较好做,后来有事情耽搁了,直到现在才有了一些拿得出手的东西.肯定不会太监的.好,转入正题:] 原始需求: 系统将 ...

  6. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  7. 用OpenCV和深度学习进行年龄识别

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|机器学习算法那些事 在本教程中,您将学习如何使用OpenC ...

  8. 8_用opencv调用深度学习框架tenorflow、Pytorch、Torch、caffe训练好的模型(20190212)

    用opencv调用深度学习框架tenorflow.Pytorch.Torch.caffe训练好模型(20190212) 文章目录: https://blog.csdn.net/hust_bochu_x ...

  9. opencv 计数后不动了 训练模型时_用OpenCV和深度学习进行年龄识别

    在本教程中,您将学习如何使用OpenCV,深度学习和Python执行年龄的自动识别/预测. 学完本教程后,您将能够以相当高的精确度去自动预测静态图像文件和实时视频中的人物年龄. 要了解如何使用Open ...

最新文章

  1. python config配置文件的读写--configparser
  2. OAuth 2.0协议在SAP产品中的应用
  3. python项目部署访问特别卡_【python新人求助】flask+pymssql 通过wsgi发布到Apache,访问接口服务器卡死?...
  4. java 查找排序_查找与排序算法(Java实现)
  5. python matplotlib简单使用
  6. CentOS切换运行级别 图形模式/命令行模式
  7. 【小项目】SSM 实现单表 CRUD
  8. 9.Linux/Unix 系统编程手册(上) -- 进程凭证
  9. http | 状态码
  10. 使用Eclipse开发Android应用程序
  11. ssh 远程连接、上传下载命令
  12. 从零搭建Nginx+Tomcat动静分离web服务器 奶奶级超细教程
  13. 快过年了,用五种不同的JS特效带你看烟花(包邮送元宇宙图书)
  14. 关于hive on spark的distribute by和group by使用以及小文件合并问题
  15. Selenium3自动化学习(三)
  16. 小白学 Python(1):开篇
  17. MySQL中ESCAPE关键字的用法详解
  18. 华清远见嵌入式开发工程师2022
  19. 《Python学习手册》读书笔记
  20. java 电子时钟_java多线程编程制作电子时钟

热门文章

  1. Babel的安装和使用
  2. A - 数据结构实验之查找一:二叉排序树
  3. 第八天2017/04/17(3、C++的几个语法)
  4. 【c++】48.g++编译opencv、多线程
  5. 【自动驾驶】Eigen:矩阵Matrix的使用
  6. 【Linux】1.shell各个命令
  7. 机器学习系列(9)_机器学习算法一览(附Python和R代码)
  8. Python-OpenCV 处理视频(四): 运动检测
  9. Dubbo的使用及原理浅析
  10. 关于分布式事务、两阶段提交协议、三阶提交协议