计算机视觉,C ++或Java

时间:2012-01-03 19:36:10

标签: java c++ opencv computer-vision

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

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

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

6 个答案:

答案 0 :(得分:16)

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

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

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

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

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

答案 1 :(得分:15)

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

答案 2 :(得分: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。

答案 3 :(得分:2)

在OpenCV库中花费了多少时间以及在您的程序中花费了多少时间?如果您的程序完全使用C ++,那么它无法将您在程序中(在库外)花费的时间减少到最少。例如如果您将99%的时间花在库中,那么使用C ++不能使它快1%以上。

答案 4 :(得分:1)

对于简单程序,Java和C ++在速度上没有任何显着差异。但是对于具有大量计算复杂性的大型代码,C ++变得更快。 包装器确实存在开销问题。但对于一个小程序来说,这个数字可以忽略不计。如果用Java编写复杂的代码,将其重写为C ++并不容易。这是因为Java中可用的大量函数与C ++有很大不同。

是否应该为OpenCV使用Java或C ++取决于您的动机。 如果您真的想要精益OpenCV并参与一些大型项目,我建议您继续使用C ++。但是,如果您正在寻找OpenCV的一些乐趣,那么最好坚持您所知道的。

答案 5 :(得分:1)

在C ++或Java中,最好使用C ++。我几乎没有Java的经验,但是我推荐C ++的原因是它在ML&CV库中的普遍用法。

强大而灵活的计算机视觉应用程序的最佳解决方案之一可能是下一个序列:

  1. 使用灵活的Python和流行的机器学习库训练模型;
  2. 存储预先训练的重量;
  3. 使用OpenCV库将有用的但不广泛的Mat类重写为C ++的最佳模型体系结构,或者编译为C ++ ML模型;
  4. 使用确定的设备处理器规范进行编译。

该解决方案的优势在于应用程序的工作速度,代码安全性,开发速度以及与许多设备的兼容性。 此外,Python Tensorflow和其他模型可以加载到C ++,例如PyTorch。 此外,使用C ++ OpenCV代码从CV社区获得帮助要容易得多。

缺点是大量的开发问题和开发速度(在Java中可能不会被忽略),有时是OpenCV lib严格的灵活性限制,以及许多您在一开始可能就不会想到的其他问题。