利用OpenCV、Python和Ubidots构建行人计数器程序附完整代码.docx

上传人:安*** 文档编号:73275157 上传时间:2023-02-17 格式:DOCX 页数:13 大小:23.88KB
返回 下载 相关 举报
利用OpenCV、Python和Ubidots构建行人计数器程序附完整代码.docx_第1页
第1页 / 共13页
利用OpenCV、Python和Ubidots构建行人计数器程序附完整代码.docx_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《利用OpenCV、Python和Ubidots构建行人计数器程序附完整代码.docx》由会员分享,可在线阅读,更多相关《利用OpenCV、Python和Ubidots构建行人计数器程序附完整代码.docx(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)11月30日,2021亚马逊云科技re:Invent全球大会,即将浩大开启!2021re:Invent十周年度十分活动,内容的饕餮盛宴,涵盖产品、行业、社区等专题!立即预约|JoseGarcia译者|吴振东校对|张一豪、林亦霖编辑|于腾凯来源|数据派IDdatapi导读本文将利用OpenCVPython以及Ubidots来编写一个行人计数器程序并对代码进展了较为详细的讲解。数字图像处理DIP技术目前开展非常迅速这在很大程度上要归功于开发人员可以访问云来运用机器学习技术。通过云处理数字图像可以绕过任何专用硬件的要求这使

2、得使用DIP成为了大众的首选。作为处理图像最经济以及最通用的方法DIP已经被广泛应用。这种其中最常见的当属行人检测以及计数-这对于机场、火车站、零售店体育馆、公共活动以及博物馆来讲都是一项非常有用的指标。现有的传统行人计数技术不仅价格昂贵而且它们所生成的数据通常与专有系统相关联这些系统限制了数据提取以及KPI的优化选择。相反使用你的个人相机以及SBC的嵌入式DIP不仅可以节省时间以及金钱还可以根据你所关注的KPI来自由定制应用程序并从云中获取独特的领悟。使用云来启用DIPIoT物联网应用程序可以增强整体的功能性。随着可视化、报告、警报以及穿插引用外部数据源如天气、实时供给商定价或者业务管理系统

3、等功能的增强DIP为开发人员提供了他们所需的自由空间。想象一下一家摆着冰淇淋冰柜的杂货店他们想要追踪统计经过店门口的人数顾客所选择的产品和门被翻开的次数以及冰柜的内部温度。从这几个数据点中零售商可以运行相关性分析以更好地解析以及优化他们的产品定价以及冰箱的整体能耗。为了开启你的数字图像处理应用程序开发工作Ubidots运用OpenCV以及Python来创立了一套人员计数系统教程用于分析统计给定区域中的人数。其实不仅是统计人数这样简单添加UbidotsIoT开发平台的资源还可以扩展你的应用程序。在这里你可以看到怎样实现利用Ubidots来构建的实时人数统计仪表板。在本文中我们将介绍怎样使用Ope

4、nCV以及Ubidots来实现简单的DIP叠加并创立行人计数器。此例如最适用于任何基于Linux的发行版系统也适用于RaspberryPiOrangePi或者类似的嵌入式系统。有关其他集成的查询请与Ubidots支持中心获得联络以便来解析你的企业怎样使用这项增值技术。目录应用需求编码8个小节测试创造你自己的仪表板结果展示1、应用需求任何带有Ubuntu衍生版本的嵌入式Linux操作系统中安装了Python3或者更高版本OS中安装了OpenCV3.0或者更高版本。假如使用Ubuntu或者其衍消费品请按照官方安装教程或者运行以下命令pipinstallopencv-contrib-python当你

5、成功安装Python3以及OpenCV时你可以通过这段简单的代码来进展检验首先在你的terminal里输入pythonimportcv2cv2._version_你应该在屏幕上看到你所安装的OpenCV版本按照官方操作指南来安装Numpy或运行下面的命令pipinstallnumpy安装imutilspipinstallimutils安装requestspipinstallrequests2、编码可以在这一章节找到检测以及发送数据的整个例程。为了更好地解释这段代码我们将其分为八个局部以便更好地解释代码的各个方面让你更容易理解。第1节fromimutils.object_detectionimp

6、ortnon_max_suppressionimportnumpyasnpimportimutilsimportcv2importrequestsimporttimeimportargparseURL_EDUCATIONAL:/things.ubidotsURL_INDUSTRIAL:/industrial.api.ubidotsINDUSTRIAL_USERTrue#SetthistoFalseifyouareaneducationaluserTOKEN.#PuthereyourUbidotsTOKENDEVICEdetector#Devicewherewillbestoredtheresu

7、ltVARIABLEpeople#Variablewherewillbestoredtheresult#Opencvpre-trainedSVMwithHOGpeoplefeaturesHOGCVcv2.HOGDescriptor()HOGCV.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()在第1节中我们导入必要的库来实现我们的探测器imutils是一个有用的DIP库工具让我们从结果中执行不同的转换cv2是我们的OpenCVPython包装器requests可以通过HTTP发送数据/结果到Ubidotsargparse让我

8、们从脚本中的命令终端来读取命令。重要提示不要忘记使用您的Ubidots帐户TOKEN更改这段代码假如是学生用户请务必将INDUSTRIAL_USER设置为FALSE。导入库后我们将对方向梯度直方图HistogramofOrientedGradient进展初始化。方向梯度直方图的简称是HOG它是最受欢送的对象检测技术之一已经在多个应用程序中实现并获得成功。OpenCV已经以高效的方式将HOG算法与支持向量机这种用于预测目的的经典机器学习技术SVM相结合成为了一笔我们可以利用的财富。这项声明cv2.HOGDescriptor_getDefaultPeopleDetector调用了预先训练的模型用于

9、OpenCV的行人检测并提供支持向量机特征的评估功能。第2节defdetector(image):imageisanumpyarrayimageimutils.resize(image,widthmin(400,image.shape1)cloneimage.copy()(rects,weights)HOGCV.detectMultiScale(image,winStride(8,8),padding(32,32),scale1.05)#Appliesnon-maxsupressionfromimutilspackagetokick-offoverlapped#boxesrectsnp.arr

10、ay(x,y,xw,yhfor(x,y,w,h)inrects)resultnon_max_suppression(rects,probsNone,overlapThresh0.65)returnresultdetector()函数是“神奇诞生的地方它可以接收分成三个颜色通道的RGB图像。为了防止出现性能问题我们用imutils来调整图像大小再从HOG对象调用detectMultiScale()方法。然后检测多尺度方法可以让我们使用SVM的分类结果去分析图像并知晓人是否存在。关于此方法的参数介绍超出了本教程的范围但假如你想解析更多信息请参阅官方OpenCV文档或者查看AdrianRosebro

11、ck的精彩解释。HOG分析将会生成一些捕获框针对检测到的对象但有时这些框的重叠会导致误报或者检测错误。为了防止这种混淆我们将使用imutils库中的非最大值抑制实用程序来删除重叠的框-如下所示图片转载自s:/pyimagesearch第3节deflocalDetect(image_path):resultimagecv2.imread(image_path)iflen(image)0:print(ERRORcouldnotreadyourlocalimage)returnresultprint(INFODetectingpeople)resultdetector(image)#showsthe

12、resultfor(xA,yA,xB,yB)inresult:cv2.rectangle(image,(xA,yA),(xB,yB),(0,255,0),2)cv2.imshow(result,image)cv2.waitKey(0)cv2.destroyAllWindows()return(result,image)如今在这一局部代码中我们必须定义一个函数来从本地文件中读取图像并检测其中是否有人存在。为了实现这一点我只是简单地调用了detector函数并添加了一个简单的循环来绘制探测器的圆框。它会返回检测到的框的数量以及带有绘制检测的图像。然后只需在新的OS窗口中重新创立结果即可。第4节de

13、fcameraDetect(token,device,variable,sample_time5):capcv2.VideoCapture(0)inittime.time()#AllowedsampletimeforUbidotsis1dot/secondifsample_time1:sample_time1while(True):#Captureframe-by-frameret,framecap.read()frameimutils.resize(frame,widthmin(400,frame.shape1)resultdetector(frame.copy()#showstheresu

14、ltfor(xA,yA,xB,yB)inresult:cv2.rectangle(frame,(xA,yA),(xB,yB),(0,255,0),2)cv2.imshow(frame,frame)#Sendsresultsiftime.time()-initsample_time:print(INFOSendingactualframeresults)#Convertstheimagetobase64andaddsittothecontextb64convert_to_base64(frame)contextimage:b64sendToUbidots(token,device,variabl

15、e,len(result),contextcontext)inittime.time()ifcv2.waitKey(1)0xFFord(q):break#Wheneverythingdone,releasethecapturecap.release()cv2.destroyAllWindows()defconvert_to_base64(image):imageimutils.resize(image,width400)img_strcv2.imencode(.png,image)1.tostring()b64base64.b64encode(img_str)returnb64.decode(

16、utf-8)与第3节的函数类似第4节的函数将调用detector方法以及绘图框并使用OpenCV中的VideoCapture方法直接从网络摄像头检索图像。我们还略微修改了officialOpenCV进而在相机中获取图像并且每隔“n秒将结果发送到一个Ubidots帐户sendToUbidots()函数将在本教程的后面局部进展回首。函数convert_to_base64()会将图像转换为根本的64位字符串这个字符串对于在HTMLCanvaswidget中使用JavaScript代码查看Ubidots中的结果非常重要。第5节defdetectPeople(args):image_pathargsim

17、agecameraTrueifstr(argscamera)trueelseFalse#Routinetoreadlocalimageifimage_path!Noneandnotcamera:print(INFOImagepathprovided,attemptingtoreadimage)(result,image)localDetect(image_path)print(INFOsendingresults)#Convertstheimagetobase64andaddsittothecontextb64convert_to_base64(image)contextimage:b64#S

18、endstheresultreqsendToUbidots(TOKEN,DEVICE,VARIABLE,len(result),contextcontext)ifreq.status_code400:print(ERRORCouldnotsenddatatoUbidots)returnreq#Routinetoreadimagesfromwebcamifcamera:print(INFOreadingcameraimages)cameraDetect(TOKEN,DEVICE,VARIABLE)这个方法旨在通过终端插入参数并触发例程对本地存储的图像文件或者通过网络摄像来搜索行人。第6节defb

19、uildPayload(variable,value,context):returnvariable:value:value,context:contextdefsendToUbidots(token,device,variable,value,context,industrialTrue):#BuildstheendpointurlURL_INDUSTRIALifindustrialelseURL_EDUCATIONALurl/api/v1.6/devices/.format(url,device)payloadbuildPayload(variable,value,context)head

20、ersX-Auth-Token:token,Content-Type:application/jsonattempts0status400whilestatus400andattempts5:reqrequests.post(urlurl,headersheaders,jsonpayload)statusreq.status_codeattempts1time.sleep(1)returnreq第6节的这两个函数是把结果发送给Ubidots进而理解以及对数据进展可视化的两条主干道。第一个函数defbuildPayload是在恳求中构建有效的负载而第二个函数defsendToUbidots那么接

21、收你的Ubidots参数TOKEN变量以及设备标签用于存储结果。在这种情况下OpenCV可以检测到圆盒的长度。作为备选可以以发送上下文来将结果存储为base64图像以便稍后进展检索。第7节defargsParser():apargparse.ArgumentParser()ap.add_argument(-i,-image,defaultNone,helppathtoimagetestfiledirectory)ap.add_argument(-c,-camera,defaultFalse,helpSetastrueifyouwishtousethecamera)argsvars(ap.par

22、se_args()returnargs对于第7节我们即将完成对代码的分析。函数argsParser()简单地解析并通过终端将脚本的参数以字典的形式返回。在解析器中有两个参数image在你的系统中图片文件的途径camera这个变量假如设置为true那么就会调用cameraDetect()方法第8节defmain():argsargsParser()detectPeople(args)if_name_main_:main()第8节是我们主函数代码中的最终局部只是用来获取console中的参数然后提议指定的程序。别忘了全部的代码都可以从Github上下载。3、测试翻开你最喜欢的代码编辑器sublim

23、e-textnotepadnano等然后复制并粘贴此处所提供的完好代码。使用你特定的UbidotsTOKEN更新代码并将文件另存为“peopleCounter.py。正确保存代码后让我们从CaltechDataset以及Pexels公共数据集中随机选择的下面四个图像来进展测试为了对这些图像进展分析首先你必须将图像存储在笔记本电脑或者PC中并记录好要分析图像的存放途径。pythonpeopleCounter.pyPATH_TO_IMAGE_FILE在我的例子中我将图像存储在标记为“dataset的途径中。要执行一项有效的命令请运行以下命令但请更换为你个人的文件存放途径。pythonpeopleC

24、ounter.py-idataset/image_1.png假如你祈望是从相机而不是本地文件中获取图像只需运行以下命令pythonpeopleCounter.py-ctrue测试结果除了这种查看测试结果的方式之外你还可以实时查看存储在Ubidots帐户中的测试的结果4、创造你自己的仪表板我们将使用HTMLCanvas来实时观察所获得的结果本教程不对HTMLcanvaswidget做讲解假如你不解析怎样使用它们请参阅以下文章CanvasWidgetExamplesCanvasWidgetIntroductoryDemoCanvasCreatingaRealTimeWidget我们将使用根本的实时

25、例如加上微小的修改便于观看我们的图像。你可以在下面看到关于widget的代码。HTMLimgidimgwidth400pxheightauto/JSvarsocket;varsrvindustrial.ubidots:443/varsrvapp.ubidots:443/UncommentthislineifyouareaneducationaluservarVAR_ID5ab402dabbddbd3476d85967/PuthereyourvarIdvarTOKEN/Puthereyourtoken$(document).ready(function()functionrenderImage(

26、imageBase64)if(!imageBase64)return;$(#img).attr(src,data:image/png;base64,imageBase64);/Functiontoretrievethelastvalue,itrunsonlyoncefunctiongetDataFromVariable(variable,token,callback)varurls:/things.ubidots/api/v1.6/variables/variable/valuesvarheadersX-Auth-Token:token,Content-Type:application/jso

27、n;$.ajax(url:url,method:GET,headers:headers,data:page_size:1,success:function(res)if(res.results.length0)renderImage(res.results0.context.image);callback(););/Implementstheconnectiontotheserversocketio.connect(s:/srv,path:/notificationsvarsubscribedVars;/FunctiontopublishthevariableIDvarsubscribeVar

28、iablefunction(variable,callback)/PublishesthevariableIDthatwishestolistensocket.emit(rt/variables/id/last_value,variable:variable);/Listensforchangessocket.on(rt/variables/variable/last_value,callback);subscribedVars.push(variable);/FunctiontounsubscribedforlisteningvarunSubscribeVariablefunction(va

29、riable)socket.emit(unsub/rt/variables/id/last_value,variable:variable);varpstsubscribedVars.indexOf(variable);if(pst!-1)subscribedVars.splice(pst,1);varconnectSocketfunction()/Implementsthesocketconnectionsocket.on(connect,function()console.log(connectsocket.emit(authentication,token:TOKEN););window

30、.addEventListener(online,function()console.log(onlinesocket.emit(authentication,token:TOKEN););socket.on(authenticated,function()console.log(authenticatedsubscribedVars.forEach(function(variable_id)socket.emit(rt/variables/id/last_value,variable:variable_id);););/*MainRoutine*/getDataFromVariable(VA

31、R_ID,TOKEN,function()connectSocket(););connectSocket();/connectSocket();/SubscribeVariablewithyourowncode.subscribeVariable(VAR_ID,function(value)varparsedValueJSON.parse(value);console.log(parsedValue);/$(#img).attr(src,data:image/png;base64,parsedValue.context.image);renderImage(parsedValue.contex

32、t.image););不要忘记把你的帐户TOKEN以及变量ID放在代码段的开始。第三局部的LIBRARIES增加下面第三局部的librariess:/ajax.googleapis/ajax/libs/jquery/3.2.1/jquery.min.jss:/5、结果展示在此链接中你可以看到带有结果的仪表板。在本文中我们讨论了怎样使用DIP图像处理OpenCV以及Ubidots来创立物联网人员计数器。通过这些效劳在对人物、场景或者事物的检测与识别问题上你的DIP应用程序会比PIR或者其他光学传感器更加准确这套程序提供了高效的行人计数器而且不需要对早期数据的静态进展任何操作。做一个快乐的码农关于

33、JoseGarcaUIS电子工程师Ubuntu用户布卡拉曼加人程序员有时很无聊想要环游世界但却没太有祈望完成这一梦想。硬件以及软件开发人员Ubidots译者介绍法国洛林大学计算机与决策专业硕士。现从事人工智能以及大数据相关工作以成为数据科学家为终生奋斗目的。来自山东济南不会开挖掘机但写得了Java、Python以及PPT。原文标题PeopleCountingwithOpenCV,PythonUbidots原文链接s:/ubidots/blog/people-counting-with-opencv-python-and-ubidots/ (*本文为AI科技大本营转载文章转载请联络)精彩推荐倒计时由易观携手CSDN结合主办的第三届易观算法大赛还剩5天冠军团队将获得3万元本次比赛主要预测访问平台的相关事件的PV,UV流量包括Web端挪动端等大赛将会提供相应事件的流量数据和对应时间段内的所有事件明细表以及用户属性表等数据进展模型训练并用训练好的模型预测规定日期范围内的事件流量。推荐浏览知乎算法团队负责人孙付伟

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 工程图纸

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁