首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中使用OpenCV 4在Raspberry PI (armv6和armv7 Raspian)上使用?

如何在Java中使用OpenCV 4在Raspberry PI (armv6和armv7 Raspian)上使用?
EN

Stack Overflow用户
提问于 2020-06-22 00:46:11
回答 1查看 1.6K关注 0票数 7

这个问题非常类似于这一个,但是它在Linux ( Raspberry )上。

我已经从源代码中编译了OpenCV 4.4.0以及Java,并尝试了类似这样的攻击(在Windows上有效):

代码语言:javascript
复制
import org.opencv.core.*;

public class CVTest {

        public static void main(String[] args) {
                System.out.println("setup");
//              loading the typical way fails :(
//              System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

                System.load("/home/pi/eclipse/CVTest/lib/libopencv_core.so");
////System.load("/home/pi/opencv/build/lib/libopencv_core.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_imgproc.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_imgcodecs.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_img_hash.so");
////System.load("/home/pi/eclipse/CVTest/lib/opencv_core.so");//videoio_ffmpeg440_64.dll
//System.load("/home/pi/eclipse/CVTest/lib/libopencv_videoio.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_photo.so");

System.load("/home/pi/eclipse/CVTest/lib/libopencv_xphoto.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_flann.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_features2d.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_calib3d.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_phase_unwrapping.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_structured_light.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_xfeatures2d.so");

System.load("/home/pi/eclipse/CVTest/lib/libopencv_video.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_ximgproc.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_aruco.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_bgsegm.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_bioinspired.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_objdetect.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_face.so");

System.load("/home/pi/eclipse/CVTest/lib/libopencv_dnn.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_tracking.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_plot.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_ml.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_ml.so");
System.load("/home/pi/eclipse/CVTest/lib/libopencv_text.so");
// crashes here!
System.load("/home/pi/eclipse/CVTest/lib/libopencv_java440.so");


Mat m = Mat.eye(new Size(3,3), CvType.CV_8UC1);
                System.out.println("done");
        }
        
}

但是,根据Raspberry的不同,我在同一行得到不同的崩溃,加载libopencv_java440 (在其他依赖库加载之后):

在Raspberry Pi 3B运行拉斯宾伸展时,我会遇到这样的错误:

代码语言:javascript
复制
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGBUS (0x7) at pc=0x6360f644, pid=9730, tid=0x64eba470
#
# JRE version: Java(TM) SE Runtime Environment (8.0_202-b08) (build 1.8.0_202-b08)
# Java VM: Java HotSpot(TM) Client VM (25.202-b08 mixed mode linux-arm )
# Problematic frame:
# C  [libopencv_core.so+0x258644]  cv::Ptr<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::~Ptr()+0x38
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

---------------  T H R E A D  ---------------

Current thread (0x76162400):  VMThread [stack: 0x64e3b000,0x64ebb000] [id=9733]

siginfo: si_signo: 7 (SIGBUS), si_code: 1 (BUS_ADRALN), si_addr: 0x7c1f010e

Registers:
  r0  = 0x636e6270
  r1  = 0x00000000
  r2  = 0x000011f8
  r3  = 0x7c1f010e
  r4  = 0x7c1f00f2
  r5  = 0x636e6270
  r6  = 0x76ee84ac
  r7  = 0x00000001
  r8  = 0x6470c600
  r9  = 0x000003ec
  r10 = 0x000003ec
  fp  = 0x64eb9c0c
  r12 = 0x76fa4ce4
  sp  = 0x64eb9be8
  lr  = 0x76ddadd4
  pc  = 0x6360f644
  cpsr = 0x20000010

Top of Stack: (sp=0x64eb9be8)
0x64eb9be8:   76ee8000 00000000 76ee84ac 76ddadd4
0x64eb9bf8:   76129d7c 76ddae34 00000000 76635d7c
0x64eb9c08:   64eb9c2c 768ac3dc 76162270 63736954
0x64eb9c18:   76940000 76129988 76129990 76129d7c
0x64eb9c28:   64eb9ca4 768aaa54 7696a050 76942d14
0x64eb9c38:   64eb9ca4 767f8084 00000000 00000000
0x64eb9c48:   8c365cd8 00000000 76909901 76966044
0x64eb9c58:   76163208 00000000 00000000 7696a050

Instructions: (pc=0x6360f644)
0x6360f624:   0a00000d e59f20c4 e7933002 e3530000
0x6360f634:   0a00000b e284301c ee070fba e1932f9f
0x6360f644:   e2421001 e1830f91 e3500000 1afffffa
0x6360f654:   e3520001 ee070fba 0a00000f e1a00005

Register to memory mapping:

  r0  = 0x636e6270

在一个覆盆子Pi ZeroW上,也运行着里斯宾伸展I,一个强大的日志:示例

对于如何让OpenCV Java绑定在arvm6 6/armv7 7 CPU上工作,有什么建议吗?

多亏@Catree的评论,更新了,我也运行了这些测试。正如您在tests.txt中看到的,大多数测试都在运行,但不包括需要加载资产的测试(一定是运行资产部分失败了)。

我也尝试过运行Java测试,但是我忽略了一些显而易见的东西,因为我传递给包含opencv共享库的lib文件夹的java.library.path参数似乎不起作用。您可以在tests.txt中查看输出

我也尝试过旧式的2.4java指定正确的java类路径和库路径的Java开发OpenCV教程简介,但是遇到了一个分段错误:/

代码语言:javascript
复制
java -Djava.library.path=/home/pi/opencv/build/lib -classpath /home/pi/opencv/build/bin/opencv-440.jar:/home/pi/opencv/build/build/jar/SimpleSample.jar SimpleSample -verbose
Segmentation fault

任何关于进展的提示或提示都将不胜感激。

Update 2遵循@moyeen52 52的建议编译了OpenCV静态库(-DBUILD_SHARED_LIBS=OFF),并注意到libopencv_java.so从2.1MB增加到了31 to。不幸的是,我仍然得到相同的分段错误:

我还查看了另一篇文章,但不幸的是,由于OpenCV已经编译了libopencv_java440.so (不需要重命名),它并不适用。

更新3以方便使用Raspberry PI 3 B+测试任何人,我上传了以下内容:

  • HelloCV.tar.gz:包含Hello.java (它只是尝试加载库、创建一个Mat并打印它)、opencv-440.jar、libopencv_java440.so (静态构建)以及compile.sh和run.sh,它们应该使用正确的参数调用javac/java,在本地引用java和c++库。
  • rpi3b.tar.gz:静态库构建
  • rpi3b.tar.gz:共享库构建

此外,我将尝试重新编译,而不需要libatomic NEONVPF3 CPU优化,并将发布更新。

非常感谢您的建议和建议!谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-13 21:22:25

感谢大家的评论:它们有助于缩小问题范围,找到解决办法。

c++错误可能是由于C++编译器之间的差异(以及对c++ 11或更高版本的支持)造成的。虽然我找到了一些关于更新g++的资源(从6.3.0到8.3.0),但我不想冒着遇到其他问题的风险。

对于每个系统(PiZeroW (armv6)和Pi3B+ (armv7)),我都使用了全新的Raspian (Buster)安装,它们完全不存在任何问题。此外,为了满足我的项目需求,我使用了OpenJDK 8而不是11。

我在这里存储了预构建二进制文件(安装文件夹的全部内容):

此外,java包装器还有一个Hello测试和编译/运行bash脚本的最小zip:

  • HelloCVPI0W.tar.gz for armv6:在Raspberry Pi 0上测试
  • HelloCVPI3B+.tar.gz for armv7:在覆盆子Pi 3 B+上进行测试
  • HelloCVPI4.tar.gz for armv7:在树莓Pi 4上进行测试

(Note Java包装器是用OpenJDK 8编译的)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62505966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档