文章目录

  • 一、写在前面
    • 1、前言
    • 2、软件版本信息
    • 3、出发点
  • 二、输出结果展示
    • 1、Matlab中
    • 2、OpenCV中
  • 三、原理
    • 1、原理总述
    • 2、Matlab
    • 3、OpenCV
  • 四、代码
    • 1、Matlab
    • 2、OpenCV
  • 五、结语

一、写在前面

1、前言

本文是我的第一篇博客,文章中可能存在些许错误或不足,欢迎提出建议或意见一起讨论。
另OpenCV学习时间较短,对于语言的理解不是很深,有不足之处还望指正。

2、软件版本信息

在 Matlab 2019a & Visual Studio 2017 + OpenCV 中运行都是通过的。

3、出发点

今年下半年一直在学OpenCV + C++。
基于OpenCV的随机性形状生成是受《OpenCV和Visual Studio图像识别应用开发》中文字处理一程序启发,进行了改进与优化,并在Matlab中进行实践。
另希望本文所带来的核心思想或某处代码写法能在设计算法中给予大家启发。
We love Matlab;
We love OpenCV;

二、输出结果展示

因为不支持比较大的GIF所以只能以截图的方式呈现。
无论在Matlab中或者VS 2017中,都是一个代码文件,输出基本顺序为:线条,矩形,三角,圆,文本及升华(后面就知道什么意思了);

1、Matlab中

1.随机线条的生成

2.随机矩形的生成

3.随机文本的生成
这里产生不同内容,不同颜色,不同字体,不同大小的文本;


4.升华

2、OpenCV中

因为大部分内容与Matlab中展示的一样,这里只简单的展示几幅。
1.生成随机线条

2.生成随机矩形

3.升华

三、原理

1、原理总述

其原理简单来说就是随机坐标的生成。对于线条是两个随机坐标的连接;对于矩形是随机生成两个数,然后在二维坐标系中组合成为四个点;三角形状是随机生成三个坐标;至于圆原理类似;文字只是把原来要显示的形状变为字符串进行随机性输出。
而这里所说的随机性,主要有位置、大小和颜色的随机。其背后都是随机性原理。

2、Matlab

Matlab实现的原理主要是在调用一些随机数生成函数和显示函数基础上进行循环输出,即就是显示在图形窗口。
1.rand()函数:产生由在(0, 1)之间均匀分布的随机数组成的数组。
2.unifrnd()函数:生成N阶[a,b]均匀分布数组。
3.text()函数:该函数在图形中指定的位置上显示字符串。
以上是主要调用和使用较多的函数,另有一些函数,使用也较为简单,代码中会注释好。

3、OpenCV

OpenCV实现原理主要是在使用产生随机数的类RNG以及绘制各种形状的API,通过各种API调用随机产生的数据输入作为API参数,从而实现位置,大小和颜色的随机性。
1.RNG(uint64 state):产生随机数,state是起始随机数列的64位值。
至于其它API这里就不详述了,好多博主都讲过,可以查查。
主要有使用到line(直线),rectangle(矩形),ellipse(椭圆),polylines(连接线),fillPoly(多边形),circle(圆),putText(文字)。

四、代码

1、Matlab

clc, close'g all, clear;  % m文件运行基操
% 线
axis off;
set(gcf,'menubar','none','toolbar','none','pointer','hand'...,'unit','centimeters','position',[8,2.5,20,15]);% 不显示当前figure菜单栏和工具栏。
for i = 1:200X1 = unifrnd(-0.2,1); Y1 = unifrnd(-0.2,1);X2 = unifrnd(-0.2,1); Y2 = unifrnd(-0.2,1);line([X1 X2],[Y1 Y2],'linewidth',3,'color',rand(1,3));    % 将两个点连接起来pause(0); % 程序暂停0秒
end
hold on;  % 保证在同一个窗口上继续产生新的形状
clf;      % 用来清除图形的命令,方便画下一个形状% 矩形
axis off;
set(gcf,'menubar','none','toolbar'ie,'none','pointer','hand'...,'unit','centimeters','position',[8,2.5,20,15]);% 不显示当前figure菜单栏和工具栏。
for i = 1:100X = unifrnd(-0.2,1); Y = unifrnd(-0.2,1);line([X Y Y X X],[X X Y Y X],'linewidth',3,'color',rand(1,3)); % 将一个矩形连接起来需要五个坐标pause(0);
end
hold on;
clf;% 三角形并进行填充
axis off;
set(gcf,'menubar','none','toolbar','none','pointer','hand'...,'unit','centimeters','position',[8,2.5,20,15]);
for i = 1:90X1 = unifrnd(-0.2,1); Y1 = unifrnd(-0.2,1);X2 = unifrnd(-0j.2,1); Y2 = unifrnd(-0.2,1);X3 = unifrnd(-0.2,1); Y3 = unifrnd(-0.2,1);line([X1 X2 X3 X1],[Y1 Y2 Y3 Y1],'linewidth',3,'color',rand(1,3));axis off;hold on;fill([X1 X2 X3 X1],[Y1 Y2 Y3 Y1],rand(1,3));pause(0);
end
hold on;
clf;% 圆
set(gcf,'menubar','none','toolbar','none','pointer','hand'...,'unit','centimeters','position',[8,2.5,20,15]);
for i = 1:30x=rand,y=rand,r=rand;x = x + x *0.6;y = y + y *0.6;theta=0:2*pi/3600:2*pi;Circle1=x+r*cos(theta);Circle2=y+r*sin(theta);plot(Circle1,Circle2,'color',rand(1,3),'Linewidth',3);hold on;fill(Circle1,Circle2,rand(1,3));  % 用随机彩色填充圆形内部,注意这里圆的轮廓和填充色不同axis([0 2.5 0 2.5]);axis equal;axis off;pause(0);
end
hold on;
clf;% 文本
TEST(1) = struct('Fontname','Consolas','String','Love'); % 使用一个结构体来保存字体名称和需要随机显示的字符串
TEST(2) = struct('Fontname','Monospaced','String','Passion');
TEST(3) = struct('Fontname','Gigi','String','Supreme');
TEST(4) = struct('Fontname','Chiller','String','Incredible');
TEST(5) = struct('Fontname','Georgia','String','Marvellous');
TEST(6) = struct('Fontname','Harrington','String','Awesome');
TEST(7) = struct('Fontname','Mistral','String','Fantastic');
TEST(8) = struct('Fontname','Pristina','String','Fabulous');
TEST(9) = struct('Fontname','楷体','String','Brilliant');
TEST(10) = struct('Fontname','宋体','String','Amazing');
axis off;
set(gcf,'menubar','none','toolbar','none','pointer','hand'...,'unit','centimeters','position',[8,2.5,20,15]);
for k = 1:200x = unifrnd(-0.2,1);y = unifrnd(-0.2,1);text(x,y,TEST(unidrnd(10)).String,...'fontsize',unifrnd(14,23),...'fontname',TEST(unidrnd(10)).Fontname,'color',rand(1,3)); % 在text中直接随机调用结构体中的字符串pause(0);
end
hold on;
clf;% 生成一个Matlab文本金字塔
axis off;
set(gcf,'menubar','none','toolbar','none','pointer','hand'...,'unit','centimeters','position',[8,2.5,20,15]);% 该段代码完全可以使用循环来调用,不过考虑到不同字体有不同的行距和字间距等等,为了美化起见进行了人工调试,以下为期望中较好的,
text(0.3,0.8,'We love Matlab','fontname','Gigi','fontsize',15,'color',rand(1,3));
pause(0.2);
text(0.25,0.75,'We love Matlab','fontname','Monospaced','fontsize',20,'color',rand(1,3));
pause(0.2);
text(0.2,0.7,'We love Matlab','fontname','Consolas','fontsize',25,'color',rand(1,3));
pause(0.2);
text(0.18,0.64,'We love Matlab','fontname','楷体','fontsize',30,'color',rand(1,3));
pause(0.2);
text(0.16,0.55,'We love Matlab','fontname','Georgia','fontsize',35,'color',rand(1,3));
pause(0.2);
text(0.14,0.47,'We love Matlab','fontname','Harrington','fontsize',40,'color',rand(1,3));
pause(0.2);
text(0.12,0.37,'We love Matlab','fontname','Sitka Subheading','fontsize',45,'color',rand(1,3));
pause(0.2);
text(0.1,0.28,'We love Matlab','fontname','Arial','fontsize',50,'color',rand(1,3));
pause(0.2);
text(0.08,0.17,'We love Matlab','fontname','Gadugi','fontsize',55,'color',rand(1,3));
pause(0.2);
text(0.06,0.05,'We love Matlab','fontname','Ebrima','fontsize',60,'color',rand(1,3));

2、OpenCV

因为OpenCV代码较长,300多行,这里只展示其中定义的产生随机颜色的子函数和随机显示文本的子函数。其它放入网盘免费下载链接:
(https://pan.baidu.com/s/1dBL10g34PALzRvrl5LCmyg) 提取码: 7yt4

// 产生随机颜色的子函数
static Scalar randomColor(RNG& rng)
{int icolor = (unsigned)rng;// 与 255 作 bit 的 & 运算return Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255);
}
// 随机显示文本的子函数
int Displaying_Random_Text(Mat image, char* window_name, RNG rng)
{int lineType = 8;  // putText的参数:线型for (int i = 1; i < NUMBER; i++)  // 定义在主函数前const int NUMBER = 100;{Point org;  // 定义point点类用来确定文本的位置;org.x = rng.uniform(x_1, x_2);org.y = rng.uniform(y_1, y_2);putText(image, "Supreme", org,rng.uniform(0, 8), rng.uniform(0, 100)*0.05 + 0.1,randomColor(rng), rng.uniform(1, 10), lineType);// 使用随机数类RNG生成了文本的随机位置,大小,粗细和颜色imshow(window_name, image);if (waitKey(DELAY) >= 0){return -1;}}return 0;
}

五、结语

本人也是学习opencv不久,如有错误,请各位大牛指点。目前在学习图像处理算法与机器视觉相关内容,欢迎一起讨论。
QQ:1825628142;
邮箱:suhao_15@163.com;

基于Matlab OpenCV的随机性形状生成算法相关推荐

  1. 毕业设计 - 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

    文章目录 1 简介 2 传统机器视觉的手势检测 2.1 轮廓检测法 2.2 算法结果 2.3 整体代码实现 2.3.1 算法流程 3 深度学习方法做手势识别 3.1 经典的卷积神经网络 3.2 YOL ...

  2. 基于matlab蓝牙跳频系统,基于Matlab软件的蓝牙跳频改进算法

    60 基于Matlab软件的蓝牙跳频改进算法 [毛淑华 岩淑霞 雷伯录] 介绍了蓝牙跳频系统对跳频序列的要求,并且提出了一种改进的自适应跳频方案.基于C语言和MATLAB工具对原跳频系统和改进后系统分 ...

  3. 【光学】基于matlab模拟光栅条纹投影生成

    1 内容介绍 基于matlab模拟光栅条纹投影生成 2 部分代码 function varargout = Main(varargin) % MAIN MATLAB code for Main.fig ...

  4. 基于MATLAB的RSSI 和 PLE 定位算法,并通过卡尔曼滤波器减少非视距误差

    基于MATLAB的RSSI 和 PLE 定位算法,并通过卡尔曼滤波器减少非视距误差 根据上面的课题要求,我们知道在室内未知信道环境下,进行RSS估计效果较差,而本课题所要求的是在室内未知PL的情况下进 ...

  5. 基于matlab的捷联惯导算法设计及仿真,基于 Matlab 的捷联惯导算法设计及仿真1doc.doc...

    基于 Matlab 的捷联惯导算法设计及仿真1doc 基于 Matlab 的捷联惯导算法设计及仿真1 严恭敏 西北工业大学航海学院,西安 (710072) E-mail:yangongmin@163. ...

  6. 基于Matlab的三维胖射线追踪算法

    基于Matlab的三维胖射线追踪算法(1) 三维CT更有利于对构造的精细识别,三维CT本质上与二维CT无较大区别,但计算量增加,占用电脑内存大,计算时间更长. 文章目录 基于Matlab的三维胖射线追 ...

  7. matlab 安装出来封面就没了,基于Matlab的计算报告书封面生成方法及计算机存储介质与流程...

    本发明涉及一种计算报告书封面生成方法及计算机存储介质,特别是涉及一种基于Matlab的计算报告书封面生成方法及计算机存储介质. 背景技术: 技术人员在采用Matlab大型矩阵计算软件进行工程计算等科研 ...

  8. matlab自动生成报告,一种基于MATLAB的Word报告自动生成方法

    总第 182期 一 种基于MATLAB的Word报告自动生成方法 孙 剑 (信阳农林学院,河南 信阳 464000) 摘要:自动生成Word文档报告功能是办公 自动化系统中的重要组成部分.为高效的完成 ...

  9. 【光学】基于matlab GUI光栅条纹投影生成【含Matlab源码 2118期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI光栅条纹投影生成[含Matlab源码 2118期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

最新文章

  1. 《深入浅出Ext JS》2.19全国首发
  2. 跨界创新,智启未来 | 清华大学大数据研究中心2021年RONG奖学金答辩会成功举办...
  3. BigData之MongoDB:MongoDB基于分布式文件存储数据库的简介、下载、案例应用之详细攻略
  4. 【数据竞赛】百赛百试,十试九灵的特征筛选策略-Pearson Correlation
  5. 使用jena 进行RDF推理
  6. dozer bean_使用Dozer框架进行Bean操作
  7. 漫画:千万别在同事面前装逼
  8. 汇编:分段函数的值的计算
  9. Url解码,兼容utf-8和gb2312
  10. 按值设置选择选项“已选择”
  11. uniapp手写_【uniapp 开发】手绘签名组件
  12. 软件设计师历年真题详解2009-2018
  13. jdbc连接timesten_Java 连接 timesten
  14. Excel操作:分析工具库
  15. 压力测试工具Apache Bench:2:基于Alpine的Apache Bench镜像
  16. mysql冒号_mysql语句中的冒号是什么意思?
  17. debian linux系统安装教程,Debian 8.2.0 (Jessie) 快速纯净安装教程
  18. live555 官方网站源码下载地址
  19. HyperLedger Fabric中Fabric-CA的使用
  20. mysql 根据经纬度查询距离

热门文章

  1. 集团资金管理BI分析的三个关键节点
  2. vhdl写模十计数器(可任意选择)
  3. POC_百卓网络Smart多业务安全网关
  4. IG Wealth Management与Carbon Streaming Corporation合作推出基金组合,以响应实现净零排放的全球努力
  5. 怎样恢复删除的视频?这5个方法才是正确答案!
  6. cmsplus实战之仿[我扫网]之十二:打包网站及数据库并上传到服务器调试
  7. python第五章课后题答案超星_中国大学MOOC(慕课)2020用Python玩转数据题目及答案...
  8. JUC常用辅助类CountDownLatch、CyclicBarrier、Semaphore
  9. Python爬取天气数据,并且进行天气预报(已实现)
  10. 车载毫米波雷达的校准问题(1)