应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

目标跟踪(3)MultiTracker基于OpenCV(CP

  在这篇文章中,我们将介绍如何使用通过MultiTracker类实现的OpenCV的多对象跟踪API。我们将共享C和Python代码。
  1。为什么我们需要多目标跟踪
  大多数计算机视觉和机器学习的初学者都学习对象检测。如果您是初学者,您可能会想为什么我们需要对象跟踪。我们不能只检测每一帧中的对象吗?
  让我们来探究一下跟踪是有用的几个原因。
  首先,当在视频帧中检测到多个对象(例如人)时,跟踪有助于跨帧建立对象的身份。
  其次,在某些情况下,对象检测可能会失败,但仍可能跟踪对象,因为跟踪考虑了对象在前一帧中的位置和外观。
  第三,一些跟踪算法非常快,因为它们做的是局部搜索,而不是全局搜索。因此,我们可以通过每n帧进行目标检测,并在中间帧中跟踪目标,从而为我们的系统获得很高的帧率。
  那么,为什么不在第一次检测后无限期地跟踪对象呢?跟踪算法有时可能会丢失它正在跟踪的对象。例如,当对象的运动太大时,跟踪算法可能跟不上。许多现实世界的应用程序同时使用检测和跟踪。
  在本教程中,我们只关注跟踪部分。我们想要跟踪的对象将通过拖动它们周围的包围框来指定。2。MultiTracker:OpenCV的多对象跟踪器
  OpenCV中的MultiTracker类提供了多目标跟踪的实现。它是一个简单的实现,因为它独立处理跟踪对象,而不对跟踪对象进行任何优化。
  让我们逐步查看代码,了解如何使用OpenCV的多目标跟踪API。
  2。1第1步:创建单一对象跟踪器
  多目标跟踪器只是单目标跟踪器的集合。我们首先定义一个函数,该函数接受一个跟踪器类型作为输入,并创建一个跟踪器对象。OpenCV有8种不同的跟踪器类型:BOOSTING,MIL,KCF,TLD,MEDIANFLOW,GOTURN,MOSSE,CSRT。
  如果您想使用GOTURN跟踪器,请务必阅读这篇文章并下载caffe模型。
  在下面的代码中,给定跟踪器类的名称,我们返回跟踪器对象。这将在稍后用于多目标跟踪器。
  Pythonfromfutureimportprintfunctionimportsysimportcv2fromrandomimportrandinttrackerTypes〔BOOSTING,MIL,KCF,TLD,MEDIANFLOW,GOTURN,MOSSE,CSRT〕defcreateTrackerByName(trackerType):CreateatrackerbasedontrackernameiftrackerTypetrackerTypes〔0〕:trackercv2。TrackerBoostingcreate()eliftrackerTypetrackerTypes〔1〕:trackercv2。TrackerMILcreate()eliftrackerTypetrackerTypes〔2〕:trackercv2。TrackerKCFcreate()eliftrackerTypetrackerTypes〔3〕:trackercv2。TrackerTLDcreate()eliftrackerTypetrackerTypes〔4〕:trackercv2。TrackerMedianFlowcreate()eliftrackerTypetrackerTypes〔5〕:trackercv2。TrackerGOTURNcreate()eliftrackerTypetrackerTypes〔6〕:trackercv2。TrackerMOSSEcreate()eliftrackerTypetrackerTypes〔7〕:trackercv2。TrackerCSRTcreate()else:trackerNoneprint(Incorrecttrackername)print(Availabletrackersare:)fortintrackerTypes:print(t)returntracker
  C注意:除了包含opencv2opencv。hpp,还需要包含opencv2tracking。hpp。includeopencv2opencv。hppincludeopencv2tracking。hppusingnamespacecv;usingnamespacestd;vectorstringtrackerTypes{BOOSTING,MIL,KCF,TLD,MEDIANFLOW,GOTURN,MOSSE,CSRT};createtrackerbynamePtrTrackercreateTrackerByName(stringtrackerType){PtrTrackertracker;if(trackerTypetrackerTypes〔0〕)trackerTrackerBoosting::create();elseif(trackerTypetrackerTypes〔1〕)trackerTrackerMIL::create();elseif(trackerTypetrackerTypes〔2〕)trackerTrackerKCF::create();elseif(trackerTypetrackerTypes〔3〕)trackerTrackerTLD::create();elseif(trackerTypetrackerTypes〔4〕)trackerTrackerMedianFlow::create();elseif(trackerTypetrackerTypes〔5〕)trackerTrackerGOTURN::create();elseif(trackerTypetrackerTypes〔6〕)trackerTrackerMOSSE::create();elseif(trackerTypetrackerTypes〔7〕)trackerTrackerCSRT::create();else{coutIncorrecttrackernameendl;coutAvailabletrackersare:endl;for(vectorstring::iteratorittrackerTypes。begin();it!trackerTypes。end();it)std::coutitendl;}returntracker;}
  2。2第2步:读取视频的第一帧
  多目标跟踪器需要两个输入一个视频帧我们要跟踪的所有对象的位置(边界框)。
  给定这些信息,跟踪器在所有后续帧中跟踪这些指定对象的位置。在下面的代码中,我们首先使用VideoCapture类加载视频并读取第一帧。这将在稍后用于初始化MultiTracker。
  PythonSetvideotoloadvideoPathvideosrun。mp4Createavideocaptureobjecttoreadvideoscapcv2。VideoCapture(videoPath)Readfirstframesuccess,framecap。read()quitifunabletoreadthevideofileifnotsuccess:print(Failedtoreadvideo)sys。exit(1)
  CsetdefaultvaluesfortrackingalgorithmandvideostringvideoPathvideosrun。mp4;InitializeMultiTrackerwithtrackingalgovectorRectbboxes;createavideocaptureobjecttoreadvideoscv::VideoCapturecap(videoPath);Matframe;quitifunabketoreadvideofileif(!cap。isOpened()){coutErroropeningvideofilevideoPathendl;return1;}readfirstframecapframe;
  2。3第3步:在第一帧中定位对象
  接下来,我们需要在第一帧中定位我们想要跟踪的对象。该位置只是一个边界框。OpenCV提供了一个名为selectROI的函数,该函数会弹出一个GUI来选择边界框(也称为感兴趣区域(ROI))。在C版本中,selectROI允许您获取多个边界框,但在Python版本中,它只返回一个边界框。所以,在Python版本中,我们需要一个循环来获取多个边界框。对于每个对象,我们还选择一种随机颜色来显示边界框。代码如下所示。
  PythonSelectboxesbboxes〔〕colors〔〕OpenCV的selectROI函数不适用于在Python中选择多个对象所以我们将循环调用这个函数,直到我们完成选择所有对象whileTrue:在对象上绘制边界框selectROI的默认行为是从中心开始绘制框当fromCenter设置为false时,可以从左上角开始画框bboxcv2。selectROI(MultiTracker,frame)bboxes。append(bbox)colors。append((randint(0,255),randint(0,255),randint(0,255)))print(Pressqtoquitselectingboxesandstarttracking)print(Pressanyotherkeytoselectnextobject)kcv2。waitKey(0)0xFFif(k113):qispressedbreakprint(Selectedboundingboxes{}。format(bboxes))
  CGetboundingboxesforfirstframeselectROIsdefaultbehaviouristodrawboxstartingfromthecenterwhenfromCenterissettofalse,youcandrawboxstartingfromtopleftcornerboolshowCrosshairtrue;boolfromCenterfalse;cout;coutOpenCVsayspressctocancelobjectsselectionprocessendl;coutItdoesntwork。PressEscapetoexitselectionprocessendl;cout;cv::selectROIs(MultiTracker,frame,bboxes,showCrosshair,fromCenter);quitiftherearenoobjectstotrackif(bboxes。size()1)return0;vectorScalarcolors;getRandomColors(colors,bboxes。size());
  getRandomColors函数相当简单FillthevectorwithrandomcolorsvoidgetRandomColors(vectorScalarcolors,intnumColors){RNGrng(0);for(inti0;inumColors;i)colors。pushback(Scalar(rng。uniform(0,255),rng。uniform(0,255),rng。uniform(0,255)));}
  2。4第3步:初始化MultiTracker
  到目前为止,我们已经读取了第一帧并获得了对象周围的边界框。这就是我们初始化多目标跟踪器所需的所有信息。
  我们首先创建一个MultiTracker对象,并向其中添加与边界框一样多的单个对象跟踪器。在此示例中,我们使用CSRT单对象跟踪器,但您可以通过将下面的trackerType变量更改为本文开头提到的8个跟踪器之一来尝试其他跟踪器类型。CSRT跟踪器不是最快的,但在我们尝试的许多情况下它产生了最好的结果。
  您还可以使用包裹在同一个MultiTracker中的不同跟踪器,但当然,这没什么意义。
  MultiTracker类只是这些单个对象跟踪器的包装器。正如我们从上一篇文章中知道的那样,单个对象跟踪器是使用第一帧初始化的,并且边界框指示我们想要跟踪的对象的位置。MultiTracker将此信息传递给它在内部包装的单个对象跟踪器。
  PythonSpecifythetrackertypetrackerTypeCSRTCreateMultiTrackerobjectmultiTrackercv2。MultiTrackercreate()InitializeMultiTrackerforbboxinbboxes:multiTracker。add(createTrackerByName(trackerType),frame,bbox)
  CSpecifythetrackertypestringtrackerTypeCSRT;CreatemultitrackerPtrMultiTrackermultiTrackercv::MultiTracker::create();Initializemultitrackerfor(inti0;ibboxes。size();i)multiTrackeradd(createTrackerByName(trackerType),frame,Rect2d(bboxes〔i〕));
  2。5第4步:更新MultiTracker并显示结果
  最后,我们的MultiTracker已准备就绪,我们可以在新帧中跟踪多个对象。我们使用MultiTracker类的update方法来定位新框架中的对象。每个跟踪对象的每个边界框都使用不同的颜色绘制。
  PythonProcessvideoandtrackobjectswhilecap。isOpened():success,framecap。read()ifnotsuccess:breakgetupdatedlocationofobjectsinsubsequentframessuccess,boxesmultiTracker。update(frame)drawtrackedobjectsfori,newboxinenumerate(boxes):p1(int(newbox〔0〕),int(newbox〔1〕))p2(int(newbox〔0〕newbox〔2〕),int(newbox〔1〕newbox〔3〕))cv2。rectangle(frame,p1,p2,colors〔i〕,2,1)showframecv2。imshow(MultiTracker,frame)quitonESCbuttonifcv2。waitKey(1)0xFF27:Escpressedbreak
  Cwhile(cap。isOpened()){getframefromthevideocapframe;Stoptheprogramifreachedendofvideoif(frame。empty())break;UpdatethetrackingresultwithnewframemultiTrackerupdate(frame);Drawtrackedobjectsfor(unsignedi0;imultiTrackergetObjects()。size();i){rectangle(frame,multiTrackergetObjects()〔i〕,colors〔i〕,2,1);}Showframeimshow(MultiTracker,frame);quitonxbuttonif(waitKey(1)27)break;}
  3。完整代码
  Cincludeopencv2opencv。hppincludeopencv2tracking。hppusingnamespacecv;usingnamespacestd;vectorstringtrackerTypes{BOOSTING,MIL,KCF,TLD,MEDIANFLOW,GOTURN,MOSSE,CSRT};按名称创建跟踪器PtrTrackercreateTrackerByName(stringtrackerType){PtrTrackertracker;if(trackerTypetrackerTypes〔0〕)trackerTrackerBoosting::create();elseif(trackerTypetrackerTypes〔1〕)trackerTrackerMIL::create();elseif(trackerTypetrackerTypes〔2〕)trackerTrackerKCF::create();elseif(trackerTypetrackerTypes〔3〕)trackerTrackerTLD::create();elseif(trackerTypetrackerTypes〔4〕)trackerTrackerMedianFlow::create();elseif(trackerTypetrackerTypes〔5〕)trackerTrackerGOTURN::create();elseif(trackerTypetrackerTypes〔6〕)trackerTrackerMOSSE::create();elseif(trackerTypetrackerTypes〔7〕)trackerTrackerCSRT::create();else{coutIncorrecttrackernameendl;coutAvailabletrackersare:endl;for(vectorstring::iteratorittrackerTypes。begin();it!trackerTypes。end();it)std::coutitendl;}returntracker;}用随机颜色填充vectorvoidgetRandomColors(vectorScalarcolors,intnumColors){RNGrng(0);for(inti0;inumColors;i)colors。pushback(Scalar(rng。uniform(0,255),rng。uniform(0,255),rng。uniform(0,255)));}intmain(intargc,charargv〔〕){coutDefaulttrackingalgoritmisCSRTendl;coutAvailabletrackingalgorithmsare:endl;for(vectorstring::iteratorittrackerTypes。begin();it!trackerTypes。end();it)std::coutitendl;设置跟踪器类型。更改此项以尝试不同的跟踪器。stringtrackerTypeCSRT;设置跟踪算法和视频的默认值stringvideoPathvideosrun。mp4;使用跟踪算法初始化MultiTrackervectorRectbboxes;创建一个视频捕获对象来读取视频cv::VideoCapturecap(videoPath);Matframe;如果无法读取视频文件则退出if(!cap。isOpened()){coutErroropeningvideofilevideoPathendl;return1;}读取第一帧capframe;在对象上绘制边界框selectROI的默认行为是从中心开始绘制框当fromCenter设置为false时,可以从左上角开始画框boolshowCrosshairtrue;boolfromCenterfalse;cout;coutOpenCVsayspressctocancelobjectsselectionprocessendl;coutItdoesntwork。PressEscapetoexitselectionprocessendl;cout;cv::selectROIs(MultiTracker,frame,bboxes,showCrosshair,fromCenter);如果没有要跟踪的对象,则退出if(bboxes。size()1)return0;vectorScalarcolors;getRandomColors(colors,bboxes。size());创建multitrackerPtrMultiTrackermultiTrackercv::MultiTracker::create();初始化multitrackerfor(inti0;ibboxes。size();i)multiTrackeradd(createTrackerByName(trackerType),frame,Rect2d(bboxes〔i〕));处理视频和跟踪对象cout;coutStartedtracking,pressESCtoquit。endl;while(cap。isOpened()){从视频中获取帧capframe;如果到达视频结尾,则停止程序if(frame。empty())break;用新帧更新跟踪结果multiTrackerupdate(frame);绘制跟踪对象for(unsignedi0;imultiTrackergetObjects()。size();i){rectangle(frame,multiTrackergetObjects()〔i〕,colors〔i〕,2,1);}显示frameimshow(MultiTracker,frame);按ESC退出if(waitKey(1)27)break;}}
  Python!usrbinpythonfromfutureimportprintfunctionimportsysimportcv2fromrandomimportrandinttrackerTypes〔BOOSTING,MIL,KCF,TLD,MEDIANFLOW,GOTURN,MOSSE,CSRT〕defcreateTrackerByName(trackerType):CreateatrackerbasedontrackernameiftrackerTypetrackerTypes〔0〕:trackercv2。TrackerBoostingcreate()eliftrackerTypetrackerTypes〔1〕:trackercv2。TrackerMILcreate()eliftrackerTypetrackerTypes〔2〕:trackercv2。TrackerKCFcreate()eliftrackerTypetrackerTypes〔3〕:trackercv2。TrackerTLDcreate()eliftrackerTypetrackerTypes〔4〕:trackercv2。TrackerMedianFlowcreate()eliftrackerTypetrackerTypes〔5〕:trackercv2。TrackerGOTURNcreate()eliftrackerTypetrackerTypes〔6〕:trackercv2。TrackerMOSSEcreate()eliftrackerTypetrackerTypes〔7〕:trackercv2。TrackerCSRTcreate()else:trackerNoneprint(Incorrecttrackername)print(Availabletrackersare:)fortintrackerTypes:print(t)returntrackerifnamemain:print(DefaulttrackingalgoritmisCSRTAvailabletrackingalgorithmsare:)fortintrackerTypes:print(t)trackerTypeCSRTSetvideotoloadvideoPathvideosrun。mp4Createavideocaptureobjecttoreadvideoscapcv2。VideoCapture(videoPath)Readfirstframesuccess,framecap。read()quitifunabletoreadthevideofileifnotsuccess:print(Failedtoreadvideo)sys。exit(1)Selectboxesbboxes〔〕colors〔〕OpenCVsselectROIfunctiondoesntworkforselectingmultipleobjectsinPythonSowewillcallthisfunctioninalooptillwearedoneselectingallobjectswhileTrue:drawboundingboxesoverobjectsselectROIsdefaultbehaviouristodrawboxstartingfromthecenterwhenfromCenterissettofalse,youcandrawboxstartingfromtopleftcornerbboxcv2。selectROI(MultiTracker,frame)bboxes。append(bbox)colors。append((randint(64,255),randint(64,255),randint(64,255)))print(Pressqtoquitselectingboxesandstarttracking)print(Pressanyotherkeytoselectnextobject)kcv2。waitKey(0)0xFFif(k113):qispressedbreakprint(Selectedboundingboxes{}。format(bboxes))InitializeMultiTrackerTherearetwowaysyoucaninitializemultitracker1。trackercv2。MultiTracker(CSRT)AllthetrackersaddedtothismultitrackerwilluseCSRTalgorithmasdefault2。trackercv2。MultiTracker()NodefaultalgorithmspecifiedInitializeMultiTrackerwithtrackingalgoSpecifytrackertypeCreateMultiTrackerobjectmultiTrackercv2。MultiTrackercreate()InitializeMultiTrackerforbboxinbboxes:multiTracker。add(createTrackerByName(trackerType),frame,bbox)Processvideoandtrackobjectswhilecap。isOpened():success,framecap。read()ifnotsuccess:breakgetupdatedlocationofobjectsinsubsequentframessuccess,boxesmultiTracker。update(frame)drawtrackedobjectsfori,newboxinenumerate(boxes):p1(int(newbox〔0〕),int(newbox〔1〕))p2(int(newbox〔0〕newbox〔2〕),int(newbox〔1〕newbox〔3〕))cv2。rectangle(frame,p1,p2,colors〔i〕,2,1)showframecv2。imshow(MultiTracker,frame)quitonESCbuttonifcv2。waitKey(1)0xFF27:Escpressedbreak
  参考目录
  https:learnopencv。commultitrackermultipleobjecttrackingusingopencvcpython

杨颖离开黄晓明以后的日子1hr杨颖小时候的英文名是Angela,但她身边的人觉得这个名字不好读。因为她有婴儿肥,所以都叫她Baby,最后合二为一变成Angelababy。1989年,杨颖出……缴满15年最低档社保,60岁退休以后,每月可以拿多少退休金?正所谓老有所依,老有所养。每一个人都希望自己在忙忙碌碌大半辈子之后,能够过上一份安享晚年的生活。随着经济的发展以及人们养老观念的变化,传统的养儿防老已经不再是老人晚年生活最重要……央媒点名批评!游戏是精神鸦片不要让孩子坠入深渊游戏是摧毁孩子的精神鸦片,我们该如何拯救?现如今互联网的极度发展,游戏已经成为每个手机当中都必须存在的一款软件,其中学生们最喜欢玩的游戏就是王者和吃鸡。此游戏的发行体现出……英雄联盟手游源计划皮肤上线,让你帅呆对手如果有人问你英雄联盟里什么皮肤最酷炫、最有科技感,总之就是建模特效都拉满的那种,那你回答源计划绝对没错!最关键的是,源计划不仅帅,还打击感爆棚!但凡在端游用过源计划的玩家……大胜20分!辽篮2。08米内线砍195太出色,杨鸣这一做法显CBA常规赛继续进行,辽宁本钢迎来同广东宏远的元旦大战,本场比赛辽宁全员出战,广东这边赵睿和苏伟轮休;本以为是一场火星撞地球的精彩大战,结果却是一场一边倒的比赛。辽篮首节就依靠……今日小寒,一年中最冷的日子,该如何防寒温补?1月5日是小寒节气,正值三九前后,一年中最寒冷的日子来临了。北京市隆福医院副主任医师高翔提醒,此时宜多食温热食物,多饮温水,经常用热水泡脚。高翔说,小寒节气前后,要注意多……雅典娜赛年皮肤获取难度降低,天秀小队皮肤突变,妲己玩家笑了大家好,我是王者小皮丘,每天为您分享有趣的王者荣耀新皮肤,新版本消息,以及最新的上分攻略等内容。王者荣耀新赛季s26赛季正式登场,新赛季将于1。6号正式开启,新赛季上线当……797,费尔南多抢申京风头!火箭失利不足惜,探花史密斯有自信经过了一个夏天的准备,火箭队终于迎来了NBA常规赛的首场比赛,这支由杰伦格林领衔的年轻球队,新赛季第一战远赴客场挑战老鹰队。赛前双方公布了先发阵容,老鹰队的首发不出所料,特雷杨……格林性格决定了我不会和水花吵架,都是我在吼而他们不回勇士球员德雷蒙德格林近日在节目中谈到,自己是否会和库里、汤普森吵架。我们没怎么吵过,这是我们彼此的性格决定的。经常都是我在吼,而他们无视我。不过就算他们中的谁回击了……2022澳网世界第一德约会缺席么?小德会缺席本届澳网吗?一个简短的回答:不会的。至少我这么认为。这个月我本来有两起关于中国藉公民申请澳大利亚入境签证的上诉案件要在澳大利亚联邦巡回法院开庭终审。所以过……通俗理解元宇宙元宇宙是什么?就是人类创造出来一个网络世界,人类可以在上面干任何事情,除了肉体的吃喝拉撒以外,有人会问,那十几年前的虚拟网络世界不也可以吗?你还真问对了,不一样的,现在人……热血传奇传奇玩成这样,快去找个电子厂上班吧传奇玩家千千万,不可能每位玩家都能玩得很精通,玩家之间的差距也是多种多样的。比如有的玩家打BOSS非常熟练,有的玩家就不擅长,有的玩家玩家很土豪,一身高属性装备,而有的玩家就是……
英魂之刃金乌阳炎胄主动使用提高自身护甲和魔法抗性,被动大幅提高你的生命恢复速度。主动效果:护甲增加24303642,魔法抗性增加5101520,持续5秒。被动:生命回复速度每秒上升4……颜值超高的皮毛一体外套,肉眼可见的重磅奢华感给大家推荐这款超级好年皮草外套之前,先给大家做一点点小科普,首先没有皮草不会掉毛;其次皮草都会有点点气味;最后皮草不可能每件都一样,懂得懂。小编今天给大推荐的这款皮毛一体……2021FanFest中国线上合庆嘉年华最终幻想146。0定12月18日,盛趣游戏旗下的经典端游《最终幻想14》(以下简称FF14)举办了名为FANFEST2021中国线上合庆嘉年华的庆典活动。活动中,首次公布了FF14国服6。0的定档……再捧这群烂货,内娱真的要完蛋前些天,发完名场面和烂演技的年终盘点。总有人在后台催今年的十大烂剧排行。但今年的参赛选手们简直各个都是重量级。在豆瓣国产剧类目里转上一圈。目光所及之处全……开放世界手游幻塔上线玩家玩了一个小时,对完美世界失望随着《原神》在全世界范围内的流行,开放世界玩法模式的玩家好感度也持续走高,越来越多的玩家都开始热衷于这类充满自由度、探索性和代入感的玩法模式,这让很多游戏厂商都把开放世界当作了……陈梦开启复仇模式!刘国梁再给机会,这次抓不住就退役吧对于陈梦来说,在本次世乒赛的表现,不能算是特别的突出,只能说是中规中矩,而且她也在此,让中国球迷表示非常的失望,毕竟陈梦作为世界第一来说,每一次出场,国际乒联都给出了非常隆重的……盼星星,盼月亮,联想公关终于盼来了大救星韩韩观察文丨韩韩(作者系蓝媒汇创始人)联想的公关,昨晚终于睡了个好觉。随着昨天秦朔关于联想的联想和雪贝财经起底司马两篇爆款文章的传播,在我看来,司马手撕联想的事件,从现在起……八路军将领中弹倒地,汉奸捡枪时发现还活着不用动,一会儿就走同是天涯沦落人,相逢何必曾相识!面对困境的时候,不同的人有不同的选择。意志不够坚定的人,也许遇到任何一点艰难困苦,就会停滞不前,甚至想要,转到一个全新的方向。意志坚定的人……取消共享单车势在必行取消共享单车势在必行!共享单车作为最近几年流行的一种新型交通工具,因为其价格低廉,灵活便利,绿色环保的特性,受到上班一族的青睐,已成为上班族从地铁站到单位最后一公里的常用……挑选一个该进名人堂的球员?杜兰特马布里直播吧5月8日讯杜兰特在个人社交媒体转发了一位记者的动态,并表示他支持马布里进入NBA名人堂。记者TravonneEdwards在社交媒体抛出问题挑选一个配得上进入名人堂……首辆太阳能汽车诞生,太阳能续航70。8公里,充电可行驶624世界上第一辆量产的太阳能汽车诞生了,这辆太阳能汽车来自是荷兰Lightyear公司。该公司是一家多年来一直在研究太阳能发电的公司,同时参与了世界太阳能挑战赛。世界太阳能挑战赛是……郭艾伦关键球!辽篮险胜北控,赵睿复出或战青岛,北控裁掉李根北京时间1月22日,CBA常规赛继续进行,在不久前结束的一场焦点大战中,联盟第一的辽宁男篮经过四节争夺最终以8580险胜北控,避免连败的同时,继续稳固他们积分榜榜首的宝座。本场……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网