最新要闻
- 一季度苹果手机均价6800元 iPhone 14 Pro最畅销|全球即时看
- 上海漫展惊现“女菩萨”:还真有人顶礼膜拜-全球热头条
- AMD RX 7000全家倾巢出动 卡皇现世!苏姿丰:敬请期待
- 热心大哥高铁怒斥熊孩子家长获喝彩:掌声响起-世界最新
- 各地陆续迎来假期返程高峰
- 热推荐:汽油价格还要再大降?国际油价已跌超5%
- 全球今头条!徐州市人力和社会资源保障局网站_徐州市人力资源和社会保障网
- 最新:马斯克的星舰首飞:到底是成功了?还是失败了?
- 五一返程高峰遇强降雨 多地堵上加堵:局部140毫米大暴雨-热消息
- 天文专家回应哈尔滨现不明飞行物:可能是卫星残骸 没必要恐慌 每日资讯
- dotnetfx35无法安装_dotnetfx35
- 游客手机掉西湖被要1500元打捞费 景区:简单打捞不收费-全球观察
- 员工朋友圈未发广告被罚1万且开除:法院判赔5万 当前短讯
- 印度捷行航空申请破产 原因想不到:普惠发动机故障太多-视点
- 【e公司观察】原料涨价 锂电行业为何振奋不已?|当前看点
- 四川自贡一餐厅吃饭收15元空调费 店家:相当于雅间费-全球今头条
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
动态物体追踪 每日简讯
动态物体追踪
闲话
我个人是比较喜欢捣鼓一些程序设计,算法之类的。但毕竟是人工智能专业的,电子类大赛也必须去打,起初是导师让我来打这个比赛,后面发现还是很有挑战,很有意思的。一开始我对全国大学生电子设计大赛真的一点不懂,之前也没了解过。后来听导师说,我们团队做的都是些控制类题,这我还算能接受。如果纯硬件,让我画电路,那我水平真的不太行。
(资料图)
我拿到的是2021年国赛题——基于互联网的摄像测量系统。要求(1)是做两个独立摄像头出来,我直接用树莓派连摄像头,这也很简单。之前我也给树莓派装了系统,并且在树莓派里面装了OpenCV,后面肯定会用到机器视觉。要求(2)就是我这篇要写到的,两个摄像节点要实时检测摆动的激光笔,然后把激光笔的轮廓检测到并框出。
我一开始觉得,这也太没难度了吧,我随便一个二值化处理,然后对比度框一下。可是我看题目看到后面的时候我发现事情没那么简单!说明(4)中有一句话:拍摄背景为一般实验室场景,背景物体静止即可,不得要求额外处理;如果实验室背景很嘈杂的话,我的激光笔不是比较难检测,我用二值化处理了一下,果然并没有把背景和激光笔区分出来,我后续一顿操作都没有好的结果,虽然能把笔检测出来,但是如果有和笔相似的像素也会被误判。
然后我尝试用内置函数轮廓检测直接去用drawCoutours()画出来轮廓,效果不太行,还是那句话,背景太杂了,检测的轮廓太多了,检测的结果不是单一的激光笔。如果背景是纯白的话,那确实没什么难度!可惜如果背景嘈杂的话,检测一个物体还要精准的框出来确实不是那么容易。
之后我尝试读取视频的第一帧,把笔的样子保存下来,然后去匹配笔,实现单目标匹配。效果虽然还行,但是不确定太大了,如果是在比赛,匹配的结果不是那么好,直接原地退役。毕竟后面要算激光笔的摆长和角度。在检测上面不能有误差。
后面我找到一种比较好的方法,就是两帧画面作差。因为激光笔是不断摆动的,背景都是静止的,那差出来的像素就是激光笔的像素,然后我去把它用findCountours()框起来!这个效果在本地实现起来是很好的。然后我就去码通信部分了,我就用socket写了个客户端和服务端。然后发现大问题了!因为用的是帧差法,如果通信有一点网络波动两帧差的比较多,那么框出来的框就特别的“大“。如果出现这种情况,那误差……如果在本地的话我觉得这种方法真的是最优了!不管再多嘈杂的环境都没什么影响,就算放一万支一模一样的激光笔,我也能检测出动的那一支。只是有点可惜通信的话,不能采用这个方法。
后面我问了下学长,学长说背景肯定要是白色的呀,我当时的心情……我辛苦那么久想去处理背景的问题,没想到比赛的时候背景肯定要是全白!
那我还是回归老方法,直接去用内置函数去检测轮廓,不过有几个小细节。框的时候,如果有面积太小或者太大的噪点,直接给它Pass掉。还有就是检测的轮廓如果长宽比不是像笔那样的比例,也Pass掉。这样误差几乎降为0。
匹配法(效果差)
代码给我删掉了,不贴出来了
帧差法(本机效果好)
import cv2def fitter_img(frame): gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转成灰度图像 blur = cv2.GaussianBlur(gray, (5, 5), 0) # 高斯模糊 t, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY) # 二值化 dilated = cv2.dilate(thresh, None, iterations=3) # 膨胀 return dilatedcap = cv2.VideoCapture(0)ret, frame1 = cap.read()ret, frame2 = cap.read()while cap.isOpened(): diff = cv2.absdiff(frame1,frame2) mask = fitter_img(diff) # 寻找轮廓 contours, her = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for i in contours: x, y, w, h = cv2.boundingRect(i) if cv2.contourArea(i) < 200: continue cv2.rectangle(frame1, (x, y), (x + w, y + h), (0, 0, 255), 2) cv2.imshow("diff", diff) cv2.imshow("frame1", frame1) # cv2.imshow("mask", mask) # 前面一帧转成后面一帧 frame1 = frame2 ret, frame2 = cap.read() if cv2.waitKey(1) & 0xFF == ord("q"): breakcap.release()cv2.destroyAllWindows()
直接检测轮廓
这段代码我直接写在socket的服务端的,我直接贴出来。
import socketimport timeimport cv2import numpydef ReceiveVideo(): # IP地址"0.0.0.0"为等待客户端连接 address = ("0.0.0.0", 8002) # 建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925 # socket.AF_INET:服务器之间网络通信 # socket.SOCK_STREAM:流式socket , for TCP s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址. s.bind(address) # 开始监听TCP传入连接。参数指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。 s.listen(1) def recvall(sock, count): buf = b"" # buf是一个byte类型 while count: # 接受TCP套接字的数据。数据以字符串形式返回,count指定要接收的最大数据量. newbuf = sock.recv(count) if not newbuf: return None buf += newbuf count -= len(newbuf) return buf # 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。addr是连接客户端的地址。 # 没有连接则等待有连接 conn, addr = s.accept() print("connect from:" + str(addr)) while 1: start = time.time() # 用于计算帧率信息 length = recvall(conn, 16) # 获得图片文件的长度,16代表获取长度 stringData = recvall(conn, int(length)) # 根据获得的文件长度,获取图片文件 data = numpy.frombuffer(stringData, numpy.uint8) # 将获取到的字符流数据转换成1维数组 decimg = cv2.imdecode(data, cv2.IMREAD_COLOR) # 将数组解码成图像 # cv2.imshow("SERVER", decimg) # 显示图像 img = decimg # 进行下一步处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) coutours, h = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) for i in coutours: # 排除掉面积过大或过小的区域 if cv2.contourArea(i) < 1000 or cv2.contourArea(i) > 5000: continue x, y, w, h = cv2.boundingRect(i) # 排除不正确的面积比 if h < 2 * w or h > 8 * w: continue cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) cv2.imshow("img", img) # 将帧率信息回传,主要目的是测试可以双向通信 end = time.time() seconds = end - start fps = 1 / seconds; conn.send(bytes(str(int(fps)), encoding="utf-8")) k = cv2.waitKey(30) & 0xff if k == ord("q"): break s.close() cv2.destroyAllWindows()if __name__ == "__main__": ReceiveVideo()
客户端代码
上面有服务端的代码,怎么能少了客户端的呢?
import socketimport cv2import numpyimport timeimport sysdef SendVideo(): # 建立sock连接 # address要连接的服务器IP地址和端口号 address = ("192.168.31.110", 8002) try: # 建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925 # socket.AF_INET:服务器之间网络通信 # socket.SOCK_STREAM:流式socket , for TCP sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 开启连接 sock.connect(address) except socket.error as msg: print(msg) sys.exit(1) # 建立图像读取对象 capture = cv2.VideoCapture(0) # 读取一帧图像,读取成功:ret=1 frame=读取到的一帧图像;读取失败:ret=0 ret, frame = capture.read() # 压缩参数,后面cv2.imencode将会用到,对于jpeg来说,15代表图像质量,越高代表图像质量越好为 0-100,默认95 encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 15] while ret: # 停止0.1S 防止发送过快服务的处理不过来,如果服务端的处理很多,那么应该加大这个值 time.sleep(0.01) # cv2.imencode将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输 # ".jpg"表示将图片按照jpg格式编码。 result, imgencode = cv2.imencode(".jpg", frame, encode_param) # 建立矩阵 data = numpy.array(imgencode) # 将numpy矩阵转换成字符形式,以便在网络中传输 stringData = data.tostring() # 先发送要发送的数据的长度 # ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串 sock.send(str.encode(str(len(stringData)).ljust(16))); # 发送数据 sock.send(stringData); # 读取服务器返回值 receive = sock.recv(1024) if len(receive): print(str(receive, encoding="utf-8")) # 读取下一帧图片 ret, frame = capture.read() if cv2.waitKey(10) == 27: break sock.close()if __name__ == "__main__": SendVideo()
总结
其实我当时想这个背景问题,想了很久,用了10几种方法吧,但是其他的方法简直太不科学了!还是老老实实用库函数吧!不过我真的是喜欢帧差法,效果真的很棒!可惜通信太拉了!
效果图
关键词:
动态物体追踪 每日简讯
一季度苹果手机均价6800元 iPhone 14 Pro最畅销|全球即时看
上海漫展惊现“女菩萨”:还真有人顶礼膜拜-全球热头条
ASP.NET Core MVC 从入门到精通之HttpContext
24 操作系统的网络架构
AMD RX 7000全家倾巢出动 卡皇现世!苏姿丰:敬请期待
热心大哥高铁怒斥熊孩子家长获喝彩:掌声响起-世界最新
各地陆续迎来假期返程高峰
热推荐:汽油价格还要再大降?国际油价已跌超5%
全球今头条!徐州市人力和社会资源保障局网站_徐州市人力资源和社会保障网
最新:马斯克的星舰首飞:到底是成功了?还是失败了?
五一返程高峰遇强降雨 多地堵上加堵:局部140毫米大暴雨-热消息
天文专家回应哈尔滨现不明飞行物:可能是卫星残骸 没必要恐慌 每日资讯
KubeVela 稳定性及可扩展性评估_环球微动态
随机造数据的技巧总结
dotnetfx35无法安装_dotnetfx35
游客手机掉西湖被要1500元打捞费 景区:简单打捞不收费-全球观察
员工朋友圈未发广告被罚1万且开除:法院判赔5万 当前短讯
印度捷行航空申请破产 原因想不到:普惠发动机故障太多-视点
环球聚焦:appuploader 入门使用
环球快看点丨1、etcd基础介绍
【实变函数】01 - 更合理的积分
每日信息:关于如何使用pandas将不同的数据写入到同一个Excel的不同Sheet表中
【世界新视野】1159 Structure of a Binary Tree + 根据前序和中序构建二叉树+ 层序遍历模板复习
【e公司观察】原料涨价 锂电行业为何振奋不已?|当前看点
四川自贡一餐厅吃饭收15元空调费 店家:相当于雅间费-全球今头条
各主要高速公路、国省道干线交通总体安全顺畅 最新消息
热讯:写几行代码,了解响应式原理
第139篇:JS数组常用方法(map(),reduce(),foreach())
83.赋值运算符
IMF:中国将成为今年亚太地区经济增长关键驱动因素
有钱人为何在意电动车电费?李想用超级富豪朋友习惯解释原因-全球讯息
环球速看:格科微: 格科微有限公司关于公司实际控制人、董事长、首席执行官提议公司回购股份的公告
【2023 · CANN训练营第一季】昇腾AI入门Pytorch
世界微动态丨23 网络数据在内核中流转
ZooKeeper 避坑指南: ZooKeeper 3.6.4 版本 BUG 导致的数据不一致问题
5月3日全国铁路迎来返程客流高峰 预计发送旅客1935万人次 世界独家
上海妍秀国际医疗美容诊所医生以及擅长项目推荐
报道:上半年最后一个假 端午节放3天:假期后需连上6天班
《街霸6》新角色韩蛛俐介绍片:疯美人脚法了得-全球观天下
Bash—source命令&export命令&bashrc文件
最新快讯!三星宣布多款旧设备停止更新支持
清仓特价 森马板鞋/运动鞋39元起、T恤29元起-要闻速递
今日快讯:又一个小米6钉子户消失 米粉给妈妈换小米13 雷军点赞
22 URL到网卡:网络数据流动
“广州市十佳科普使者”出炉|全球观察
五一余额不足 最后一天返程现场排长队 网友:凌晨出门照堵不误
“插队婆孙”被做成恶搞表情包:如此“网暴”是否合适?
【全球聚看点】OpenAI API keys 的申请和测试小结
母子争吵儿子走丢 机场民警15分钟帮找到孩子|播资讯
【世界速看料】最便宜的16GB显存显卡出现了!AMD、NVIDIA统统靠边站
焦点报道:苹果、谷歌起草追踪设备行业规范:打击滥用定位功能
当前短讯!实惨!男子拍演唱会:激光导致手机摄像头直接报废
Realme 11 Pro+ 5G 曝光 在5月10日发布
66元的的钟薛高在东北只要3.8元一根!商家回应
开眼!丰田为混动车申请“手动挡”专利:只为保留驾驶乐趣 环球热推荐
游客停车31小时被收640元:明码标价 但已退还
Blazor学习之旅系列总结目录
国铁集团郑州局预计3日客流创历史新高
小学生写人作文开头结尾集锦_小学生写人作文-观速讯
【天天时快讯】阿维塔定金72小时内可退成空话 店长:“已锁单”
汽车盗窃案上升548% 纽约市免费发放500个苹果AirTag应对
【当前独家】 男子吐槽在景区停车场一路捡到26个螺丝钉 官方回应
青海省西宁市城西区西川南路消防救援站站长助理玛尼坚——磨砺技能 守护平安(劳动者之歌)
多地消费市场见闻
世界资讯:客户抛弃雷克萨斯LM来买 腾势D9 4月销量10526辆
19.99万元期待落空 打价格战的特斯拉为何突然涨价:利润下滑
观速讯丨Intel AVX-512指令集要回来!残血版?AMD正尽情享受
世界最资讯丨艾玛·沃森曝光新写真 透露2024年开拍新电影
24小时不打烊,365天对外接待……“临汾好办”不要太方便! 环球播资讯
每日热文:前缀和
可怜的欧美!RTX 3070上市两年半 终于破发|今头条
环球头条:雷蛇噬魂鲨极速版耳机发布:50mm驱动单元、30小时续航
别只会“王者峡谷五日游” 这几款游戏才是假期最佳解
每日关注!4月新能源销量:比亚迪、埃安、理想全线杀疯
全球要闻:巨亏236亿元!三星内存、闪存要减产25%
天天热头条丨“天空之城”游人如织
学系统集成项目管理工程师(中项)系列16b_风险管理(下)
世界观点:4年来首次下滑 AMD发布Q1季度财报:锐龙处理器成重灾区
五菱缤果营销比亚迪海豚话术曝光:颜值高、空间大
【速看料】五一后机票价格暴跌 飞三亚从2800降到280元 专家表态:很正常
联合国秘书长:呼吁以色列停止行政拘留的做法|全球观焦点
python图像处理库
Java读取数据库表
世界今热点:徊的拼音_徊怎么组词
流媒体时代谋生艰难!好莱坞编剧15年来将首次罢工
为何插电混动车主爱在外充电 理想高管分析:薅羊毛感觉爽
当前资讯!司机等红绿灯时看手机被罚200扣3分 车是静止状态:网友吵翻 但事实没错
NV一代神卡卷土重来!Steam新报告:RTX 40降价仍没存在感_当前热议
五一想在户外看电影、选购投影仪一定要注意这几点
浙商证券研究所所长助理陈杭离职:否认网传800万年薪,专心处理舆论_世界热资讯
81.数组 全球热门
Win11“颠覆性”功能被遗弃:失效三个月仍被微软无视
嘴硬还是明智?丰田高管:电动汽车技术不成熟、混动才实用
同花顺ai机构活跃度指标公式源码_活跃度100
Android-图片压缩(二)-纯干货
C# 常量 结构体 委托 热门看点
喝的二五八万是什么意思_二五八万是什么意思
性能达SteamDeck两倍!华硕ROG Ally掌机先行开箱来了
奇葩!插队发飙者称是换队 网友吐槽发飙发泼有理:景区称仍算插队