MacOS QT中的错误消息“ OpenCV:未获得捕获视频的权限(状态0)”

问题描述 投票:1回答:1

[我知道已经有一些类似的问题,似乎该问题不是由OpenCV引起的,而是由MacOS授权规则引起的。

我已经阅读了一些解决方案,例如在源目录中创建一个Info.plist。那行得通!但对我而言,现在仅在QTCreator的Debug模式下,而不在Release模式下。也就是说,当我在“调试”模式下运行程序时,一切都OK。但是在QTCreator的Release模式下,错误消息显示出来:

OpenCV: not authorized to capture video (status 0), requesting...
16:12:22: The program has unexpectedly finished.

一些更奇怪的信息。由QTCreator在“发行”或“调试”模式下生成的程序,例如Test.app,可以在确定授权后直接双击它或驻留在Test.app/Contents中的可执行文件来执行。

附加系统信息:

  1. macOS Catalina版本10.15.4

  2. Qt 5.14.2

  3. OpenCV 4.3.0

也是Info.plist

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
 <plist version="0.9">
     <dict>
        <key>NSCameraUsageDescription</key>
        <string>uses camera to see vision targets</string>
    </dict>
 </plist>

某些代码可能会有所帮助。仅供参考,程序在创建Camera类之前崩溃。

// camera.cpp
std::shared_ptr<Camera> Camera::Ptr = nullptr;

void Camera::CreateCamera()
{
  if(!Ptr)
    Ptr.reset(new Camera);
}

Camera::Camera()
  : _device(1)
{
}
bool Camera::GrabMerged(cv::Mat &img)
{
  if(_device.isOpened())
  {
    cv::Mat tmp;
    _device.read(tmp);
    if(tmp.empty())
    {
      qWarning("[Camera] Grab image failed.");
      return false;
    }
    qInfo("[Camera] merged image info: cols=%d, rows=%d, channels=%d, step0=%lu,step1=%lu, type=%d",
          tmp.cols, tmp.rows, tmp.channels(), tmp.step[0], tmp.step[1], tmp.type());
    cv::cvtColor(tmp, img, cv::COLOR_RGB2BGR);
    return true;
  }
  qCritical("[Camera] Camera is not opened.");
  return false;
}
...
// camera.h
class Camera: public QObject
{
...
private:
  cv::VideoCapture _device;
...
}
macos qt opencv qt5
1个回答
0
投票

感谢您抽出时间来推动minimal project以便重现错误。

经过一些测试后,从命令行启动或双击应用程序捆绑包图标(在发布和调试模式下),似乎该项目都能正常工作。在后一种情况下,当按下open按钮时,系统会请求允许使用摄像机。授予权限后,我们需要再次单击该按钮,这是macOS上OpenCV VideoCapture的预期行为。

但是当我从Qt Creator启动它时,我收到了这个奇怪的消息:

dyld:找不到符号:__cg_jpeg_resync_to_restart 引用自:/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO 预期位于:/usr/local/lib/libJPEG.dylib 在/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO中 18:29:38:程序意外完成。

所以Qt Creator是罪魁祸首。

并且在运行环境(项目设置->运行->环境)下禁用DYLD_LIBRARY_PATH变量后,它在QtCreator中正常运行。 Hourah!

© www.soinside.com 2019 - 2024. All rights reserved.