计算机视觉,C++或Java

adh*_*dhg 13 c++ java opencv computer-vision

我是计算机视觉领域的新手,最近我使用OpenCV和Java实现了一些例子.我对这个领域的潜力印象深刻,并希望继续学习更多.

我了解到OpenCV是用C++编写的,而Java有一个包装器(JavaCV),我知道Java中的应用程序比C++中的应用程序要慢,大多数企业应用程序都是用C++编写的.

我的问题是:我有几年的Java经验,我觉得用它编写任何应用程序都很舒服; 转移到C++学习简历是否应该是聪明的还是我应该坚持使用Java并使用它的包装器.

Sam*_*Sam 16

计算机视觉是一个要求很高的领域 - 虽然你最好保持你所知道的,并且只有在需要表现时才转向opencv,另一个事实是你需要深入研究数学,指针和算法学习和构建一个好的计算机视觉应用程序.而在Java中这样做可能比学习c ++更麻烦.

所以,如果您想要做的就是在某个学校项目的图像上应用过滤器 - 请转到Java.但是如果你想更多地使用OpenCV,学习视觉算法或编写自己的算法,我的强烈建议是学习C++ - 不是那么可怕!

编写本机代码的一个原因是灵活性 - 您需要在Java中执行所有难以处理或性能苛刻的技巧.

简而言之,学习C++比计算机视觉要简单得多.而OpenCV不仅仅是一个你想要调用它来进行处理的库.它是最前沿的技术 - 您需要了解它,入侵它,构建它,遍历代码,远远超过调用someJNIfunc();

如果你这样做,请注意OpenCV提供两个接口 - 一个用于C,一个用于C++.虽然它们提供相同的功能,但C++与Java非常相似 - 具有自动内存管理功能和更多功能.您可以参考这篇文章来查看差异


Ano*_*non 15

我建议坚持你现在所熟悉的东西.只有当您发现它没有公开您想要的某些API或性能实际上成为问题时才切换到C++.现在,你正处于学习阶段.


小智 10

JavaCV使用名为JavaCPP的包装器从Java程序调用OpenCV.JavaCPP自动生成临时本机库,这些库构成JNI使用的桥接器,让Java程序调用OpenCV本机库.

解决方案很优雅,效果很好,但是在安装正确的版本并正确设置类路径方面非常挑剔.您可以在JavaCV论坛和http://code.google.com/p/javacv/wiki/Windows7AndOpenCV上看到人们面临的困难.

我在XP,Windows 7和Ubuntu 10.11上使用了OpenCV-2.3.1,但我花了几天的时间才将它全部更新到OpenCV-2.4.2.ffmpeg特别难以跨越所有平台.

如果使用Java进行高级程序控制,则几乎没有或没有速度开销,因为图像对象和基于列表的数据结构通过指针在本机端维护.一个陷阱是知道谁负责释放分配的内存,因此要为复杂程序的VM崩溃做好准备.

将数据对象传输到Java端有一点开销.我发现将关键点位置复制到Java端Point对象大约需要1微秒.这听起来并不多,但在具有数千个关键点的实时应用程序中,它可以产生影响.我们还通过ByteBuffers将JavaCV IplImage对象复制到Java.这需要一毫秒或更短的时间,因此对于实时使用来说非常可行.

在我们的例子中,我们有大量的Java代码来利用OpenCV.Java的垃圾收集使许多事情变得容易得多.我很满意学习JavaCV的开销非常值得.

我发现有必要在Eclipse中构建项目并从源代码编译JavaCV而不是使用javacv.jar.(您将需要其他.jar文件.)这使您可以检查异常以跟踪库版本和类路径错误.需要JavaCV源来了解JavaCV如何公开OpenCV API.