JavaCV与OpenCV的区别和使用中遇到的问题
写这篇随笔的原因是因为我用了JavaCV一段时间后项目情况糟透了,可能大家很熟悉OpenCV,也有一部分人熟悉JavaCV,但是我相信真正把JavaCV用到生产上的不是太多。
我参与图片处理项目快一个月了,最初抱着很大兴趣参与这个项目,渐渐的发现这个领域并不太好走。
- 官网地址:
JavaCV:http://bytedeco.org/,https://github.com/bytedeco/javacv
OpenCV:https://docs.opencv.org
JavaCV据说比OpenCV多封装了很多库,但是目前我都没用到,当时应用JavaCV的理由是不用单独安装OpenCV,不用根据环境进行库的切换,
引入pom文件后则可以直接干活。
- <dependency>
- <groupId>org.bytedeco</groupId>
- <artifactId>javacv-platform</artifactId>
- <version>1.5.4</version>
- </dependency>
- JavaCV的不稳定问题
多次仿射结果不一致,我想用JavaCV做仿射变换,缩小图片,发现多次结果不一致,但是用OpenCV就没有这个问题
- @Test
- public void warpAffine() {
- Mat src=imread("D:\\img\\0_7p-1.jpg");
- Mat dst = new Mat();
- Point2f point2fSrc = new Point2f(3);
- point2fSrc.position(0).y(0).x(0);//TopLeft
- point2fSrc.position(1).y(0).x(src.cols()-1);//TopRight
- point2fSrc.position(2).y(src.rows()-1).x(0);//Bottom Left
- Point2f point2fDst = new Point2f(3);
- point2fDst.position(0).y(0).x(0);//TopLeft
- point2fDst.position(1).y(0).x(src.cols()/2);//TopRight
- point2fDst.position(2).y(src.rows()/2).x(0);//Bottom Left
- Date date=new Date();
- Mat affineTrans2 = opencv_imgproc.getAffineTransform(point2fSrc,point2fDst);
- opencv_imgproc.warpAffine(src, dst, affineTrans2, src.size());
- System.out.println(new Date().getTime()-date.getTime());
- imwrite("D:\\img\\7p-2.jpg", dst);
- }
结果应为等比缩小一倍,但是右边的图有变形,而且多次结果会不一致。
再看直接用OpenCV javaAPI的结果
- @Test
- public void test(){
- System.load("C:\\Program Files\\opencv\\opencv\\build\\java\\x64\\opencv_java410.dll");
- System.out.println("Welcome to OpenCV " + Core.VERSION);
- Mat src = Imgcodecs.imread("D:/img/0_7p-1.jpg");
- Mat dst = new Mat((src.rows()/2),src.cols()/2,src.type());
- Point p1 = new Point( 0,0 );
- Point p2 = new Point( src.cols() - 1, 0 );
- Point p3 = new Point( 0, src.rows() - 1 );
- Point p4 = new Point( 0, 0);
- Point p5 = new Point( src.cols() /2, 0 );
- Point p6 = new Point( 0, src.rows() /2);
- // Point p4 = new Point( src.cols() /2, 0);
- // Point p5 = new Point( src.cols() /2, src.rows() /2 );
- // Point p6 = new Point( 0, 0);
- MatOfPoint2f ma1 = new MatOfPoint2f(p1,p2,p3);
- MatOfPoint2f ma2 = new MatOfPoint2f(p4,p5,p6);
- Date date=new Date();
- // Creating the transformation matrix
- Mat tranformMatrix = Imgproc.getAffineTransform(ma1,ma2);
- // Applying Wrap Affine
- Imgproc.warpAffine(src, dst, tranformMatrix, src.size());
- System.out.println(new Date().getTime()-date.getTime());
- // Writing the image
- Imgcodecs.imwrite("D:/img/bbb.jpg", dst);
- }
bbb.jpg图像处理正确,多次执行代码结果一致。
- 性能对比:
同样的图片放射缩小,基于JavaCV处理时间为174毫秒,OpenCV javaAPI的处理时间为11毫秒,差别接近17倍;
这里我要说明一下,例子不具备普遍性,其它API我没有一个一个的测试,希望对大家有帮助。
- JavaCV的另外一个多线程并发问题:
我尝试用20个线程压测系统报了一个JVM错误:
- #
- # A fatal error has been detected by the Java Runtime Environment:
- #
- # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffec4062738, pid=21668, tid=8404
- #
- # JRE version: Java(TM) SE Runtime Environment 18.9 (11.0.8+10) (build 11.0.8+10-LTS)
- # Java VM: Java HotSpot(TM) 64-Bit Server VM 18.9 (11.0.8+10-LTS, mixed mode, tiered, compressed oops, g1 gc, windows-amd64)
- # Problematic frame:
- # C [opencv_imgproc430.dll+0x1e2738]
- #
- # Core dump will be written. Default location: E:\img\hs_err_pid21668.mdmp
- #
- # If you would like to submit a bug report, please visit:
- # https://bugreport.java.com/bugreport/crash.jsp
- # The crash happened outside the Java Virtual Machine in native code.
- # See problematic frame for where to report the bug.
- #
查看mdmp文件:
- 转储文件: hs_err_pid21668.mdmp : E:\img\hs_err_pid21668.mdmp
- 上次写入时间: 2020/9/16 10:04:42
- 进程名称: java.exe : C:\Program Files\Java\jdk-11.0.8\bin\java.exe
- 进程架构: x64
- 异常代码: 0xC0000005
- 异常信息: 该线程尝试读写某个虚拟地址,而它对该地址不具有相应的访问权限。
- 堆信息: 存在
查询一番资料并没有找到解决办法,我并不清楚直接用OpenCV JavaAPI是否有同样的问题,如果知道如何解决欢迎留言,感激不尽。
虽然找到了一个缓解问题的方法,是设置JVM参数的-Xmx8g -Xms8g -Xmn4g,20个线程测试一般不出问题,50个并发有一半的概率死掉。
现在我决定用OpenCV重写项目,但愿不会再出现这个问题。
JavaCV与OpenCV的区别和使用中遇到的问题的更多相关文章
- EmguCV学习 与opencv的区别和联系
openCV是因特尔的一个开源的视觉库,里面几乎包含了所有的图像处理的经典算法,并且采用C和少量的C++编写,运行效率很高,对于做图像处理这方面工作的,认识opencv是必须的工作.不过opencv有 ...
- 有不少朋友问我Halcon和Opencv的区别?
Halcon:机器视觉行业里知名的商业视觉库,非开源的,在国内市场份额处于第一,其提供了1500个多个API算子供开发人员使用,有些编程基础的都可以轻松的入门,其调试也是很方便的,断点单步运行,图像变 ...
- [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法
原文地址:http://blog.csdn.net/watkinsong/article/details/9849973 有一种方式不需要自己配置所有的Sun JDK, Android SDK以及ND ...
- javacv
(看到有很多同学都来看这篇文章,说明可能是有必要的,然后这个写的比较水,所以 如果求干货的话,请移步: http://www.cnblogs.com/letben/p/5885799.html 但是 ...
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
以前写过两个Android开发配置文档,使用NDK进行JNI开发,这样能够利用以前已经写好的C++代码. 前两篇博客地址: http://blog.csdn.net/watkinsong/articl ...
- OpenCV读一张图片并显示
Java 版本: JavaCV 用OpenCV读一张图片并显示.只需将程序运行时的截图回复.如何安装配置创建项目编写OpenCV代码,可参考何东健课件和源代码或其他资源. package com.gi ...
- javacv教程文档手册开发指南汇总篇
本章作为javacv技术栈系列文章汇总 前言 写了不少关于javacv的文章,不敢说精通 ,只能说对javacv很熟悉.虽然偶尔也提交pull request做做贡献,但是javacv包含的库实在太多 ...
- 超详细的编码实战,让你的springboot应用识别图片中的行人、汽车、狗子、喵星人(JavaCV+YOLO4)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Python各类图像库的图片读写方式总结
最近在研究深度学习视觉相关的东西,经常需要写python代码搭建深度学习模型.比如写CNN模型相关代码时,我们需要借助python图像库来读取图像并进行一系列的图像处理工作.我最常用的图像库当然是op ...
随机推荐
- 重回OI的第一篇博客
太久没学OI了, 代码都不会写了, 先写一篇BFS练练手, 是我太菜了qwq #include<cstdio> #include<queue> #include<iost ...
- CAP 3.1 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 3.1 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了 4000 Star. CAP 3000 Star 还是去年8月份的时候,最 ...
- Elasticsearch聚合语句
聚合的范围是search query过滤出的数据 四种聚合类型: 一.Bucketing 桶聚合,常规的分类然后计算每个分类的文档数量 二.Metric 分类并对一组文档进行sum.avg等数学运算 ...
- springboot-遇到的错误
1.Field userMapper in com.yanan.outjob.controller.SysUserController required a bean of type 'com.yan ...
- openvswitch 流表测试 ovs-appctl
[root@ostack170 ~]# ovs-appctl ofproto/trace br-mirror in_port=,dl_vlan=,dl_src=:ea:cb:5d:e4:ee,dl_d ...
- 浅谈Docker(二)
Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...
- Ubuntu 下查看CPU 信息命令
from: http://hi.baidu.com/hermitinhistory/blog/item/ce64d5fb6b23b71b6d22eb95.html 查看当前操作系统内核信息 uname ...
- Flink启动脚本改造--制作适用于CDH的Flink parcel包
#!/usr/bin/env bash ################################################################################ ...
- Git-commit-中添加表情
git commit 中使用表情 我们经常可以在github上看到国外大佬的commit信息中有很多可爱的表情,这是怎么做到的呢? ok,可以这样使用哦:git commit -m '提交信息 :em ...
- IDEA下Maven项目搭建踩坑记----2.项目编译之后 在service层运行时找不到 com.dao.CarDao
项目写的差不多 想运行一下,然后发现运行到Service层的时候报错说找不到Dao层文件 ,纠结半天之后看了下编译好的项目文件,发现mapper文件下边是空的, 于是就百度找一下原因,结果说是IDEA ...