Processing 4 error: WARNING: Illegal reflective access by gab.opencv.OpenCV

Processing 4 error: WARNING: Illegal reflective access by gab.opencv.OpenCV

我正在尝试在带有 Catalina 的 MAC 上将 OpenCV 与 Processing 4 结合使用。 但是,我收到以下错误:

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 有相机问题。这似乎不是这里的问题。我能够让相机在其他草图中工作得很好。

如果有任何反馈,我将不胜感激。谢谢

Java9 中引入的模块系统在哪些模块可以使用其他模块的功能方面有更多的限制。有关详细信息,请参阅此问题和答案:

您使用 Processing 4 是否有特定原因?目前只有 alpha 版本可用,所以如果可能的话我会使用 Processing 3。当我尝试 运行 您在处理 4 中的代码时,我遇到了与您相同的错误。当我 运行 你在 Processing 3.5.4 中的代码(在 Ubuntu 上)时,它 运行 没有任何问题并且面部识别正在工作。我建议尝试一下 Processing 3。

我修改了 opencv-processing 库,它适用于处理 4。 不完美,但它仍然有效。 https://github.com/jaegonlee/opencv-processing/releases

原来的opencv-processing库设置库路径用这段代码。但它不适用于 Java 11(处理 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。