【问题标题】:I don't have the proper gstreamer dll loaded for C++ opencv camera capture我没有为 C++ opencv 相机捕获加载正确的 gstreamer dll
【发布时间】:2021-12-24 06:07:18
【问题描述】:

我已经使用 Python 和 opencv 成功捕获了网络摄像头,但现在我回到 C++ 并尝试执行相同的简单功能。

这是我的(精简后的)代码:

#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\imgcodecs.hpp>
using namespace cv;
using std::cout;
using std::endl;
using std::string;
int main()
{
    Mat img;
    VideoCapture cam(0);
    if (cam.isOpened()) {
        cout << "Camera is opened." << endl;
    } else {
        cout << "Camera is NOT opened." << endl;
    }
    const string camWin{ "Rufus' Webcam" };
    namedWindow(camWin);
    while (1) {
        cam >> img;
        imshow(camWin, img);
        if (waitKey(1) == 27)
            break;
    }
    cam.release();
}

这是我运行时遇到的错误:

尝试使用 opencv 打开相机。 [信息:0] 全局 C:\build\master_winpack-build-win64-vc15\opencv\modules\videoio\src\videoio_registry.cpp (191) cv::`anonymous-namespace'::VideoBackendRegistry::VideoBackendRegistry VIDEOIO: 已启用后端(7,按优先级排序):FFMPEG(1000); GSTREAMER(990); INTEL_MFX(980);多发性硬化症(970);显示(960); CV_IMAGES(950); CV_MJPEG(940) [ INFO:0] 全局 C:\build\master_winpack-build-win64-vc15\opencv\modules\videoio\src\backend_plugin.cpp (370) cv::impl::getPluginCandidates 为 GSTREAMER 找到 2 个插件 [信息:0] 全局 C:\build\master_winpack-build-win64-vc15\opencv\modules\videoio\src\backend_plugin.cpp (175) cv::impl::DynamicLib::libraryLoad 加载 C:\Users\rufuss \source\repos\OpenCVinCPP\x64\Debug\opencv_videoio_gstreamer450_64d.dll => 失败 [信息:0] 全局 C:\build\master_winpack-build-win64-vc15\opencv\modules\videoio\src\backend_plugin.cpp (175) cv::impl::DynamicLib::libraryLoad load opencv_videoio_gstreamer450_64d.dll => FAILED [ INFO:0] 全局 C:\build\master_winpack-build-win64-vc15\opencv\modules\videoio\src\backend_plugin.cpp (370) cv::impl::getPluginCandidates 找到 2 个 MSMF 插件 [信息:0] 全局 C:\build\master_winpack-build-win64-vc15\opencv\modules\videoio\src\backend_plugin.cpp (175) cv::impl::DynamicLib::libraryLoad 加载 C:\Users\rufuss \source\repos\OpenCVinCPP\x64\Debug\opencv_videoio_msmf450_64d.dll => OK [信息:0] 全局 C:\build\master_winpack-build-win64-vc15\opencv\modules\videoio\src\backend_plugin.cpp (236) cv::impl::PluginBackend::PluginBackend Video I/O: 加载插件'微软媒体基金会 OpenCV 视频 I/O 插件' 相机已打开。

(基本上没有找到:opencv_videoio_gstreamer450_64d.dll,因为不存在,所以不是路径问题)

我也可以使用一些帮助:

  1. 正确安装缺少的 dll:opencv_videoio_gstreamer450_64d.dll。 或
  2. 从 opencv 搜索列表中禁用 gstreamer。

两者都可以帮助我,但我实际上想了解这两种技术,以供将来参考。

【问题讨论】:

    标签: c++ opencv gstreamer


    【解决方案1】:

    您可以尝试添加cam.open(0, CAP_DSHOW);

    #include <iostream>
    #include <opencv2\opencv.hpp>
    #include <opencv2\imgcodecs.hpp>
    using namespace cv;
    using std::cout;
    using std::endl;
    using std::string;
    int main()
    {
        Mat img;
        VideoCapture cam;
        cam.open(0, CAP_DSHOW);
        if (cam.isOpened()) {
            cout << "Camera is opened." << endl;
        }
        else {
            cout << "Camera is NOT opened." << endl;
        }
        const string camWin{ "Rufus' Webcam" };
        namedWindow(camWin);
        while (1) {
            cam >> img;
            imshow(camWin, img);
            if (waitKey(1) == 27)
                break;
        }
        cam.release();
    }
    

    如果您想了解更多信息,请参阅this。

    您还可以在构建时执行 cmake -DWITH_GSTREAMER=OFF 以禁用 gstreamer。 (见this)

    【讨论】:

    • 我开始着手重建工作。我最初试图使用预构建的二进制文件...
    • 经过一番混淆,删除所有 opencv 实例,仔细检查我的包含和依赖项,从预构建的 windows opencv 二进制文件中复制我的 dll,我能够获得 DSHOW 版本。我认为 gstreamer 更可取,但我还没有弄清楚如何为 opencv 安装/构建 gstreamer,即使我的其他(python)应用程序似乎在环境模块中有一个版本......但至少我能够现在捕获网络摄像头。我会继续痛苦的学习……
    • 很高兴听到这个消息! :) 我不确定它是否有助于解决您的问题,但要使用 gstreamer 构建 opencv,您可能还会看到 galaktyk.medium.com/…
    • 感谢您的链接 - 这看起来是一个不错的过程,但“两小时后……”的形象并不令人鼓舞。当我有冒险精神时,我会尝试。那我就在这里反馈。
    • 大声笑!不用那么长时间..
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多