[我知道已经有一些类似的问题,似乎该问题不是由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中的可执行文件来执行。
附加系统信息:
macOS Catalina版本10.15.4
Qt 5.14.2
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;
...
}
感谢您抽出时间来推动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!