python+opencv 检测和跟踪运动物体
效果展示
最终效果视频
监控+差值+黑白二值图像
代码
- 该程序计算量要求较低,可以部署在树莓派类的物联网设备上
python包配置
1 | sudo pip install argparse #用于解析参数 |
python代码
代码写的相当详细,注释的极其详细,不再赘述。(python版本2.7)
1 | #coding:utf-8 |
最终效果视频
监控+差值+黑白二值图像
1 | sudo pip install argparse #用于解析参数 |
代码写的相当详细,注释的极其详细,不再赘述。(python版本2.7)
1 | #coding:utf-8 |
前段时间的,新生工程体验课上,两人一组,靠厂家提供的元器件和烧录代码,焊接了了一台智能小车。
最进,碰巧手头有空闲的一块树莓派,本来打算用树莓派去实现远程控制空调,但发现空调的红外编码带有逻辑控制,只能退而求其次,试试远程控制小车,大体框架结构如图。
2017-07-03更新,已经实现对空调类带逻辑编码设备的简单控制。
几乎所有的新手教程都使用Win32DiskImager作为系统安装工具——中文的、英文的、官方的、eLinux wiki的,不一而足。 但是这个工具不支持中文目录名(文件或目录有中文,会出现123错误),不支持压缩,必须先插好SD卡,再开软件。 而USB Image Tool,就是Win32DiskImager的一个更方便的替代品。
USB Image Tool可以直读.zip压缩包。网上下载的zip格式系统镜像,下完直接可以烧录。 点击Restore,选择.zip文件即可。注意打开对话框中默认看不到.zip文件,在“文件类型”处选择“All Files (.)”即可。
自从2016年11月开始,树莓派官方推荐 Raspbian 系统镜像关闭了默认ssh连接,重新开启也很简单,把SD卡拔下来,进入到根目录,新建一个名为ssh的空白文件(无后缀)就可以。
好了然后再把卡插回树莓派,就可以使用SSH了。
材料:
红外接受管(3pin),红外接受管(2pin),杜邦线若干。
根据不同树莓派版本,查看GPIO的引线图,该实验采用B+版,具体实物对应图和GPIO与pin对应图如下图:
红外接收器
vcc 连 pin1 (3.3v)
gnd 连 pin6(ground)
data 连 pin12(gpio18)
红外发射器
gnd 连 pin25(ground)
data 连 pin11(gpio17)
红外接受器规格见图,左引脚为data,中为接地,右为3.3V供电
红外发射器规格见图,长脚为data,短脚为接地
接收器和发射器通过杜邦线跟树莓派相连,最后的连接实物图
1 | sudo nano /etc/apt/sources.list |
例如使用大连东软信息学院软件源镜像,修改之后的内容如下:
1 | deb http://mirrors.aliyun.com/raspbian/raspbian jessie main contrib non-free rpi |
其他可用源如下:
中国科学技术大学 Raspbian http://mirrors.ustc.edu.cn/raspbian/raspbian/
阿里云 Raspbian http://mirrors.aliyun.com/raspbian/raspbian/
清华大学 Raspbian http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/
华中科技大学 Raspbian http://mirrors.hustunique.com/raspbian/raspbian/ Arch Linux ARM http://mirrors.hustunique.com/archlinuxarm/
华南农业大学(华南用户) Raspbian http://mirrors.scau.edu.cn/raspbian/
大连东软信息学院源(北方用户) Raspbian http://mirrors.neusoft.edu.cn/raspbian/raspbian/
重庆大学源(中西部用户)
1 | # 更新软件源 |
因为vi在insert模式下,方向键会变为ABCD,故用vim进行替换
1 | #卸载vi |
LIRC (Linux Infrared remote control)是一个linux系统下开源的软件包。这个软件可以让Linux系统接收及发送红外线信号。
1 | sudo apt-get install lirc |
配置硬件
1 | # sudo vim /boot/config.txt #在文件结尾添加 |
注意:配置gpio_in_pin和gpio_out_pin时,编号为GPIO号,并非pin号
启动测试
1 | sudo mode2 -d /dev/lirc0 |
红外接收器已经打开,处于监听状态。这个时候,利用任何红外发射器(可以是电视遥控器或其他遥控器)对红外接收模块按任意按钮,就可以在树莓派终端上看到类似如下的代码
看到这个代码便证明红外接收模块是正常工作的。
如果没有看到,请检查你的接线、电压、以及通过lsusb查看是否加载了相应模块。
1 | pulse 1681 |
1 | irrecord -d /dev/lirc0 ~/lircd.conf #按照提示操作即可,录制完后会让你输入按键名 |
1 | irrecord --list-namespace |
1 | sudo cp ~/lircd.conf /etc/lirc/lircd.conf |
1 | sudo lircd -d /dev/lirc0 |
1 | irsend LIST /home/pi/lircd.conf "" |
1 | irsend SEND_ONCE /home/pi/lircd.conf KEY_XXX |
演示效果
关于录制带逻辑编码的红外编码
一个比较令人兴奋的消息,谢谢博客http://blog.just4fun.site/raspberrypi-lirc.html的帮助,直接发送raw原始码就可以实现简单的控制程序。😘
注意:其只能使用raw原始码,记录是通过mode2命令实现。
1 | sudo /etc/init.d/lirc restart |
1 | mode2 -d /dev/lirc0 > /tmp/temp.code |
1 | begin remote |
1 | sudo lircd -d /dev/lirc0 |
本人常用Mi5s,伴随着MIUI9(7.0)内测,实在等不急官网放MIUI的包(其实是不想使用MIUI,设计风格跟原生差异太大)。
这几天就靠着以前的所积累的刷机经验,并且刷上刚适配的lineage os (CM14.1),以此为基础,替换AOSP(Android Open-Source Project)编码的应用。
再加 上pixel launcher 谷歌“亲儿子”的美化和Nougat的优化,对原生的安卓顿生好感。
当然,刷机过程也是比较曲折的,但总算没有白费精力,为了以后类似操作便捷,特地记录一下。
小米自从mi4后,为了增强安全性(防止大家乱刷机),至底层加入bl锁,导致刷入第一步需解锁,但刷机有风险,一旦解锁,就失去保修机会,且修改不可逆,小米会将设备解锁信息在服务器上保存,谨慎操作!
ADB下载地址:http://adbshell.com/downloads 选择ADB Kits
powershell 刷入命令
1 | .\fastboot flash recovery XXX.img |
1 | .\fastboot reboot |
去lineage os官网下载rom包和root包,在recovery模式下,用TWRP依次刷入两个包
网址:https://download.lineageos.org/
注意:根据设备cpu类型选择root包(我的是arm64,安卓7.1)
根据设备类型选择包
aroma : 图形化安装版本,可以自定义所需刷入的应用。(但有些机型会由于recovery的原因无法使用)。
super :最为完备的版本,该有的和不该有的都有了(比如日语输入法、注音输入法、等大陆用户基本上不会需要的应用)
stock :包括 nexus 出厂所具备的所有应用,在安装好 CM 、魔趣等系统后,刷入该包会自动替换掉 Aosp 的应用 ,比如 Google 相机、Gmail、Google Now 桌面、Google 相册分别替换掉 Aosp所带的 相机、 邮件、桌面、相册等,当然 Google全家桶的其他软件如 Gooele Play、Youtube、地图、Gooele keep等也会随之刷入你手机。
full :与 stock 唯一区别就在于不会替换掉 Aosp 应用。
mini、micro、nano、pico :依次减少应用,但都具备 Google service 和 Play
推荐nano包,但下载时需要一个稳定的梯子,建议用chrome直接下载,最后用TWRP刷入既可。
该布操作最简单,但比较繁琐,用root删除掉内置的一些不需要使用的google应用,比如其他语言输入法,删除完后重启手机一次。
用go hosts APP替换掉原始hosts,使设备能直接访问谷歌(该操作并不完美,但可以用做备用)
因为手机并不自带音效改善软件,且不带HIFI模块的手机插手机的音效很差,所以这里刷入现在口碑最好的viperfx音效,但直接刷入时会存在I/O报错,root报错等原因,所以这里借助Magisk框架修改系统API接口实现同等功能
Magisk 下载网址:https://forum.xda-developers.com/apps/magisk/official-magisk-v7-universal-systemless-t3473445
最终效果图
题目描述:
小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。
小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。
现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, … AN。
小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)?
输入:
第一行包含两个个整数N和K。
第二行包含N个整数A1, A2, … AN。
对于30%的数据,1 ≤ N ≤ 10
对于100%的数据,1 ≤ N ≤ 100000, 0 ≤ Ai ≤ 100000, 0 ≤ K ≤ 100000
输出:
一个整数,代表答案。
样例输入: 5 1 2 3 1 2 4 2 5 5 3
样例输出: 6
再比如,
样例输入:
10 1
2 1 1 1 1 4 4 3 4 4
样例输出: 8
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include
, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。
问题分析:
这题就相较于前几题就有难度提升,不在依靠于单一基础算法就能较好的解决问题。
比赛时,我一开始就认为搜索能解决问题,纸上推演的半个小时才发现有问题,始终是一个NP问题。后来经过分析:这样的策略可能达到解决问题的目的:
因为当K>0时,若选值为m的点,则应该选上值为m的所有点,依照桶排序的思想,进行优化
当K=0时,最大选择数=不同值的点的类别数
依照K值,形成关系链(可以为多条关系链)
单一关系链中,选择类数和并且不关联的最大一个或几个点,该算法应为动态规划
如图所示:
输入:
1 | 22 2 |
最大个数和:4 + 8 + 2 + 2 + 1 = 17
代码:
1 | #include <iostream> |