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 ...
随机推荐
- CC协议是怎么一回事?
CC协议是怎样的? CC-BY-NC-SA (创作共用许可协议) "知识共享"(CC协议)简单介绍 如何使用CC协议? CC 协议使用 FAQ CC协议选择工具 本文章采用 CC ...
- ucore学习
1.启动操作系统的bootloader,用于了解操作系统启动前的状态和要做的准备工作,了解运行操作系统的硬件支持,操作系统如何加载到内存中,理解两类中断--"外设中断"," ...
- golang mysql demo
Go操作Mysql数据库 使用Go操作MySQL等数据库,一般有两种方式:一是使用database/sql接口,直接在代码里硬编码sql语句:二是使用gorm,即对象关系映射的方式在代码里抽象的操作数 ...
- Ajax、XMLHttpRequest、JSONP的区别
来自2020年搜狗的笔试题,第一题就不会
- 一次完整的JVM堆外内存泄漏故障排查记录
前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...
- Myeclipse maven 配置有问题 改之后重启还是不好用
在配置maven项目的时候我一大意选错了maven服务,然后回来改配置文件的时候发现改完之后重启并没有效果,重新清了好几次编译也不好用,最后发现最好是手动去更新一下maven服务的配置文件 位置如下: ...
- shazidouhuiapp
在选择了软件工程专业之后,指导教师也让我们参加到了学长学姐的作业之中来,使用学长学姐们的软件并写出自己的使用评价以及自己的一些小评价. 我这次体验的是第三组的学长学姐们的软件,他们的队名叫天公疼憨仔, ...
- 华为SEO搜索引擎主管招聘内容
http://www.wocaoseo.com/thread-166-1-1.html 华为SEO搜索引擎主管招聘内容: 职位职责 1. 提出全站的SEO策略和实施计划,推动和监督计划实施:负责提升各 ...
- 阿里面试竟如此轻松,2招带你过关斩将拿下offer
在找工作之前首先是要认清一个问题,虽然这个问题比较俗,但是很现实,就是为什么追求高工资? 这个问题我想不用说大家心里也清楚.大部分人都不是当前城市的本地人,说好听了叫来上班,说的不好听其实叫“外来务工 ...
- 【Azure DevOps系列】Azure DevOps生成代码覆盖率
前言 在做单元测试时,代码覆盖率可以作为我们衡量代码质量的一个指标,本章我们将使用Azure DevOps帮助我们生成代码覆盖率的结果.Azure DevOps构建管道还是具有代码覆盖率选项的,在Vi ...