处理4错误:警告:gab.opencv.OpenCV 非法反射访问

3

我正在尝试在Catalina的MAC上使用Processing 4和OpenCV。然而,我遇到了以下错误:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by gab.opencv.OpenCV (file:/Users/mmemmo/Documents/Processing/libraries/opencv_processing/library/opencv_processing.jar) to field java.lang.ClassLoader.sys_paths

当我运行这段代码时

import gab.opencv.*;
import processing.video.*;
import java.awt.*;

Capture video;
OpenCV opencv;

void setup() {
  size(640, 480);
  video = new Capture(this, 640/2, 480/2);
  opencv = new OpenCV(this, 640/2, 480/2);
  //CASCADE_EYE
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);  
 // opencv.loadCascade(OpenCV.CASCADE_EYE);  

  video.start();
}

void draw() {
  scale(2);
  opencv.loadImage(video);

  image(video, 0, 0 );

  noFill();
  stroke(0, 255, 0);
  strokeWeight(3);
  Rectangle[] faces = opencv.detect();
  println(faces.length);

  for (int i = 0; i < faces.length; i++) {
    println(faces[i].x + "," + faces[i].y);
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
  }
  
  if(faces.length > 0 ){
    println("Hello Human");enter code here
  }
}

void captureEvent(Capture c) {
  c.read();
}

我知道Processing在Catalina上存在相机问题,但这似乎不是问题所在。我能够在其他草图中成功使用相机。

我会感激任何反馈。谢谢。

2个回答

3

Java 9引入的模块系统对其他模块所使用的功能有更多限制。关于此问题和答案的更多信息,请查看什么是非法的反射访问

你使用Processing 4的特定原因吗?目前只有alpha版本可用,所以如果可能的话,我建议您使用Processing 3。当我在Processing 4中运行你的代码时,会出现与你相同的错误。而在Ubuntu上运行Processing 3.5.4时,没有任何问题并且可以进行人脸识别。我建议您试试Processing 3。


2
谢谢您的回复。非常有帮助。我使用Processing 4,因为之前所有版本的Processing和MAC OS Catalina都有报告问题。然而,3.5.4也可以工作!需要注意的是,我必须通过终端运行它才能让相机工作。否则,MAC OS不会给您访问相机的权限。再次感谢。 - Matthew Memmo

0

我修改了opencv-processing库,让它可以在processing 4下工作。 虽然不是完美的,但总归能用。 https://github.com/jaegonlee/opencv-processing/releases

原始的opencv-processing库使用以下代码设置库路径。但是它在Java 11(Processing 4)中无法工作,并引发警告。

public static void setLibraryPath(String path) throws Exception {
    System.setProperty("java.library.path", path);

    //set sys_paths to null so that java.library.path will be reevalueted next time it is needed
    final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
    sysPathsField.setAccessible(true);
    sysPathsField.set(null, null);
}

我将其删除后警告消失了。修改后的库在Processing IDE中运行正常,但导出的应用在macOS上无法运行。


仅提供链接作为答案被认为是非常低质量的,因为它没有直接回答问题并解决问题。链接通常用作给出答案的参考。 - I_love_vegetables

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接