macOS 上的 OpenCV VideoCapture.open() "not authorized to capture video" 错误(在 Java 中)

OpenCV VideoCapture.open() "not authorized to capture video" error on macOS (in Java)

我正在制作一个使用计算机视觉 (OpenCV) 的跨平台 Java 应用程序。我需要从网络摄像头接收视频。当前使用标准 OpenCV 方法:

VideoCapture videoCapture = new VideoCapture();
videoCapture.open(cameraIndex);
...
videoCapture.read(frame);

当然是在访问相机之前加载原生的OpenCV库:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

库是使用这些参数构建的:

-D WITH_IPP=OFF \
-D BUILD_opencv_java=ON \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=../../opencv-4.5.3/build/install \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.3/modules \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_EXAMPLES=OFF \
-D OPENCV_JAVA_SOURCE_VERSION=1.8 \
-D OPENCV_JAVA_TARGET_VERSION=1.8 \
-D BUILD_SHARED_LIBS=OFF \
-D BUILD_FAT_JAVA_LIB=ON \
-D WITH_MATLAB=OFF \
-D BUILD_ZLIB=OFF \
-D BUILD_TIFF=OFF \
-D BUILD_JASPER=OFF \
-D BUILD_JPEG=OFF \
-D BUILD_PNG=OFF \
-D WITH_JPEG=OFF \
-D WITH_PNG=OFF \
-D WITH_OPENEXR=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \

相机适用于 Windows 10 (x64) 和 Kali Linux (amd64)。但在 macOS 上不行。

执行videoCapture.open(cameraIndex)函数后,控制台出现错误信息并关闭应用程序:

OpenCV: not authorized to capture video (status 0), requesting...
OpenCV: can not spin main run loop from other thread, set OPENCV_AVFOUNDATION_SKIP_AUTH=1 to disable authorization request and perform it in your application.
OpenCV: camera failed to properly initialize!

我尝试了很多东西,例如在 videoCapture.open() 之后 export OPENCV_AVFOUNDATION_SKIP_AUTH=0Thread.sleep(1000) 或在另一个线程中打开相机。我还添加了 Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSCameraUsageDescription</key>
    <string>Application needs permission to access the camera to capture images</string>
</dict>
</plist>

进入我的 .jar 的 src 文件夹。但没有任何帮助。

我读过这些:

和许多其他资源,但仍然没有答案。

我什至尝试使用 OpenPVP-capture-java (https://github.com/openpnp/openpnp-capture-java) 库,但这没有帮助。

objc[2116]: Class PlatformAVCaptureDelegate is implemented in both /private/var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/jna-3506402/jna6724263821710587077.tmp (0x14fac7cd8) and /private/var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/jna-3506402/jna1573965830287255196.tmp (0x14faf9cd8). One of the two will be used. Which one is undefined.
2021-10-09 20:44:39.093 java[2116:99975] Requesting permission, bundle path for Info.plist: /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin
zsh: abort      java -Djava.library.path=. -jar CamTest.jar

在系统设置中,终端可以访问摄像头。此外,Ubuntu 上的相机存在问题(在 videoCapture.open() 后,程序冻结)。但这是另一个问题的主题。

有没有办法在 macOS 上访问 OpenCV (Java) 的相机?也许使用某种第三方跨平台库...

我再次回答我自己的问题...

谢谢@ChristophRackwitz!在你问相机是否在python下工作后,我检查了它(我不知道为什么我以前没有这样做)。因此,python(使用 opencv-contrib-python)中的相机可以正常工作,所以我意识到问题出在 Java(JDK)本身。

我用这个命令安装了 JDK 8:

brew tap adoptopenjdk/openjdk
brew install --cask adoptopenjdk8

所以,我的 JAVA_HOME 是 /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

我不知道它是坏了 Java 还是其他什么,但是 当我安装 Java11 时: brew install java11 并设置 JAVA_HOME to /usr/local/Cellar/openjdk@11/11.0.12/ 终于可以用了!

我在这上面花了很多时间,解决方案只是在错误的 Java 版本中...这很奇怪,因为我的应用程序(和 .jar 文件)是用 JDK 编译的8. 在其他操作系统(Windows、Linux)上,Java 一切正常 8. 不管怎样,现在当我从终端启动应用程序时,它请求访问相机一切正常!