
出版社: 清华大学
原售价: 149.00
折扣价: 105.80
折扣购买: 学习OpenCV3(中文版)
ISBN: 9787302504184
\"作者简介 安德里安?凯勒(Adrian Kaehler)博士,企业家,硅谷深度学习小组创始人。他的工作重心包括机器学习、统计建模、计算机视觉和机器人。他就职于斯坦福大学人工智能实验室,他还是该校斯坦利团队的成员,该团队在美国**航空与航天局(NASA)主办的机器人挑战赛中胜出,赢得了200万美元的大奖。 加里?布拉德斯基(Gary Bradski)博士是Arraiy.ai的首席架构师(CTO),他曾经就职于好几个创业公司,担任过斯坦福大学计算机系人工智能实验室的顾问教授。他是OpenCV库的创始人,是一名享有广泛声誉的演讲人、开源社区的积极参与者。 译者团队介绍 阿丘科技 阿丘科技是一家以机器学习、3D 视觉和机器人技术为核心的高科技企业,拥有业内**的机器人3D 视觉技术、机器学习算法及标准行业解决方案。 人工智能,已经成为**技术发展、应用拓展的前沿领域,也是**未来的一枚关键的棋子。计算机视觉作为人工智能的关键应用点之一,近年来兴起的创业公司主要集中在人脸识别、无人驾驶、增强现实等领域。而阿丘科技独辟蹊径,将人工智能技术与机器人结合,将其应用于工业自动化领域,并在短短一年内在多个场景下落地,取得了出色的成果。 相较于传统的机器视觉,阿丘科技将深度学习用于工业视觉检测,在缺陷检测分类等场景下具有突出优势。而三维计算机视觉与机器人的结合,*是极大地扩展了工业机器人的应用场景。凭借****的技术人才,**的计算机视觉、机器人技术,阿丘科技走在了智能工业视觉技术的前列。随着人工智能和智能制造行业的兴起,我司将助力中国工业自动化以及智能化的发展。 尽管由于某些原因,OpenCV并没有在正式版本中提供自身完备的深度学习工具(我们很高兴这一点在3.3 版本中有了巨大改善),但是OpenCV作为从事机器视觉应用技术开发的**工具,同样,也是阿丘科技技术开发的基础工具之一,有着不可替代的作用。在很多固定场景下,基于OpenCV等视觉工具的开发的算法依然具有极大的应用潜力。尤其是对于初学者而言,我们还是****使用OpenCV完成一些视觉项目,而不是直接用深度学习构建空中楼阁。我司能够在一年内推出经受复杂应用场景检验、市场普遍认可的产品,有一大份功劳,也归属于OpenCV对项目完成和开发研究的推动。高效、精准、便捷等诸多特质,使得OpenCV在学术研究和商业应用中占据了重要地位。 阿丘科技致力于构建**的智能机器人视觉平台,以视觉为切入点,将 AI 与机器人结合。创始团队源自清华大学计算机系人工智能实验室,聚集了来自清华、CMU 等**高等院校的**人才,以及工业机器人和自动化**行业从业者。我们期待,能有*多热爱视觉、工业自动化和机器人技术的朋友加入阿丘科技,共同去探索和扩展机器人应用的边界! \"
**个程序:显示图片 OpenCV提供了一些实用工具来读取从视频流到摄像机画面的各种各样的图像格式,这些工具都是HighGUI的一部分。我们将使用其中的一些工具来创建一个简单的程序,这个程序将打开一张图像并且将其显示在屏幕上(如示例2-1所示)。 示例2-1:一个简单的加载并显示图像的OpenCV程序 #include //Include file for every supported OpenCV function int main( int argc, char** argv ) { cv::Mat img = cv::imread(argv[1],-1); if( img.empty() ) return -1; cv::namedWindow( \"Example1\", cv::WINDOW_AUTOSIZE ); cv::imshow( \"Example1\", img ); cv::waitKey( 0 ); cv::destroyWindow( \"Example1\" ); return 0; } 注意,OpenCV的函数都位于cv这一命名空间下,为了调用OpenCV的函数,你需要在每个函数前加上c v::,向编译器说明你所调用的函数处于c v命名空间。为了摆脱这种繁琐的工作,我们可以像示例2-2一样用using namespace cv;指令,告诉编译器假设所有函数都位于c v命名空间下。注1你还需要注意示例2-1和示例2-2在头文件上的不同,在前者中,我们使用了通用的opencv.hpp,而在后者中,我们只使用了必须的头文件来节约编译时间。 示例2-2:与示例2-1不同的是直接使用了using namespace #include \"opencv2/highgui/highgui.hpp\" using namespace cv; int main( int argc, char** argv ) { Mat img = imread( argv[1], -1 ); if( img.empty() ) return -1; 注1: 当然,如果这样做,需要冒着和其他潜在的命名空间冲突的风险。如果函数f o o()已经存在于c v和s t d的命名空间,你必须**自己使用的是位于c v::f o o()的函数还是位于std::foo()的函数。在本书中,除了示例2-2,都会指明cv::命名空间,并以此保持一个良好的编程风格。 namedWindow( \"Example1\", cv::WINDOW_AUTOSIZE ); imshow( \"Example1\", img ); waitKey( 0 ); destroyWindow( \"Example1\" ); } 当使用命令行编译和运行时,注2示例2-1将加载一张图像到内存中并且显示到屏幕上。它会保持显示直到用户按下一个键,之后程序才会销毁窗口并退出。现在让我们来一行一行地解释代码,并花一些时间来理解每一行代码都在做什么工作。 cv::Mat img = cv::imread( argv[1], -1 ); 这一行将会载入图像。注3函数cv::imread()是**的;依据文件名来决定载入图像格式的处理。这也会自动地申请图像需要的内存,注意,cv::imread()可以读取很多种图像格式,包括BMP,DIP,JPEG,JPE,PNG,PBM,PGM,PPM,SR,RAS以及TIFF。 函数会返回一个c v::M a t结构,这个结构是Op e nCV中你将会接触*多的自带结构。OpenCV使用这个结构来处理所有类型的图像:单通道、多通道、整型、浮点数以及各种类型。紧接着的下面这一行: if( img.empty() ) return -1; 检查这个图像是否真的被载入了。另一个高层级的函数cv::namedWindow()将会在屏幕打开一个窗口,其中可以包含需要显示的图片。 cv::namedWindow( \"Example1\", cv::WINDOW_AUTOSIZE ); 该函数由HighGUI模块提供,会将一个名称赋予窗口(在这里窗口名为\"Example1\")。未来HighGUI的和这个窗口的交互函数将由这个名称来**要与哪个窗**互。 c v::n a m e d W i n d o w第二个参数说明了Windows的特性。这可以全部设置为0(默认情况下),也可以设置为cv::WINDOW_AUTOSIZE。在之前的例子中,窗口的大小将会和载入图像的大小一致,图像将会被缩放以适应窗口的大小。在之后的例子中,窗口将会在图像载入的时候被自动缩放以适应图像的真实大小,也可能由用户自行调整。 注2: 当然,如果这样做的话,你需要冒着和其他潜在的命名空间冲突的风险。如果函数f o o()已经存在于c v和s t d的命名空间,必须**你使用的是位于c v::f o o()的函数还是位于std::foo()的函数。在本书中,除了示例2-2,都会指明cv::命名空间,并以此保持一个良好的编程风格。 注3: 好的程序会检查argv[1]是否存在并且给用户反馈一个错误信息,但是在这里没有。我们在本书中将会简略掉这些处理并且假设读者都有足够的的知识来理解处理错误代码的方式及其重要性。 cv::imshow( \"Example1\", img ); 不论何时,只要在c v::M a t中拥有一个图像结构,我们都可以通过c v::i m s h o w()进行显示。c v::i m s h o w()将建一个窗口(如果这个窗口不存在,它会自动调用c v::n a m e d W i n d o w()新建一个窗口)。在调用c v::i m s h o w()的时候,窗口将被重绘上要求的图片,并且窗口会按照要求自动调整大小(如果使用c v::W I N D O W_A U T O S I Z E参数)。 cv::waitKey(0); c v::w a i t K e y(0);函数告诉系统暂停并且等待键盘事件。如果其传入了一个大于零的参数,它将会等待等同于该参数的毫秒时间,然后继续执行程序。如果参数被设置为0或者一个负数,程序将会无限等待直到有键被按下。 因为有c v::M a t,图像将会在生命周期结束的时候自动释放,其行为类似于标准模板库(STL)中的容器类。这种自动的内存释放由内部的引用指针所控制,*重要的是,这表示我们用不着担心图像的内存申请和释放,这将程序员从OpenCV 1.0 IplImage结构繁琐的维护工作中解放了出来。 cv::destroyWindow( \"Example1\" ); *后,我们可以让窗口自行销毁。函数cv::destroyWindow()将会关闭窗口并且释放掉相关联的内存空间。为了*简洁的编码,我们将会在之后的例子中略过这一步。在*长、*复杂的代码中,程序员应该在窗口的生命周期自然结束之前自主销毁窗口以防止内存泄漏。 我们下一个任务是创建一个**简单的、几乎和本例一样的程序来读取视频文件。在此之后,我们将会开始对实际图像进行*多的操作。 \"OpenCV库包含500多个函数,2500多种算法,可以扩展应用到视觉行业中的很多领域,有广泛的用途,比如安保,医学成像,模式与人脸识别,机器人和工业产品检测,等等。《学习OpenCV 3(中文版)》实用性强,内容全面,讲解透彻,可以帮助读者掌握如何构建具有一定AI(人工智能)的应用程序,使计算机能够“看见”并根据所得到的数据来做出决策。《学习OpenCV 3(中文版)》全面介绍整个OpenCV库,所有示例代码都用C++实现,同时还介绍了可以用于计算机视觉的机器学习工具。《学习OpenCV 3(中文版)》每一章都精心设计有动手练习,旨在方便课堂教学和自学,进一步帮助读者学以致用。 通过学习《学习OpenCV 3(中文版)》,读者可以奠定扎实的基础,运用计算机视觉相关知识和OpenCV库来构建简单的或者精巧复杂的应用程序。\"