c语音难在哪里 跟 python机器人编程学习哪个更好

学那种语言比较好,Java,Python,c++,还是别的语言?
[问题点数:50分,结帖人Scorpio_95]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:0
本版专家分:25
本版专家分:5284
2014年6月 VB大版内专家分月排行榜第一2014年5月 VB大版内专家分月排行榜第一2014年4月 VB大版内专家分月排行榜第一2014年3月 VB大版内专家分月排行榜第一2014年2月 VB大版内专家分月排行榜第一2014年1月 VB大版内专家分月排行榜第一2013年11月 VB大版内专家分月排行榜第一
2013年12月 VB大版内专家分月排行榜第二2013年3月 VB大版内专家分月排行榜第二2013年1月 VB大版内专家分月排行榜第二2012年9月 VB大版内专家分月排行榜第二2012年8月 VB大版内专家分月排行榜第二2012年7月 VB大版内专家分月排行榜第二2006年7月 VB大版内专家分月排行榜第二2006年5月 VB大版内专家分月排行榜第二
2014年9月 VB大版内专家分月排行榜第三2013年7月 VB大版内专家分月排行榜第三2013年6月 VB大版内专家分月排行榜第三2013年4月 VB大版内专家分月排行榜第三2012年11月 VB大版内专家分月排行榜第三2006年6月 VB大版内专家分月排行榜第三2006年4月 VB大版内专家分月排行榜第三2002年12月 VB大版内专家分月排行榜第三2002年11月 VB大版内专家分月排行榜第三
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐
你是否在疑问“C语言学习完了以后该怎么深入学习?”
你是否在疑惑“怎么学了一年的C语言还是什么都不会写?”
你是否在迷茫“C、Java、C#……一大堆语言,我学哪个才能对以后就业有帮助?”
来学《C语言也能干大事》吧,它将解除你内心的疑惑,伴你走上成功之路。
所有视频、板书都可以免费下载!!!
如鹏网上无数的同学学了《C语言也能干大事》几周以后,就由一个对编程没有任何信心的人变成
从开始看Python到现在也有半个多月了,前后看了Python核心编程和Dive into Python两本书。话说半个月看两本,是个人都知道有多囫囵吞枣,这也是因为我暂时没有需求拿这个做大型开发,主要是平时的小程序test用一用。所以我的策略是,整体浏览,用到时候现查。话说这核心编程第一版太古老了,老在讲2.2之前的东西,我看的翻译电子版,翻译得也不好,很晦涩。看完这个后还有点云里雾里,看网上人
最近童鞋们老问:Java、Python、C++哪个好,我坚持两个观点:
1.以自我为中心,适合自己的才是最好的,刀客用刀,剑客用剑,都有高手也有低手。
2.以任务为中心,适合任务的才是最好的,杀牛用牛刀,杀猪用杀猪刀,掌握多项必杀技。
下面引用一篇文章说明各自的应用场景:http://url.cn/5ZBn6I4
说起哪个编程语言最火,这没有绝对的说法,不同的时期可能会有不同的排名,其中,新霸哥比较看好的是java,c++,php,python,node.js这几种,不知道你们怎么看这个问题。那么,到底学习哪个编程语言最火呢?下面新霸哥将详细的为你介绍。
  什么是编程语言?
  所谓的编程语言就是一种是用来定义计算机程序的形式语言。因为它是一种被标准化的交流技巧,所以通常用来向计算机发
c语言主要用于底层和驱动,编译器开发c语言高效底层,主要用于底层的开发,比如一些系统驱动;unix,linux系统和其上相关应用的开发;有很多语言比如python、php、perl、ruby等都是c语言开发的这些语言的核心库,编译器等开发的都是c语言。比如PHP7的开发,就基本上全是c语言。还有就是如果某些应用如果对性能要求严格,那这部分可以用c写,然后高级语言调用。Python学习裙:肆捌叁伍肆...
点击上方“CSDN”,选择“置顶公众号”关键时刻,第一时间送达!是什么让数据科学如此喜爱Python?是语言本身,还是生态系统,或是相关的开发过程?在许多软件开发领域,包...
第一本 《C程序设计语言》
Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。
第二本 《C语言参考手册》
即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考
其实 C是比较基础的东西 考VF或者VB较好 就别考了 学了有用
对找工作有用的话
对自己有用就学c 浪费钱
是对自己有用还是找工作的时候有用 什么都没有学就学C吧 如果是金融管理一类的 要学其他高级编程语言就会变得简单|||是工科的话考C语言比较好 这个学好了 C语言是当今主流编程语言的基础
|||好考的就是VB VB也易学 一楼的说的
Java 和 Python 一直都是两种很火很强大的编程语言,对于刚开始起步学习编程的同学来说,会迷惑且最经常问的问题是,我该学
Java 还是 Python,是不是 Python 容易学,或是应该先学什么编程语言等等这样的问题。作为一名 Java 程序员,肯定会建议你先学 Java,然后再学 Python,但如果你问一个 Python 程序员,可能会得到一个完全相反的答案。与此同时,Pyth
推荐一个学习资料群;java《学习》+交流
点击链接加入群聊【java《学习》+交流】:https://jq.qq.com/?_wv=1027&k=5GWe55B 来到Java面授学习已经三周了,我从一个对电脑都不了解的小白,到现在初步了解编程的知识。从最初的notepad++的使用,到基本的代码认识,再到规范自己的代码格式以及eclipse的使用,我真的收获了很多。同...python 实现简单语音聊天机器人
时间: 16:58:08
&&&& 阅读:256
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 # -*- coding:utf-8 -*-
2 import sys
3 import requests
4 import json
5 import mp3play
6 import time
8 def talk(info):
appkey = "e5ccc9c7c40e290ff1559"
<span style="color: #
headers = {
<span style="color: #
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit‘
<span style="color: #
‘/537.36 (KHTML, like Gecko) Chrome/53.0. Safar‘
<span style="color: #
‘i/537.36‘,
<span style="color: #
<span style="color: #
url = "http://www.tuling123.com/openapi/api?key=%s&info=%s" %(appkey, info)
<span style="color: #
content = requests.get(url, headers=headers)
<span style="color: #
answer = json.loads(content.text)
<span style="color: #
baidu_api = ‘http://tts.baidu.com/text2audio?idx=1&tex={0}&cuid=baidu_speech_‘ <span style="color: #
‘demo&cod=2&lan=zh&ctp=1&pdt=1&spd=4&per=4&vol=5&pit=5‘.format(answer[‘text‘])
<span style="color: #
res = requests.get(baidu_api, headers=headers)
<span style="color: #
with open(r‘E:\python_demo\tuling.mp3‘, ‘wb‘) as f:
<span style="color: #
f.write(res.content)
<span style="color: #
return answer[‘text‘]
<span style="color: #
<span style="color: # def main(info):
<span style="color: #
info = info.decode(‘gb2312‘).encode(‘utf-8‘)
<span style="color: #
answer = talk(info)
<span style="color: #
mp3 = mp3play.load(r‘E:\python_demo\tuling.mp3‘)
<span style="color: #
mp3.play()
<span style="color: #
time.sleep(min(40, mp3.seconds()))
<span style="color: #
mp3.stop()
<span style="color: #
<span style="color: #
print ‘Tuling: %s‘ % answer
<span style="color: #
except UnicodeEncodeError:
<span style="color: #
print u‘我说了个啥子哟。‘
<span style="color: #
<span style="color: # if __name__ == ‘__main__‘:
<span style="color: #
print u‘开始你的表演。‘
<span style="color: #
while True:
<span style="color: #
info = raw_input(‘Studog:‘)
<span style="color: #
if info == ‘<span style="color: #‘:
<span style="color: #
<span style="color: # main(info)
&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/laresh/p/6526409.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Python相比Java,谁更胜一筹呢?
近几年来,随着人工智能的火爆,Python一直处于各种流行编程语言排名的前列。该语言几乎可以用于任何事情。它旨在提高程序员的生产力,而不是他们编写的代码本身。Python可以用于Web开发、桌面应用程序开发、自动化脚本、复杂计算系统、科学计算、生命支持管理系统、物联网、游戏、机器人、自然语言处理等等。
对于那些从未写过代码的人来说,Python代码也很简洁易懂。也正是因为这个原因,与其他语言相比,使用Python编写的程序其可维护性也是很不错的。从商业角度来讲,这也可以很大程度上在降低开发成本的同时提高程序员的生产力。
谁使用Python?
Python开发人员不断壮大,语言库的数量也在不断增长。这一切都使得Python语言成为世界上功能最多的编程语言之一,可以轻松适用于任何项目。同时我们也应认识到:Python在数据挖掘和机器学习等领域中十分流行。
为了更好的认识Python与Java语言的优点,我们将Python语言与流行的Java语言技术做一下比较。
一些开发人员声称Python比Java更有生产力。但更应先说明的是:Python和Java有什么区别?
Python VS Java
Java是一个典型化的编程语言,这意味着变量名必须显示声明。相比之下,我们有动态类型的Python,它不需要声明变量。对于编程语言的动态和静态类型有很多的争论。
不过请注意这样一个特征:Python是一个有着简单句法的多样性的语言。这使得Python被广泛应用于多个领域来写脚本,快速开发应用等等。
Java支持跨平台应用,而Python几乎与所有现代操作系统兼容。Java对于初学者来说要比Python复杂很多。读Python代码也比读Java代码简单。Java比Python复杂得多。如果你没有技术类的背景,学Java是个很艰难的过程。Java和Python都是世界排名前十的语言,关于两门语言的特性,可以说有很多相似的地方,但也有很多本质上的不同。
那么这两种语言相比,哪一种更胜一筹呢?
Java和Python都是开源语言,简单地说,你可以自由的阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。在这一点上,Java和Python是不分上下的,唯一的差别可能在于Java代码的中文版本很多,Python主要是英文版的,所以对于学Python的人来说,英语非常非常重要。
2.跨平台性
Java和Python都是跨平台语言,在这一特性上,两者也是相同的,但他们的跨平台是有区别的,Java可以跨平台是因为Java的类库非常多,提供各个平台的接口;绝大多数的Python程序不做任何改变即可在主流计算机平台上运行。这一点来看Python似乎要更彻底一些,可惜并不是所有平台。在这点上看一半一半吧。
3.面向对象
Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。对象中封装了它的状态变量以及相应的方法,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。  
与Java对比,Python以一种非常强大又简单的方式实现面向对象编程。Python既支持面向过程的函数编程也支持面向对象的抽象编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的。
4.可扩展性
在这一点上,Python和Java都具有良好的可扩展性,两者在这一点上同样可以说相同也可以说不相同。
Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。
Python的可扩展性不止于此,如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
只要是Java程序员,就没有不了解Java的类库的,Java之所以强大,并不是语法有多完善和强大,主要就是因为它有大量的类库。可以说在各类语言中,这一点上无出其右。其中中大量的规范,大量的库,只需要用基础的语法调用就能解决问题,所以项目上只要你使用的都是基础语法。
其实Python也是有自己的库的,而且标准库还是很庞大的。python有可定义的第三方库可以使用。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、密码系统、GUI、Tk和其他与系统有关的操作。只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等也不少。
Java和Python都可以说是很简单的语言,都有很好的可读性。当然这也有不同之处。
Java的简单是因为Java略去了运算符重载、多重继承等模糊的概念,并且通过实现自动垃圾收集大大简化了程序设计者的内存管理工作,所以学习起来相对要简单不少。
Python最大名气在于非常适合人类阅读。编程思维几乎完全和生活中的思维习惯一致。阅读一个良好的Python程序就感觉像是在读英语一样。同时虽然Python虽然是用C语言写的,但是它摈弃了C语言中非常复杂的指针,简化了Python的语法,同时Python采用强制缩进的方式使得代码具有极佳的可读性。所以不论是在阅读上还是在学习上,都非常简单容易,当然,这要求要有非常高的英语水平。
Python人气爆棚的隐秘
Python之所以排名上的如此之快,和它本身的特色也有关系,他是一种简略、易用但专业、严谨的通用组合言语,或者叫胶水语,让普通人也能够很简单的入门,把各种基本程序元件组装在一起,和谐运作。比如任何一个人,只需情愿学习,能够在几天的时间里学会Python基础部分,然后干出许多许多工作,这种投入产出比可能是其他任何言语都无法相比的而且Python的使用很广,许多职业都会使用。
我们可以看出Java和Python的特点有那么一点的相似,语言之间是互通的。Java现在还是第一,我不知道Python以后会不会超越Java,但是现在人们想起人工智能,第一个想借助的语言都会想起Python,所以说未来的Python可能会借助于人工智能超越Java。
为帮助那些往想互联网方向转行想学习,却因为时间不够,资源不足而放弃的人。我搜集整理了一套完整的IT学习资料,包括JAVA,Python,web前端,php等,比自己在网上零散收集的结构性和连贯性更强,只为帮助那些想学习的人!找大神teacher_liu_666领取!
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点用python学习slam系列(一)从图像到点云-ROS机器人俱乐部 | 更多交流、更多资料,社区为开发者带来便利
用python学习slam系列(一)从图像到点云
用python学习slam系列(一)从图像到点云
发布时间:日 00:54:19 &&
浏览数:18861次 &&
最近开始学习ros,然后搜索slam教程,看到高翔大神写的《一起做rgbd-slam》系列,很有启发,也很佩服,但是高翔大神用的都是c++,本人比较喜欢python,所以想把文章中的代码改成python版本,也好记录一下自己的学习心得。
章节目录:&&&&&&&&1、&&&&&&&&2、&&&&&&&&3、&&&&&&&&4、时间规划:&&&&&&&& 《一起做rgbd-slam》高博原文一共9篇,加上我个人水平有限,数学也不高,所以前期先做原文代码验证及其自己补充学习,有些可能写的不对,这个也在所难免,所以预计时间为一个月,大概从日-日,这里先立一个flag,万一呢。永久链接:&&&&&&&&&相关代码及数据:转载请著名出处,ROSClub版权所有。编者水平有限,有些描述的可能不对,大家轻喷。转载请著名出处,ROSClub版权所有。编者水平有限,有些描述的可能不对,大家轻喷,另外:Python是最好的语言。第一篇:从图像到点云(Python版)参考链接:0x00 准备软件:ubuntu14.04、ros-indigo-desktop-full、python2.7、pip等硬件:asus xtion pro、电脑依赖库:OpenCV(强烈建议使用3.0以上版本,本教程所有代码使用的是OpenCV3.2.0版)、Numpy、PCL依赖库安装:pip:sudo&apt-get&install&python-pipOpenCV:(1)如果安装了ros,用自带的就可以(2)编译安装OpenCV(推荐使用)编译安装步骤(参考地址:)1.依赖关系:&&&&GCC 4.4.x or later&&&&CMake 2.8.7 or higher&&&&Git&&&&GTK+2.x or higher, including headers (libgtk2.0-dev)&&&&pkg-config&&&&Python 2.6 or later and Numpy 1.5 or later with developer packages (python-dev, python-numpy)&&&&ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev&&&&[optional] libtbb2 libtbb-dev&&&&[optional] libdc1394 2.x&&&&[optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev注:官方文档中虽然说其中一些依赖包是可选的,但是最好还是都装上,以防出问题。以上依赖包可使用以下命令安装:sudo&apt-get&install&build-essentialsudo&apt-get&install&cmake&git&libgtk2.0-dev&pkg-config&libavcodec-dev&libavformat-dev&libswscale-devsudo&apt-get&install&python-dev&python-numpy&libtbb2&libtbb-dev&libjpeg-dev&libpng-dev&libtiff-dev&libjasper-dev&libdc1394-22-dev2.安装cmake-gui(用于生成OpenCV编译文件):sudo&apt-get&install&cmake-gui3.下载OpenCV源代码:可以从OpenCV官网直接下载:也可以使用git命令行直接clone:cd&~/&my_working_directory&&
//比如工作目录为opencv即,cd&~/opencv
git&clone&https://github.com/Itseez/opencv.git
git&clone&https://github.com/Itseez/opencv_contrib.git进入OpenCV源代码目录,创建build文件夹:cd&~/&my_working_directiory&/opencv
mkdir&build使用cmake-gui生成编译文件:打开cmake-gui后,在source code栏选择OpenCV源代码所在目录(例如:/home/username/workplace/opencv),在build栏中填写刚才新建的build文件夹(例如:/home/username/workplace/opencv/build)如下图所示:点击Configure按钮,会弹出如下图所示的提示框,点击Finish按钮即可:接下来cmake会检查所有依赖库以及其他各可选部分版本,这个过程中cmake会下载一个名为ippicv的库,但经常会出现下载失败而导致configure失败,建议手动下载下载地址:后放入/home/username/workplace/opencv/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32ae文件夹中。检查完毕后需要修改OPENCV_EXTRA_MODULES_PATH内容,如下图所示:修改完后再点击Configure按钮,如果依旧有红色高亮显示条目,则再次点击Configure按钮,等待所有条目均不再高亮显示后点击Generate按钮,退出cmake-gui程序,在命令行里进入/home/username/workplace/opencv/build目录,输入以下命令:make&-j8
sudo&make&install
sudo&ldconfig[注] 建议勾选BUILD_EXAMPLE选项,选用了不同的摄像头时需要先对摄像头进行标定,OpenCV示例中有提供标定程序。Numpy:pip install numpy (可能需要管理员权限)PCL:先安装基本pcl库,再去git上下载python版pcl接口步骤:(Ubuntu下,其他Linux发行版本安装办法参见:)1)& 通过PPA安装完整PCL库sudo&add-apt-repository&ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo&apt-get&update
sudo&apt-get&install&libpcl-all2)& 安装python-pcl在github上下载python-pcl(地址:)解压后进入python-pcl目录,输入命令:sudo python setup.py install即可,如果报错,可能缺少依赖库。使用命令sudo pip install cython安装python-pcl的依赖库后再执行安装命令即可。在ROS中,我们输入以下命令可以让kinect运行:roslaunch&openni_launch&openni.launch如果kinect连接在电脑上,可以通过输入下面命令:rosrun&image_view&image_view&image:=/camera/rgb/image_color这样在启动起来的rviz界面中就可以看到kinect获取的图像信息不过,如果手头没有kinect,可以使用下面提供的两张图片(来源:)来作为测试数据使用,该组图片的相机内参矩阵为:&C=[[518.0,0,325.0],[0,519.0,253.5],[0,0,1]]或者使用自己手中深度摄像头获取的图片信息来作为测试数据使用(需要提前对摄像头进行标定):或者使用自己手中深度摄像头获取的图片信息来作为测试数据使用(需要提前对摄像头进行标定):或者使用自己手中深度摄像头获取的图片信息来作为测试数据使用(需要提前对摄像头进行标定):这里的两张图片中,左边是RGB数据图片,右边的是深度数据图片接下来,我们将编写一段python脚本将这两张图片数据转换成3D点云数据。0x01 获取相机内参矩阵(标定相机)不同的深度摄像头具有不同的特征参数,在计算机视觉里面,将这组参数成为相机的内参矩阵C。格式为:其中,fx,fy指相机在x轴和y轴上的焦距,cx,cy是相机的光圈中心,这组参数是摄像头生产制作之后就固定的。获取这组参数,只有通过相机标定。1、首先,在一张A4大小的纸上打印8*6的黑白棋盘格作为标定板,使用摄像头拍摄不同角度的带有完整标定板的图片,数量在10~20张之间,图片上一定要能够完整识别黑白格的边界交点。将OpenCV中编译好的示例程序中的cpp-example-calibration和cpp-example-imagelist-creator的二进制程序(二进制程序保存在&opencv_source&/build/bin下)复制到图片目录中,在终端中切换到图片目录,输入以下命令:./cpp_example_imagelist_creator&image_list.xml&*.png
./cpp_example_calibration&-w=7&-h=5&-n=12&-o=camera.yml&-op&-oe&image_list.xml第一条命令是用于生成标定程序所需的图片列表,图片信息保存在image_list.xml中;第二条命令是根据图片列表进行标定,-w表示标定板横向有7个交点,-h表示纵向有5个交点,-n表示图片一共有12张,-o是输出文件保存在camera.yml中,-op和-oe是将检测到的点和相机外参一并输出到文件中。camera.yml文件内容如下(完整文件数据内容过长,省略部分数据):%YAML:&1.0
calibration_time:&&Wed&08&Mar&:01&AM&CST&
nframes:&12
image_width:&640
image_height:&480
board_width:&7
board_height:&5
square_size:&3.4766e+01
aspectRatio:&1.
camera_matrix:&!!opencv-matrix
&&&&&&&&&rows:&3
&&&&&&&&&cols:&3
&&&&&&&&&dt:&d
&&&&&&&&&data:&[&6..,&3..,
&&&&&&&&&6...,&0.,&1.&]
distortion_coefficients:&!!opencv-matrix
&&&&&&&&&rows:&5
&&&&&&&&&cols:&1
&&&&&&&&&dt:&d
&&&&&&&&&data:&[&2.4067e-01,&-3.4500e-01,
&&&&&&&&&-3..5569e-02,
&&&&&&&&&9.4165e-02&]
avg_reprojection_error:&6.8028e-01
per_view_reprojection_errors:&!!opencv-matrix
&&&&&&&&&rows:&12
&&&&&&&&&cols:&1
&&&&&&&&&dt:&f
&&&&&&&&&data:&[&1.,&3.,&3.,
&&&&&&&&&2.,&2.,&5.,&7.,
&&&&&&&&&1.,&6.,&5.,&8.,
&&&&&&&&&3.&]
extrinsic_parameters:&!!opencv-matrix
&&&&&&&&&rows:&12
&&&&&&&&&cols:&6
&&&&&&&&&dt:&d
&&&&&&&&&data:&[&-8.4508e-02,&-1.6391e+00,
&&&&&&&&&2..4594e+01,
&&&&&&&&&……
&&&&&&&&&5.0135e-02,&-3.1979e+02,
&&&&&&&&&-1..1570e+02&]
image_points:&!!opencv-matrix
&&&&&&&&&rows:&12
&&&&&&&&&cols:&35
&&&&&&&&&dt:&&2f&
&&&&&&&&&data:&[&4.,&1.,&3.,
&&&&&&&&&1.,&3.,&1.,&3.,
&&&&&&&&&……
&&&&&&&&&2.,&2.,&2.,&2.,
&&&&&&&&&2.&]这里,camera_matrix就是我们所需要的相机内参。我们可以使用python的yaml(如果提示ImportError: No module named yaml,可以使用sudo pip install yaml安装)库对yml文件进行读取解析操作。代码如下:&#!/usr/bin/env&python
#&-*-&coding:&utf-8&-*-
import&yaml,&sys
import&numpy&as&np
def&fixYamlFile(filename):
&&&&&&&&&with&open(filename,&&#39;rb&#39;)&as&f:
&&&&&&&&&&&&&&&&&&&lines&=&f.readlines()
&&&&&&&&&if&lines[0]&!=&&#39;%YAML&1.0\n&#39;:
&&&&&&&&&&&&&&&&&&&lines[0]&=&&#39;%YAML&1.0\n&#39;
&&&&&&&&&for&line&in&lines:
&&&&&&&&&&&&&&&&&&&if&&#39;&!!opencv-matrix&#39;&in&line:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&lines[lines.index(line)]&=&line.split(&#39;&!!opencv-matrix&#39;)[0]&+&&#39;\n&#39;
&&&&&&&&&with&open(filename,&&#39;wb&#39;)&as&fw:
&&&&&&&&&&&&&&&&&&&fw.writelines(lines)
def&parseYamlFile(filename):
&&&&&&&&&fixYamlFile(filename)
&&&&&&&&&f&=&open(filename)
&&&&&&&&&x&=&yaml.load(f)
&&&&&&&&&f.close()
&&&&&&&&&arr&=&np.array(x[&#39;camera_matrix&#39;][&#39;data&#39;],&dtype&=&np.float32)
&&&&&&&&&return&(arr.reshape(3,&3))
if&__name__&==&&#39;__main__&#39;:
&&&&&&&&&print(parseYamlFile(sys.argv[1]))OpenCV生成的YAML文件会带有一些特殊标记,而python的yaml库会将这些标记认为文件错误,所以首先先将这些标记去除,然后在进行解析,最后使用numpy库将相机内参矩阵一维数组转换成3*3的矩阵。将脚本保存为readyaml.py,留作自定义库在后续代码中引入调用。0x02&数学模型在计算机中,我们需要把相机转换为一种数学模型,这样我们把图片信息交给计算机才会被正确的识别出来。在SLAM中,相机被简化成针孔相机模型,如下图所示(图片来自):0x03 2D到3D(编程)首先我们需要对相机内参加以封装,便于程序调用。在python中,一切都是为对象(object),那么我们就先定义个名为CameraIntrinsicParameters的类来对相机内参进行封装:class&CameraIntrinsicParameters(object):
&&&&&&&&&def&__init__(self,&cx,&cy,&fx,&fy,&scale):
&&&&&&&&&&&&&&&&&&&super(CameraIntrinsicParameters,&self).__init__()
&&&&&&&&&&&&&&&&&&&self.cx&=&cx
&&&&&&&&&&&&&&&&&&&self.cy&=&cy
&&&&&&&&&&&&&&&&&&&self.fx&=&fx
&&&&&&&&&&&&&&&&&&&self.fy&=&fy
&&&&&&&&&&&&&&&&&&&self.scale&=&scale把相机内参封装好了之后,可以通过将标定好的相机内参数据传递进来保存。CameraIntrinsicData&=&readyaml.parseYamlFile(&#39;./calibration_data/asua/camera.yml&#39;)
camera&=&CameraIntrinsicParameters(CameraIntrinsicData[0][2],&CameraIntrinsicData[1][2],&CameraIntrinsicData[0][0],&CameraIntrinsicData[1][1],&1000.0)这样,指定的相机内参就保存在名为camera的类变量里面了。根据之前的数学模型,我们需要读取两张图片内的信息,这里就需要借助OpenCV库来获取图片信息了:import&cv2
rgb&=&cv2.imread(“rgb.png”)
depth&=&cv2.imread(&“depth.png”,&-1&)在python中,cv2.imread()函数会将图片数据存储为一个多维列表(list),rgb存储了图像的颜色信息,但cv2会将单个像素的颜色信息存储为[b, g, r]格式。有了图像信息,我们就可以开始转换点云了,这里需要借助名为PCL(点云库)的第三方库来生成点云。首先使用PCL库创建一个空白的点云:import&pcl
cloud&=&pcl.PointCloud()获取图像的长度和宽度并新建一个名为pointcloud的空列表,以便后续程序遍历整个图像使用:rows&=&len(depth)
cols&=&len(depth[0])
pointcloud&=&[]接下来遍历图像,根据之前推导出来的公式计算点云信息:for&m&in&range(0,&rows):
&&&&&&&&&for&n&in&range(0,&cols):
&&&&&&&&&&&&&&&&&&&d&=&depth[m][n]
&&&&&&&&&&&&&&&&&&&if&d&==&0:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&pass
&&&&&&&&&&&&&&&&&&&else:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&z&=&float(d)&/&camera.scale
&&&&&&&&&&&&&&&&&&&&&&&&&&&&x&=&(n&-&camera.cx)&*&z&/&camera.fx
&&&&&&&&&&&&&&&&&&&&&&&&&&&&y&=&(m&-&camera.cy)&*&z&/&camera.fy
&&&&&&&&&&&&&&&&&&&&&&&&&&&&points&=&[x,&y,&z]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&pointcloud.append(points)由于pcl库并不会直接识别列表格式的点云数据,所以我们需要使用numpy库进行数据格式转换,并将点云保存在文本文件中:import&numpy&as&np
pointcloud&=&np.array(pointcloud,&dtype&=&np.float32)
cloud.from_array(pointcloud)
pcl.save(cloud,&“cloud.pcd”,&format&=&&#39;pcd&#39;)这样,一个简单的将图像转换成点云的脚本就写好了。0x04 优化当我们执行完上述脚本后,通过pcl_viewer打开pcd文件,会发现生成的点云并没有颜色信息。接下来我们将对代码进行优化,让生成的点云附带有rgb颜色信息。要想让点云带有颜色信息,需要先来研究下pcd的文件格式。我们可以使用文本编辑器(如Ubuntu下的gedit,sublime text等)打开cloud.pcd。这时我们会发现这个文件的前几行起到了文件头的作用。通过查询网络,这些文件头有如下含义:(以下内容来自:)VERSION&– 指定PCD文件版本· FIELDS&– 指定一个点可以有的每一个维度和字段的名字。例如:FIELDS&x&y&z&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#&XYZ&data
FIELDS&x&y&z&rgb&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#&XYZ&+&colors
FIELDS&x&y&z&normal_x&normal_y&normal_z&&&&&&&&&&&&#&XYZ&+&surface&normals
FIELDS&j1&j2&j3&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#&moment&invariants
...· SIZE&– 用字节数指定每一个维度的大小。例如:unsigned&char/char&has&1&byte
unsigned&short/short&has&2&bytes
unsignedint/int/float&has&4&bytes
double&has&8&bytes· TYPE&– 用一个字符指定每一个维度的类型。现在被接受的类型有:&&&&I – 表示有符号类型int8(char)、int16(short)和int32(int);&&&&U&–&表示无符号类型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);&&&&F&– 表示浮点类型。· COUNT&– 指定每一个维度包含的元素数目。&&&&例如,x这个数据通常有一个元素,但是像VFH这样的特征描述子就有308个。实际上这是在给每一点引入n维直方图描述符的方法,把它们当做单个的连续存储块。默认情况下,如果没有COUNT,所有维度的数目被设置成1。· WIDTH&– 用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:&&&&1)它能确定无序数据集的点云中点的个数(和下面的POINTS一样);&&&&2)它能确定有序点云数据集的宽度(一行中点的数目)。&&&&例如:&&&&&&&&WIDTH 640&&&&&& #&每行有640个点· HEIGHT – 用点的数目表示点云数据集的高度。类似于WIDTH&,HEIGHT也有两层解释:&&&&1)它表示有序点云数据集的高度(行的总数);&&&&2)对于无序数据集它被设置成1(被用来检查一个数据集是有序还是无序)。&&&&有序点云例子:&&&&WIDTH 640&&&&&& #&像图像一样的有序结构,有640行和480列,&&&&HEIGHT 480&&&&& #&这样该数据集中共有640*480=307200个点&&&&无序点云例子:&&&&WIDTH 307200&&&&HEIGHT 1&&&&&&& #&有307200个点的无序点云数据集· VIEWPOINT – 指定数据集中点云的获取视点。&&&&VIEWPOINT有可能在不同坐标系之间转换的时候应用,在辅助获取其他特征时也比较有用,例如曲面法线,在判断方向一致性时,需要知道视点的方位,视点信息被指定为平移(txtytz)+ 四元数(qwqxqyqz)。默认值是:VIEWPOINT 0 0 0 1 0 0 0· POINTS – 指定点云中点的总数。从0.7版本开始,该字段就有点多余了,因此有可能在将来的版本中将它移除。&&&&例如:&&&&POINTS 307200&& #点云中点的总数为307200· DATA – 指定存储点云数据的数据类型。从0.7版本开始,支持两种数据类型:ascii和二进制。&&&&注意:文件头最后一行(DATA)的下一个字节就被看成是点云的数据部分了,它会被解释为点云数据。&&&&根据这段文件头信息的解释,我们可以编写一段代码对生成的点云数据进行添加颜色的处理。&&&&使用文本编辑器打开cloud.pcd文件,文件头信息如下:#&.PCD&v0.7&-&Point&Cloud&Data&file&format
VERSION&0.7
FIELDS&x&y&z
SIZE&4&4&4
TYPE&F&F&F
COUNT&1&1&1
WIDTH&204186
VIEWPOINT&0&0&0&1&0&0&0
POINTS&204186
DATA&ascii这里面需要修改的只有第三、第四和第五行。将第三行的信息修改为:FIELDS x y z rgb;将第四行的信息修改为:SIZE 4 4 4 4将第五行的信息修改为:TYPE F F F I这些修改是为后续向数据添加颜色信息做准备。对于代码,首先我们要定义一个名为AddColorToPCDFile的函数,用来向生成后的pcd文件内添加颜色数据,首先先修改文件头信息并保存:def&AddColorToPCDFile(filename):
&&&&&&&&&with&open(filename,&&#39;rb&#39;)&as&f:
&&&&&&&&&&&&&&&&&&&lines&=&f.readlines()
&&&&&&&&&lines[2]&=&lines[2].split(&#39;\n&#39;)[0]&+&&#39;&rgb\n&#39;
&&&&&&&&&lines[3]&=&lines[3].split(&#39;\n&#39;)[0]&+&&#39;&4\n&#39;
&&&&&&&&&lines[4]&=&lines[4].split(&#39;\n&#39;)[0]&+&&#39;&I\n&#39;
&&&&&&&&&lines[5]&=&lines[5].split(&#39;\n&#39;)[0]&+&&#39;&1\n
&&&&&&&&&with&open(filename,&&#39;wb&#39;)&as&fw:
&&&&&&&&&&&&&&&&&&&fw.writelines(lines)之前我们提到过,rgb颜色信息被存在名为rgb的变量里,那么我们需要将每个像素的颜色信息分离出来,并将分离好的每个像素的颜色信息转换成十六进制格式后保存进一个列表中:def&ImageToPointCloud(RGBFilename,&DepthFilename,&CloudFilename,&camera):
&&&&&&&&&rgb&=&cv2.imread(&RGBFilename&)
&&&&&&&&&depth&=&cv2.imread(&DepthFilename,&-1&)
&&&&&&&&&cloud&=&pcl.PointCloud()
&&&&&&&&&rows&=&len(depth)
&&&&&&&&&cols&=&len(depth[0])
&&&&&&&&&pointcloud&=&[]
&&&&&&&&&colors&=&[]
&&&&&&&&&for&m&in&range(0,&rows):
&&&&&&&&&&&&&&&&&&&for&n&in&range(0,&cols):
&&&&&&&&&&&&&&&&&&&&&&&&&&&&d&=&depth[m][n]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&d&==&0:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&pass
&&&&&&&&&&&&&&&&&&&&&&&&&&&&else:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&z&=&float(d)&/&camera.scale
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&x&=&(n&-&camera.cx)&*&z&/&camera.fx
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&y&=&(m&-&camera.cy)&*&z&/&camera.fy
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&points&=&[x,&y,&z]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&pointcloud.append(points)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b&=&rgb[m][n][0]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&g&=&rgb[m][n][1]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&r&=&rgb[m][n][2]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&color&=&(r&&&&16)&|&(g&&&&8)&|&b
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&colors.append(int(color))
&&&&&&&&&pointcloud&=&np.array(pointcloud,&dtype&=&np.float32)
&&&&&&&&&cloud.from_array(pointcloud)
&&&&&&&&&pcl.save(cloud,&CloudFilename,&format&=&&#39;pcd&#39;)由于保存颜色信息的序列顺序和生成点云的序列顺序完全一样,那么我们就可以遍历cloud.pcd的data区域,逐个添加颜色信息:def&AddColorToPCDFile(filename,&colors):
&&&&&&&&&with&open(filename,&&#39;rb&#39;)&as&f:
&&&&&&&&&&&&&&&&&&&lines&=&f.readlines()
&&&&&&&&&lines[2]&=&lines[2].split(&#39;\n&#39;)[0]&+&&#39;&rgb\n&#39;
&&&&&&&&&lines[3]&=&lines[3].split(&#39;\n&#39;)[0]&+&&#39;&4\n&#39;
&&&&&&&&&lines[4]&=&lines[4].split(&#39;\n&#39;)[0]&+&&#39;&I\n&#39;
&&&&&&&&&lines[5]&=&lines[5].split(&#39;\n&#39;)[0]&+&&#39;&1\n&#39;
&&&&&&&&&for&i&in&range(11,&len(colors)&+&11):
&&&&&&&&&&&&&&&&&&&lines[i]&=&lines[i].split(&#39;\n&#39;)[0]&+&&#39;&&#39;&+&str(colors[i&-&11])&+&&#39;\n&#39;
&&&&&&&&&with&open(filename,&&#39;wb&#39;)&as&fw:
&&&&&&&&&&&&&&&&&&&fw.writelines(lines)最后,在ImageToPointCloud函数结尾添加修改颜色的调用AddColorToPCDFile(CloudFilename, colors)即可。这样对生成的点云进行的添加颜色的优化就完成了。参考资料:[1] 一起做RGB-D SLAM (2) - 半闲居士 - 博客园 - 地址: [2] PCD(点云数据)文件格式 - 地址:&[3] 高博博客:[4] ROSClub链接:&

我要回帖

更多关于 科沃斯机器人哪款好 的文章

 

随机推荐