OpenCV命令行应用程序无法在macOS Mojave下访问相机

史蒂夫

我无法从命令行OpenCV程序访问iMac相机。(我正在CodeRunner而不是Xcode下编译和运行程序。)我已经读过MojaveNSCameraUsageDescription在Info.plist中需要的内容,并且我认为我已经将其正确地嵌入了二进制文件中。在编译标志中添加了-sectcreate __TEXT __info_plist Info.plist我在这里了解到),当我运行时otool -X -s __TEXT __info_plist videotest | xxd -r(从同一篇博客文章中)它输出:

-?<?xml ve.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>
    <key>NSMicrophoneUsageDescription</key>
    <string>This app requires to access your microphone in order to access the camera</string>
</dict>
</plist>

(我添加了NSMicrophoneUsageDescription,以防它试图与相机一起打开麦克风。)

这是我运行程序时的输出:

OpenCV version 4.1.0-dev
[ INFO:0] global /Users/steve/Documents/GitHub/ssteve-opencv/modules/videoio/src/videoio_registry.cpp (185) VideoBackendRegistry VIDEOIO: Enabled backends(5, sorted by priority): FFMPEG(1000); GSTREAMER(990); AVFOUNDATION(980); CV_IMAGES(970); CV_MJPEG(960)
[ INFO:0] global /Users/steve/Documents/GitHub/ssteve-opencv/modules/videoio/src/backend_plugin.cpp (248) getPluginCandidates VideoIO pluigin (GSTREAMER): glob is 'libopencv_videoio_gstreamer*.dylib', 1 location(s)
[ INFO:0] global /Users/steve/Documents/GitHub/ssteve-opencv/modules/videoio/src/backend_plugin.cpp (256) getPluginCandidates     - /usr/local/lib: 0
[ INFO:0] global /Users/steve/Documents/GitHub/ssteve-opencv/modules/videoio/src/backend_plugin.cpp (259) getPluginCandidates Found 0 plugin(s) for GSTREAMER
OpenCV: not authorized to capture video (status 0), requesting...
OpenCV: camera failed to properly initialize!
Unable to open camera

这意味着它正在请求访问权限,但我没有收到对话框,并且“系统偏好设置”>“安全和隐私”>“相机”下没有列出任何应用。

这是我正在运行的程序:

#include <iostream>

#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char *argv[]) {
    cout << "OpenCV version " << CV_VERSION << endl;
    VideoCapture cap;
    cap.open(0);
    if (!cap.isOpened()) {
        cerr << "Unable to open camera\n";
        return -1;
    }

    Mat frame;
    for (;;) {
        cap >> frame;
        if (frame.empty()) {
            cerr << "Got blank frame\n";
            return -1;
        }
        imshow("Live", frame);
        if (waitKey(5) >= 0)
        break;
    }

    return 0;
}

这是编译器调用:

xcrun clang++ -x c++ -lc++ -o "$out" -std=c++11 -I/usr/local/include/opencv4 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -lopencv_calib3d -lopencv_aruco -lopencv_xfeatures2d -lopencv_features2d -sectcreate __TEXT __info_plist Info.plist "${files[@]}" "${@:1}"

我错过了哪一个难题?

(我知道这类似于无法在Mac Mojave上使用opencv访问摄像机,但该问题从未超出格式错误的plist文件的范围。)


为了响应确保ffmpeg看到设备的建议:

$ ffmpeg -hide_banner -f avfoundation -list_devices true -i ""
[AVFoundation input device @ 0x7fed77d16dc0] AVFoundation video devices:
[AVFoundation input device @ 0x7fed77d16dc0] [0] FaceTime HD Camera (Built-in)
[AVFoundation input device @ 0x7fed77d16dc0] [1] Capture screen 0
[AVFoundation input device @ 0x7fed77d16dc0] [2] Capture screen 1
[AVFoundation input device @ 0x7fed77d16dc0] [3] Capture screen 2
[AVFoundation input device @ 0x7fed77d16dc0] AVFoundation audio devices:
[AVFoundation input device @ 0x7fed77d16dc0] [0] Built-in Microphone
史蒂夫

问题在于,无论出于何种原因,C ++程序均未请求访问相机。我在评论中采纳了@gerwin的建议,以尝试使用Python。从Terminal运行该程序会导致Terminal要求访问摄像机。一旦我同意,当从Terminal运行时,c ++程序便能够访问摄像机。

就CodeRunner而言,我不确定如何使CodeRunner在虚拟环境下运行Python程序,因此我无法运行Python OpenCV程序来要求其访问摄像机。因此,目前我无法使用CodeRunner运行访问相机的c ++程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java命令行应用程序

如何访问传递给Go程序的命令行参数?

在macOS命令行应用程序上设置框架-原因:找不到映像

在macOS Mojave中请求相机权限

MAIN中无法访问的命令行选项

在并行模式下运行命令行应用程序

macOS命令行工具和gcc在Catalina上突然失败(在Mojave上工作)

macOS命令行应用程序-用户默认词典字典表示形式显示太多值

在PM2集群模式下运行node.js应用程序时,如何通过命令行加载环境变量?

为MacOS命令行工具设置应用程序组?

如何使python命令行应用程序可全局访问?

如何从angular应用程序中访问Angular CLI'ng start'命令行变量

命令行应用程序“无法识别为内部或外部命令。”

无法从命令行访问mvn命令?

无法导出应用程序命令行错误132

严格模式下的Hacklang命令行程序

Raspberry Pi:在C / C ++程序中访问命令行

如何在启用“已启用32位应用程序”的情况下从命令行运行IIS Express?

无法通过命令行启动Java应用程序

无需命令行访问即可设置Laravel 5应用程序

是否可以在不更改WindowsApps文件夹设置的情况下从其他程序或命令行运行Windows应用程序?

是否可以在不显示其窗口的情况下启动命令行应用程序?

编写命令行应用程序

在 Mac OS X 10.6.8 和 Xcode 3.2.6 下,在 Objective-C 的命令行应用程序中打开离线 jpg-images

如何从 Mono(命令行)应用程序访问本机 API?

如何通过命令行授予 snap 应用程序访问 /tmp 的权限?

macOS 应用程序在使用 codesign 命令签名后无法再通过 Internet 访问外部资源

尝试访问相机时,Android 应用程序在阻止访问相机的企业 MDM 设备上崩溃

在 C++ Windows 应用程序中访问命令行参数