OpenCV Frame Grabber 不适用于 MacOS Catalina
OpenCV Frame Grabber not work on MacOS Catalina
短版:
当我在 macOS Catalina 终端中键入此命令时:
java -jar test-1.0-SNAPSHOT.jar
得到结果:
Start App
zsh: abort java -jar test-1.0-SNAPSHOT.jar
更多详情:
我在应用程序中的主要功能基于网络摄像头捕获,我要求该应用程序能够在 Windows 10、Linux 和 MacOS 上运行。这就是为什么我决定选择 JavaCV 来处理网络摄像头捕获。在 windows 和 linux 上一切正常。但是,它在 MacOS 上无法正常工作。为了在 Mac 上测试应用程序,我使用的是 virtual box 6.1 和 macOS Catalina 10.15.5。在项目中我也在使用 gradle 和 kotlin.
我还检查了我是否可以从虚拟 machine 访问相机,并且相机在系统应用程序中工作正常。我怀疑该应用程序由于相机权限而无法运行。
我还要补充一点,macOS Catalina 是最新的
基本代码
build.gradle:
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.3.72'
id 'application'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.3'
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
jar {
manifest {
attributes "Main-Class": "App"
}
from {
configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
exclude('META-INF/*.SF')
exclude('META-INF/*.DSA')
exclude('META-INF/*.RSA')
exclude('module-info.class')
}
mainClassName = 'App'
App.kt
import org.bytedeco.javacv.OpenCVFrameGrabber
class App {
companion object {
@JvmStatic
fun main(args: Array<String>) {
println("Start App")
val grabber: OpenCVFrameGrabber = OpenCVFrameGrabber(0);
grabber.start()
}
}
}
为了创建可执行的 jar 文件,我在 mac 终端中输入:
sudo
./gradlew clean build
我解决了我的问题。 macOS 的问题是该应用程序在启动之前应该要求访问相机。 macOS 不将 Jar 文件视为应用程序。
More info here。例如,当您运行通过IDE申请时,系统会要求您访问摄像头。
短版:
当我在 macOS Catalina 终端中键入此命令时:
java -jar test-1.0-SNAPSHOT.jar
得到结果:
Start App
zsh: abort java -jar test-1.0-SNAPSHOT.jar
更多详情:
我在应用程序中的主要功能基于网络摄像头捕获,我要求该应用程序能够在 Windows 10、Linux 和 MacOS 上运行。这就是为什么我决定选择 JavaCV 来处理网络摄像头捕获。在 windows 和 linux 上一切正常。但是,它在 MacOS 上无法正常工作。为了在 Mac 上测试应用程序,我使用的是 virtual box 6.1 和 macOS Catalina 10.15.5。在项目中我也在使用 gradle 和 kotlin.
我还检查了我是否可以从虚拟 machine 访问相机,并且相机在系统应用程序中工作正常。我怀疑该应用程序由于相机权限而无法运行。
我还要补充一点,macOS Catalina 是最新的
基本代码
build.gradle:
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.3.72'
id 'application'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.3'
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
jar {
manifest {
attributes "Main-Class": "App"
}
from {
configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
exclude('META-INF/*.SF')
exclude('META-INF/*.DSA')
exclude('META-INF/*.RSA')
exclude('module-info.class')
}
mainClassName = 'App'
App.kt
import org.bytedeco.javacv.OpenCVFrameGrabber
class App {
companion object {
@JvmStatic
fun main(args: Array<String>) {
println("Start App")
val grabber: OpenCVFrameGrabber = OpenCVFrameGrabber(0);
grabber.start()
}
}
}
为了创建可执行的 jar 文件,我在 mac 终端中输入:
sudo
./gradlew clean build
我解决了我的问题。 macOS 的问题是该应用程序在启动之前应该要求访问相机。 macOS 不将 Jar 文件视为应用程序。 More info here。例如,当您运行通过IDE申请时,系统会要求您访问摄像头。