openCVPracticalExercise学习笔记02

10使用Hu矩进行形状匹配

Hu矩(或者更确切地说是Hu矩不变量)是使用对图像变换不变的中心矩计算的一组7个变量。事实证明,前6个矩不变量对于平移,缩放,旋转和映射都是不变的。而第7个矩会因为图像映射而改变。
OpenCV中,我们HuMoments()用来计算输入图像中的Hu矩。

openCVPracticalExercise学习笔记01

资料:OpenCV-Practical-Exercise:https://github.com/luohenyueji/OpenCV-Practical-Exercise

学习目的

gcc,make和cmake

gcc,make,cmake关系

1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。
2.当你的程序只有一个源文件时,直接就可以用gcc命令编译它。
3.但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大
4.所以出现了make工具
make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。
5.makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的
6.makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
7.makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。
8.这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。
9.可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile
10.到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。
11.当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形
12.cmake是make maker,生成各种可以直接控制编译过程的控制器的配置文件,比如makefile、各种IDE的配置文件。
13.make是一个简单的通过文件时间戳控制自动过程、处理依赖关系的软件,这个自动过程可以是编译一个项目。

多线程bug处理记录

多线程bug处理记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Thread(target=func02)
while True:
dataA=DataA()
dataA.data=[[[xx,yy]]]
xxx,
yyy,
zzz,
dataA.data=[[[xx,yy]],[[ff,zz]]]
assert len(dataA.data)>1,error data#标记01
self.queue.put(dataA)


func02():
dataA=self.queue.get()
assert len(dataA.data)>1,error data#标记02

opencv学习笔记06

OpenCV-Python教程:50.理解k-近邻

https://www.jianshu.com/p/404e329e4e80
OpenCV里的kNN

opencv学习笔记05

OpenCV-Python教程:40.ORB

https://www.jianshu.com/p/49a84ddef11d
ORB最重要的事情是它是OpenCV实验室出来的,它在计算成本,匹配性能上是SIFT和SURF很好的替代品,还有最主要的,专利,对,SIFT和SURF都是有专利的,你得付费试用,但是ORB不是。
ORB基本上是一个FAST关键点检测和BRIEF描述子的融合,同时做了很多修改提高了性能。首先它使用FAST来找关键点,然后用Harris角点测量来找到头N个点。还使用金字塔来产生多层级特征,但是问题是FAST不计算方向,所以旋转不变呢?作者做了如下修改。

opencv学习笔记04

OpenCV-Python教程:30.霍夫圆变换

https://www.jianshu.com/p/a795171f8092
函数是cv2.HoughCircles()

opencv学习笔记03

OpenCV-Python教程:21.轮廓:更多函数

https://www.jianshu.com/p/07312149e60a
1.凸面缺陷
OpenCV提供了现成的函数来做这个,cv2.convexityDefects().
2.Point Polygon Test
这个函数找到图像里的点和轮廓之间的最短距离。它返回的距离当点在轮廓外的时候是负值,当点在轮廓内是正值,如果在轮廓上是0
3.匹配形状
OpenCV提供一个函数cv2.matchShapes()来让我们可以比较两个形状,或者两个轮廓来返回一个量表示相似度。结果越低,越相似,它是根据hu矩来计算的。不同的计算方法在文档里有介绍。

opencv学习笔记02

OpenCV-Python教程:11.图片阈值

https://www.jianshu.com/p/267a32ad0a23
cv2阈值处理:https://blog.csdn.net/u011070767/article/details/80639556
一、全局阈值
为整个图片指定一个阈值,函数为cv2.threshold(src, thresh, maxval, type, dst=None)

opencv学习笔记01

学习目标

1,opencv能做什么,不能做什么
2,阅读代码,知道某种func后图片怎么样了
3,在图片相关机器学习算法预处理阶段,希望通过对图片的简单处理,达到提升训练效果的目的。

django进阶04部署上线(nginx,uwsgi,supervisor)

django自身服务ok

python manage.py runserver,验证可正常访问

django进阶03静态文件和模板

静态文件和模板

静态文件:css,js,image,如果作为纯粹的web应用来看,静态文件的响应并不属于web应用范畴,因为静态文件不涉及业务逻辑,也不需开发业务代码。但几乎100%的web应用都支持对静态文件的直接访问。为何?主要是web应用基本上必然依赖css,js,img等静态资源,我们不可能固执的开发一个纯粹的web应用,只支持从url里进入视图函数,也只能从视图函数返回内容(简单来说所有请求路径都必须体现在url_route和view视图中)。而要求用户独立开启静态资源的请求处理服务。所以,先把静态资源服务和包含业务逻辑的web应用独立认识,二者并不相同,但强相关。其本身是独立于应用的
模板:在代码中response渲染中使用的,可以看做view视图的组成部分.所以没有独立url配置,依赖view视图存在,属于应用一部分,包含了业务逻辑(需要渲染),这一点也可以从配置上看出来。

django进阶02websocket

本文适合有一定websocket基础的,至少完整看过前后端demo的读者,一窍不通的小白建议先阅读“参考”部分的博文扫扫盲。
基于django的dwebsocket组件(目前虽然不在维护,但正常使用没问题)

前端方法

软件_搭建rtsp视频推送环境

live555编译安装启动

编译

python进阶21之actor

actor模型。actor模式是一种最古老的也是最简单的并行和分布式计算解决方案。
优点:充分利用单线程+事件机制,达到了多线程效果。
缺点,对python而言,由于GIL的存在,毕竟只是单线程,难以匹敌多进程,目前使用并不多。

简单任务调度器

python进阶20装饰器

Nested functions

Python允许创建嵌套函数,这意味着我们可以在函数内声明函数并且所有的作用域和声明周期规则也同样适用。

python进阶19垃圾回收GC

垃圾收集三大手段

一、引用计数(计数器)

python进阶18正则表达式

正则基础知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
^`:匹配行首
`$`:匹配结尾
`*`:(**贪婪**)前面字符匹配任意多次
`+`:(**懒惰**)前面字符匹配1或者更多次
`?`:前面字符匹配0或1次,还作为懒惰限定符使用,详看后面

`{m}`:前面字符匹配m次
`{m,n}`:前面字符匹配m~n次
`{m,}`:前面字符匹配m或更多次
`{,n}`:前面字符匹配0~n次

`|`:或,必须加括号

`.`:匹配除换行符以外的任意字符
`[1357]`:匹配1,3,5,7中其中一个数字,当然也可以是字母
`[0-9]`:匹配0到9的其中一个数字,类似用法还有:[a-zA-Z]
`[\u4E00-\u9FA5]`:匹配中文
`[^012]`:表示除012外的任意字符,包括3-9,a-z,A-Z,等等
注意:[]里面的.和*等一些特殊字符都失去特殊意义,只表示本身。

python进阶17炫技巧

原则:可读性第一(效率固然重要,除非非常明显的效率差异,否则可读性优先)
学习炫技巧,更多为了读懂他人代码,自己开发过程中,相似代码量(可读性),建议使用通俗写法。反对为炫而炫。

可直接运行的 zip 包

python进阶16多继承与Mixin

Mixin解释

为了让大家,对这个 Mixin 有一个更直观的理解,摘录了网上一段说明。
民航飞机是一种交通工具,对于土豪们来说直升机也是一种交通工具。对于这两种交通工具,它们都有一个功能是飞行,但是轿车没有。所以,我们不可能将飞行功能写在交通工具这个父类中。但是如果民航飞机和直升机都各自写自己的飞行方法,又违背了代码尽可能重用的原则(如果以后飞行工具越来越多,那会出现许多重复代码)。
怎么办,那就只好让这两种飞机同时继承交通工具以及飞行器两个父类,这样就出现了多重继承。这时又违背了继承必须是”is-a”关系。这个难题该怎么破?
这时候 Mixin 就闪亮登场了。飞行只是飞机做为交通工具的一种(增强)属性,我们可以为这个飞行的功能单独定义一个(增强)类,称之为 Mixin 类。这个类,是做为增强功能,添加到子类中的。为了让其他开发者,一看就知道这是个 Mixin 类,一般都要求开发者遵循规范,在类名末尾加上 Mixin 。

python进阶15变量作用域LEGB

作用域

“作用域”定义了Python在哪一个层次上查找某个“变量名”对应的对象。接下来的问题就是:“Python在查找‘名称-对象’映射时,是按照什么顺序对命名空间的不同层次进行查找的?”
答案就是:使用的是LEGB规则,表示的是Local -> Enclosed -> Global -> Built-in,其中的箭头方向表示的是搜索顺序。

python进阶14文件路径(找不到文件)

开发时遇到问题,文件路径不正确,找不到文件等等,都是这一类问题.

curdir,argv,file

python进阶13并发之九多进程和数据共享

使用进程,大概率出现情况是,想当然以为共享了,实际没共享。所以最终程序大概率卡死(部分逻辑没有数据进来,导致的业务逻辑性卡住,并非程序死锁)

哪些共享,哪些不共享

python进阶12并发之八多线程与数据同步

python并发首选进程,但偶尔有场景进程无法搞定,比如有些变量是无法序列化的,就无法使用工具包manager()的工具类进行共享。如果自己实现新的共享方法,可能开发量较大,且质量难以保证。此时可考虑用线程处理,规避进程的变量共享难题,而且实际场景中,IO大概率都是瓶颈,所以使用线程其实也的确有些优势。个人而言,选择进程和线程较为重视的安全性,进程数据隔离较好,互不干扰。其次就是公用数据占比,如果大多数数据都需公用,那么线程也会比进程更佳,避免了进程较多的数据共享问题。
线程而言,难点数据一致性,

哪些共享,哪些不共享

浅谈nginx,gunicorn,flask差异比对

角色划分

flask(django):Python的Web应用程序(如Flask,django)
nginx:web服务器,用户角度直接对接使用,请求响应的request-response出入口
WSGI(Web Server Gateway Interface),翻译为Python web服务器网关接口,即Python的Web应用程序(如Flask)和Web服务器(如Nginx)之间的一种通信协议。也就是说,如果让你的Web应用在任何服务器上运行,就必须遵循这个协议。

python进阶11并发之七多种并发方式的效率测试

测试map,apply_async,gevent协程爬虫
测试代码:网页爬虫

函数代码

python进阶10并发之六并行化改造

图示变量含义说明:
1个大step中包含3个小step,大step内部的第一步,二步,三步存在依赖关系(就是内部保持顺序执行)
a1,b1,c1,表示子任务a的第一步,b的第一步,c的第一步.同理a2,表示子任务a的第二步。

无并行

软件_ubuntu命令cp目录路径和通配符

cp作为linux最常用命令,大部分情况正确使用,偶尔也会犯低级错误。比如,今天自己copy目录就犯错了。特此整理下
以下基于ubuntu16测试(xxx含义为目录a/下的所有文件)

copy目录a目录b结果
cpabb/a/xxx
cpa/bb/a/xxx
cpa/*bb/xxx
cpab/b/a/xxx
cpa/b/b/a/xxx
cpa/*b/b/xxx

python进阶09并发之五生产者消费者

这也是实际项目中使用较多的一种并发模式,用Queue(JoinableQueue)实现,是Python中最常用的方式(这里的queue特指multiprocess包下的queue,非queue.Queue)。

Queue

python进阶08并发之四map, apply, map_async, apply_async差异

差异矩阵

python封装了4种常用方法,用于实现并发
其差异如下

python进阶07并发之三其他问题

何时使用多进程(线程)

使用多进程or线程,对于python,考虑到GIL锁,基本上默认使用多进程就对了。
除此之外,线程共享全局变量,进程全局变量则是隔离的,实际进程大多数情况需要通信的,所以也需要考虑共享数据读写问题处理。 决定因素稳定性和数据共享要求上(操作系统差异性,win偏好线程,linux偏好进程)
性能上虽然线程较好,但实际除了大型互联网公司和部分专业性质软件,大多数中小型公司的并发量,并不会带来很大影响,况且目前服务器领域,基本上LInux和Unix占比较高,线程相比进程在性能上优势并不十分突出。所以这方面考量不会太大的。

python进阶06并发之二技术点关键词

GIL,线程锁

python中存在GIL这个”线程锁”,
关键地方可以使用c语言解决 GIL问题 然后可以提高cpu占用效率

python进阶05并发之一基本概念

大多编程语言,一旦涉及并发,都会比较复杂,知识点也较多(大多为历史问题,很多技术点现在非常少使用了,但语言层面也提供支持,对于这些冷门点,只需要知道即可,使用时也尽量避免使用这种冷门技术,除非和应用场景非常匹配)。实际使用过程中,只需要知道各名词以及大概功能,大多现用现查,毕竟涉及点太多,而且使用频率也并非很高,一般也就新系统研发会使用,后续维护时基本不会涉及太多。

进程状态和调度

软件_视频rtmp,rmvb,h265区别

h265,h264

视频压缩算法,原始视频是图片流,意味着[[r,g,b],[r,g,b],,]等等,极其占用空间,所以这种数据只能出现内存中(效率优先),硬盘和网络上只能是压缩后的(否则占用宽带或者存储资源),主要的压缩就是由他们来实现的。

python进阶04IO的同步异步,阻塞非阻塞

同步和异步

同步和异步关注的是消息通信机制
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
举个通俗的例子:你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
同步的整个流程就1部分,1问答,异步模式2部分,1问空答复+无问1答复。

软件_可用rtmp直播地址20200517

可用的rtmp直播地址
耀才证券 : rtmp://202.69.69.180:443/webcast/bshdlive-pc
湖南卫视 : rtmp://58.200.131.2:1935/livetv/hunantv
广东卫视:rtmp://58.200.131.2:1935/livetv/gdtv
东方卫视:rtmp://58.200.131.2:1935/livetv/dftv
广西卫视:rtmp://58.200.131.2:1935/livetv/gxtv
一段视频 :rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov

以下也已经验证
rtmp://vod.qthtv.com:1935/live/live2
rtmp://218.3.205.46/live/ggpd_sd
rtmp://w3.wifijiangyin.com:1936/live/mspd_bq
rtmp://w3.wifijiangyin.com:1936/live/xwzh_bq
rtmp://hls.hsrtv.cn/hls/hstv2
rtmp://hls.hsrtv.cn/hls/hstv1
rtmp://video.vtibet.com/masvod/zangyuTV_q1
rtmp://58.200.131.2:1935/livetv/cctv15
rtmp://222.173.22.119:1935/live/jnds_sd
rtmp://218.3.205.46/live/wyys_sd
rtmp://218.3.205.46/live/xwzh_sd
rtmp://hls.hsrtv.cn/hls/hstv3
rtmp://video.vtibet.com/masvod/hanyuTV_q1
rtmp://v.btzx.com.cn/live/weishi.stream
rtmp://218.3.205.46/live/jjsh_sd
rtmp://livetv.dhtv.cn:1935/live/news
rtmp://livetv.dhtv.cn:1935/live/financial
rtmp://v.btzx.com.cn/live/news.stream
rtmp://222.173.22.119:1935/live/jnyd_sd
rtmp://livetv.dhtv.cn:1935/live/peoples
rtmp://livetv.dhtv.cn:1935/live/citylife
rtmp://222.173.22.119:1935/live/jnxw_sd
rtmp://125.75.232.142/live/c01
rtmp://222.173.22.119:1935/live/xwhd_hd
rtmp://58.200.131.2:1935/livetv/cctv16

python进阶03UnboundLocalError和NameError错误

几个概念

1
2
3
4
5
6
7
8
9
10
11
12
13
code block:作为一个单元(Unit)被执行的一段python程序文本。例如一个模块、函数体和类的定义等。
scope:在一个code block中定义name的可见性;
block’s environment:对于一个code block,其所有scope中可见的name的集合构成block的环境。
bind name:下面的操作均可视为绑定操作
函数的形参
import声明
类和函数的定义
赋值操作
for循环首标
异常捕获中相关的赋值变量
local variable:如果name在一个block中被绑定,该变量便是该block的一个local variable。
global variable:如果name在一个module中被绑定,该变量便称为一个global variable。
free variable: 如果一个name在一个block中被引用,但没有在该代码块中被定义,那么便称为该变量为一个free variable。

软件_搭建rtmp视频推送环境,腾讯云,ubuntu16

1,安装conda,ffmpeg,nginx,nginx-rtmp-module

(建议先修改主机pip,conda的源)
安装conda,创建环境::conda create -n rstp python=3.7
报错:Solving environment: | failed

深入理解字符,字符集,gbk,utf8

字符,字符集,字符编码概念

字节

django学习笔记03

第一章,模型层

查询集API

django学习笔记02

第一章:模型层

1.8 查询操作

django学习笔记01

基于教程,刘江的博客教程Django教程:https://www.liujiangblog.com/course/django/87

第一章:模型层

python进阶02yield

yield关键字之前见过,也能读懂,但开发时也不大敢使用,感觉理解还是不够充分。刚好项目代码中有涉及,顺便再学习学习。
在理解yield之前,

可迭代,迭代器,生成器

django快捷复习手册

建立项目

django startproject projectname

django进阶01信号

看起来简单,用起来简单。理解起来则未必容易。上学那会这一块就没整明白,这两天又查了下资料,算是基本弄懂了。
为何难以理解?个人感觉起名占了很大一部分,如果signal命名为“观察者”,“监控者”,“盯梢者”,就容易理解多了。其本质就是一种典型观察者模式。命名为信号,第一感觉是”信号量“类似的东西。

定义信号:

软件_crontab任务配置失败原因总结和技巧

 昨天,配置crontab时遇到一些坑。crontab虽然算比较熟悉了,但也有1年多没碰过,有点生疏了,低级错误基本又犯了一遍。顺便整理下。

如果配置了crontab,之后没有生效,怎么办?
按照如下顺序处理:
1,命令单独拿出来,终端中执行
这个可以暴露出如下问题
a,脚本是否存在权限问题(chmod +x xx.sh)
b,是否存在(手抖)写错路径等低级错误
c,如果依赖特定conda环境,则需要conda activate xxx

软件_mongo占用磁盘空间过大

何为过大:mongodump之前2G,导入后变成15G,大约8倍.
原因:如果mongo版本小于3,则正常,mongo请升级到3.0版本上,目前3.6.7较稳定版

错误安装方式mongo2.x版

脚本_采集博客友情链接

新建博客后,百度收录往往非常慢,除了常规的keywords优化,较易实现且效果较好的就是增加友情链接了。
友情链接的添加可以分成3个步骤
1,找寻博客友情链接
2,判断博客是否符合自己博客领域或类型(有无“眼缘”),将对方友情链接添加到自己博客
3,将个人站点信息留言方式给对方

其中第1步,很容易用脚本实现(手工挨个找站点,挨个点击,也能实现,面临是人工点很多次,且容易重复)。
而且大部分博客友链都会链同类型网站,其实等于做了类型过滤。
第2,3由于博客基于框架和对接后台消息系统不同,难以实现自动操作。故对第1步写了专门脚本进行处理。
脚本地址:点击这里github
脚本基于python(由于本人使用linux系统,故只能保证linux下无问题,win下未做测试)
脚本使用方法:

算法_深度LSTM笔记

本文适合有一定基础同学的复习使用,不适合小白入门,入门参考本文参考文献第一篇

结构_静态综合图

主机_云服务器vps价格比对

云服务价格比对(20191202)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
公司,配置,价格,链接地址
腾讯云:16-32-30-1m,5.12小时,https://buy.cloud.tencent.com/cvm?tab=custom&step=1&devPayMode=hourly&regionId=4&zoneId=0&instanceType=S4.SMALL1&platform=CentOS&systemDiskType=CLOUD_PREMIUM&systemDiskSize=50&bandwidthType=TRAFFIC_POSTPAID_BY_HOUR&loginSet=SET_PASSWORD
百度云:16-32-40-1m,5.74小时,https://cloud.baidu.com/calculator.html#/bcc/price
青云:16-16-40-1m,2.8614小时,https://www.qingcloud.com/pricing#/InstancesKVM
京东云:16-32-none-1m,4.78小时,https://www.jdcloud.com/cn/calculator/calHost(计算优化)
华为云:16-31-30-1m,3.34,https://www.huaweicloud.com/pricing.html?tab=detail#/ecs,通过计算增前
ucloud:16-32-30-1m,3.03小时,https://www.ucloud.cn/site/product/jsq/#!/uhost
美团云:16-32-55-1m:1.7627小时,地址:https://www.mtyun.com/buy/server
比格云:16-32-60Gssd-2m:4.58小时,地址:https://www.biggeryun.com/Price
verycloud:16-32-30-1m,2.4801小时,https://portal.verycloud.cn/cloud/pricecalculator(价格可以,但按需要预存3天费用,那就没意义了)
淘宝:远程电脑出租,16-64-500-200M,35天,5小时
网宿云;
金山云:16-32-30-1m,4.008,地址,https://price.ksyun.com/#!/kec/price
滴滴云:16-32-40-1m,1.3848,地址:https://www.didiyun.com/calc-price.html#/price/dc2
新睿云:16-32-20-1m,3.15,地址:https://www.xrcloud.net/buy/
小鸟云:查看价格要登录
天意云:不支持分时
亿恩云:不支持分时
天河超计算机试用:http://www.nscc-gz.cn/Service/Igotto.html
亿速云:无分时
平安云:16-32-40-1m,3.64,地址:https://yun.pingan.com/ssr/pricing/ecs/calculator
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×