写这篇随笔的原因是因为我用了JavaCV一段时间后项目情况糟透了,可能大家很熟悉OpenCV,也有一部分人熟悉JavaCV,但是我相信真正把JavaCV用到生产上的不是太多。

我参与图片处理项目快一个月了,最初抱着很大兴趣参与这个项目,渐渐的发现这个领域并不太好走。

官网地址:

JavaCV据说比OpenCV多封装了很多库,但是目前我都没用到,当时应用JavaCV的理由是不用单独安装OpenCV,不用根据环境进行库的切换,

引入pom文件后则可以直接干活。

org.bytedeco

javacv-platform

1.5.4

JavaCV的不稳定问题

多次仿射结果不一致,我想用JavaCV做仿射变换,缩小图片,发现多次结果不一致,但是用OpenCV就没有这个问题

@Testpublic voidwarpAffine() {

Mat src=imread("D:\\img\\0_7p-1.jpg");Mat dst= newMat();

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=newDate();

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的结果

@Testpublic voidtest(){

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= newMatOfPoint2f(p1,p2,p3);

MatOfPoint2f ma2= newMatOfPoint2f(p4,p5,p6);

Date date=newDate();//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重写项目,但愿不会再出现这个问题。

java opencv yuv_JavaCV与OpenCV的区别和使用中遇到的问题相关推荐

  1. opencv第三方库JAVA接口,SpringBoot使用OpenCV示例总结

    前言 最近有个项目需要对图片图像进行处理,使用到了开源框架OpenCV全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库:而现在的项目都是基于Sp ...

  2. Java服务器部署基于OpenCV的C++图像处理项目(三)图片上传并返回处理图

    Java服务器部署基于OpenCV的C++图像处理项目(三)图片上传并返回处理图 1.上传图片并返回灰度图功能 由于使用的springboot开发,直接写一个upload接口供图片上传,以下是spri ...

  3. OpenCV简介、OpenCV的发展历程

    OpenCV简介.OpenCV的发展历程 近年来,人工智能是伴随着科技发展出现的一个重要词汇,全球多个国家提出了发展人工智能的规划方案.我国也在大力发展人工智能,众多高校也纷纷成立了关于人工智能的学院 ...

  4. 【OpenCV入门教程之一】 安装OpenCV OpenCV 3 0 OpenCV 2 4 8 OpenCV 2 4 9

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴!  本系列 ...

  5. java aes php_php和java的aes默认加密算法有点区别及解决方法。

    1.php和java的aes默认加密算法有点区别,php能解密java加密的密文,但java不能解密php加密的密文.原因在于: 1.Java中AES加密与解密默认使用AES/ECB/PKCS5Pad ...

  6. java char的包装对象,Java 从Character和char的区别来学习自动拆箱装箱

    本文结构 1.Character和char 的区别: 2.自动拆箱装箱java 1.Character和char 的区别: Character是类,char基本数据类型.数组 在java中有三个类负责 ...

  7. c语言 python-C语言、Java语言和python语言的区别在哪里

    原标题:C语言.Java语言和python语言的区别在哪里 我们经常听到C语言.Java语言和python语言,那么这三者的区别在哪里呢?随着科技的进步以及新技术的推进,编程语言的种类也是越来越多,随 ...

  8. 【opencv】1.opencv安装、编译、运行等踩坑记录

    1.安装python2环境下opencv2.4.9安装不成功的解决方法 2.查看linux下的各种安装库的安装位置和版本,以opencv为例 3.cmake与g++: opencv之在Linux下编译 ...

  9. 解决OpenCV问题:OpenCV Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale,

    解决OpenCV问题:OpenCV Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale, 目录 ...

最新文章

  1. 有bug!用Pytorch Lightning重构代码速度更慢,修复后速度倍增
  2. 数据中心的PUE 最低可至1.15,浸没式液冷技术是关键
  3. [Linux] Vmware 15安装CentOs后显示网络不可用
  4. Github 上 10 个值得学习的 Springboot 开源项目
  5. antdesignvue upload vue3个人笔记待更新
  6. String、Path、File、Directroy 常用方法总结
  7. Objective-C学习之旅(四)----内存管理2----retain点语法
  8. 遥感分类误差矩阵_遥感卫星影像之分类精度评价
  9. mysql5.7 开启重连_MySQL5.7.9,怎样永久设置client、connection、results这三项为utf8?...
  10. 自己动手写操作系统(高清图书+源代码)分享
  11. 一步到位,直播系统源代码搭建直播推流服务器
  12. 索尼计算机bios正确设置,索尼vaio笔记本如何进入bios设置_索尼笔记本进入bios图解...
  13. pandas缺失数据处理
  14. vuejs的学习笔记
  15. 宁德时代与蔚来签署全面战略合作协议;中国通信服务委任闫栋为公司总裁 | 美通企业日报...
  16. element-plus ui表格表头筛选功能
  17. VMware ESXI 5.5 死机 红屏问题
  18. 国内外优秀的垂直搜索引擎
  19. 计算机应用素描色彩,美术统考素描、色彩、速写考场技巧全攻略
  20. C语言学习(四)字符串和格式化输入/输出

热门文章

  1. vs2005 无法加载服务器控件解决办法
  2. 【Hibernate】JDBC操作与hibernate的区别
  3. 关于Myeclipse2017 MemoryAnalyzer的安装
  4. 如何验证本地磁盘或网络磁盘是否可以进行读写操作
  5. HTML5按钮的点击态问题
  6. 迷你图标集大集合:5000+ 30套免费的图标
  7. Windows Phone 7中用好Silverlig“.NET研究”ht开发利器
  8. 轻量又高效,Apache Shiro 你值得拥有!
  9. php 毛玻璃,CSS3实现毛玻璃(图片模糊)效果
  10. Nginx负载均衡策略介绍