【问题标题】:BackgroundSubtractorMOG2 bgm->apply throws exception in Visual Studio 2017BackgroundSubtractorMOG2 bgm->apply 在 Visual Studio 2017 中引发异常
【发布时间】:2018-02-21 15:39:54
【问题描述】:

我是 C++ 和 opencv 的新手,在运行背景减法器模型时遇到了困难。我正在使用 Visual Studio 2017 (VC++) 和 opencv 3.2。

我需要使用BackgroundSubtractorMOG2,它可以很好地创建模型,但是当我传递一个从编码图像转换而来的新帧时会抛出异常(因为我使用的 USB3 摄像头不允许直接读取由 opencv 帧)到 cv::Mat。下面是代码sn-p

if (EncodeRawImage(pRawImage, &frameDesc, imageFormat, &pEncodedImage, &encodedImageSize) == SUCCESS) {
    // Convert current raw image to openCV Mat format for analysis
    auto store = gcnew cli::array<Byte>(encodedImageSize);
    System::Runtime::InteropServices::Marshal::Copy(IntPtr(pEncodedImage), store, 0, encodedImageSize);
    auto stream = gcnew System::IO::MemoryStream(store);

    System::Drawing::Bitmap^ bitmapFrame = safe_cast<System::Drawing::Bitmap ^> (Image::FromStream(stream));
    Mat imgBuf = Mat(bitmapFrame->Width, bitmapFrame->Height, CV_8U, pEncodedImage);
    Mat imgMat = imdecode(imgBuf, CV_LOAD_IMAGE_COLOR);             

    bgm->apply(imgMat , fgMaskMOG);
    returnCode = 1;
 }

例外是

owner 0x0000023afa2a2ec0 信息不可用,没有为 opencv_world320d.dll 加载符号> cv::detail::PtrOwner *

stored 0x0000023afa29baa0 信息不可用,没有为 opencv_world320d.dll 加载符号> cv::BackgroundSubtractorMOG2 *

即使 opencv320d.lib 已正确链接,并且在同一程序中为我运行了一些其他基本的 opencv 示例(例如,cv::subtract、cv::calcHist 等)。我想知道是不是因为图像尺寸太大(4608x3288)和我正在创建的 bitmpaFrame 可能有问题?

或者如果我试图以不允许的方式访问流/内存中的图像数据?

【问题讨论】:

  • 我还包括了#include "opencv2/video/background_segm.hpp" 并做了 cv::Mat fgMaskMOG; Ptr bgm;bgm = createBackgroundSubtractorMOG2();
  • 您可能正在使用 vc14 链接到 OpenCV 构建。 opencv_world320d.lib 的文件夹是什么?
  • 嗨 Miki 是的,实际上它链接了 vc14 和文件夹是 C:\OPENCV320\opencv\build\x64\vc14\lib。但是build文件夹中除了vc14没有其他build吗?我对需要进一步研究的构建版本了解不多:(
  • OpenCV 3.3 应该具有 vs2017 的预构建二进制文件。你最好安装那个
  • 好的,谢谢,这意味着这不是我复制的部分中的代码问题:)。我也下载了3.3版本,我会链接它,看看是否能解决这个问题。谢谢

标签: visual-studio opencv visual-c++ access-violation


【解决方案1】:

即使在我执行断点时信息未找到字符串仍然存在,我只是发现模型由于图像尺寸过大而引发异常,正如我在原始问题 (4608x3288) 中提到的那样。我调整了图像的大小(resize(newImageMat, newImageMat, cv::Size(1000, 1000 * newImageMat.rows / newImageMat.cols), INTER_LINEAR);),错误消失了,模型学习并显示了结果。该文本可能是 Visual Studio 错误,因为我在 https://stackoverflow.com/a/7736034/3377101 处阅读了类似的问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多