在Mac Mojave上使用OpenCV无法访问相机

5

我尝试运行一些基本的OpenCV代码,打开网络摄像头。在我更新到Mac Mojave之前,我能够运行这个代码,但之后我在构建和运行时遇到了这个错误。

`[access] This app has crashed because it attempted to access privacy- 
 sensitive data without a usage description.  The app's Info.plist must 
 contain an NSCameraUsageDescription key with a string value explaining 
 to the user how the app uses this data.`

我根据其他帖子上的步骤,在项目中(与main.cpp位于同一目录)创建了Info.plist文件,但是系统报错说无法解析Info.plist文件的内容。

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>uses camera to see vision targets</string>
</dict>

我该如何解决这个问题并让它读取Info.plist文件?
2个回答

1

我最终通过在Stackoverflow和GitHub上的建议链来解决了这个问题。这是一个痛苦的bug,花费了我一整天的时间,尽管在MacOS Mojave之前,我的代码已经可以正常工作了。

解决方法

将带有NSCameraUsageDescription字段的Info.plist文件作为suggested放置在您的目标的Products/Build目录中(在Xcode项目中左侧面板中右键单击Product并单击“Show in Finder”)。

  • 通过将其添加到“Target”的“Build Phases”下的“Copy Files”列表中,并将Destination更改为“Products Directory”,Subpath更改为“。”,自动化此复制/粘贴Info.plist到您的Build目录的过程(按照此suggestion

结果

  • 目标的Unix可执行二进制文件将要求访问相机,并在同意后,该二进制文件将被添加到可以访问相机的应用程序列表中。您可以通过 系统偏好设置 > 隐私 > 相机 来查看这个列表。
    • FYI:要清除此列表,请在终端中键入tccutil reset Camera
  • 您可能需要运行目标几次,然后才会提示您允许权限/访问相机。

问题

实例化cv :: VideoCapture(0)对象以访问摄像头视频流,在Mojave之前的MacOS版本中代码运行良好,但会抛出以下错误:

OpenCV:未经授权捕获视频(状态为0),正在请求...
OpenCV:相机未能正确初始化!

原因

MacOS Mojave加强了隐私保护,现在需要应用程序明确提示并获取访问相机的权限,如此处所述。

未成功的建议

以下来自各种 Stackoverflow 帖子 的建议未能成功地强制构建二进制文件以提示访问相机权限: - 将 Info.plist 添加到您的项目目录中 - 在 Build Settings > Packaging > Info.plist File 下设置路径到 Info.plist 或者 - 在您的目标的 General > Identity > Choose Info.plist File... 中选择它

可能有帮助的建议

opencv 关闭的 GitHub 问题 所示,libopencv 在 '19 年 4 月左右进行了一些更改,这也可能促进了在构建目录中使用可用的 Info.plist 来提示用户访问相机权限。因此,我还使用 brew upgrade 升级了我的 opencv 到最新稳定版本 4.1.0

附言:我正在运行MacOS Mojave 10.14.5,Xcode 10.2.1和OpenCV 4.1.0


1
你缺少了闭合的</plist>标签。只需将其作为文件的最后一行添加即可使其正常工作。

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