C ++ OpenCV4捕获cv :: OutOfMemoryError

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

我试图弄清楚如何捕获OpenCV内存分配错误,因此我可以根据需要默认执行就地操作。但是我不知道如何处理OpenCV错误。

我收到的错误消息是:

OpenCV(4.2.0) C:\...\Documents\OpenCV\opencv-4.2.0\modules\core\src\alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 30000000000 bytes in function 'cv::OutOfMemoryError'

似乎OpenCV不会抛出std::exception的子类,因为以下代码无法正确处理错误。

#include <vector>
#include <iostream>
#include <opencv2/core>

int main()
{
    std::vector<cv::Mat> mats;
    while (true) {
        try {
            cv::Mat mat = cv::Mat::zeros(100000, 100000, CV_8UC3);
            mats.push_back(mat);
        }
        catch (const std::exception& exc) {
            std::cout << exc.what() << std::endl;
            return 1;
        }
    }

[我知道我可以手动保留内存以馈入cv::Mat构造器,但是宁愿利用OpenCV的现有机器。下面的方法确实有效,但是缺少cv::fastMalloc中带有适当内存对齐的额外功能。

try {
    std::vector<T> vec(size);
    cv::Mat_<T> mat(vec);
}
catch (const std::bad_alloc& exc) {
    // handle appropriately
}

同样,如果我要手动使用cv::fastMalloc,则不确定如何确定它是否成功。这是其定义的摘录:

static void* OutOfMemoryError(size_t size)
{
    CV_Error_(CV_StsNoMem, ("Failed to allocate %llu bytes", (unsigned long long)size));
}

void* fastMalloc(size_t size)
{
    uchar* udata = (uchar*)malloc(size + sizeof(void*) + CV_MALLOC_ALIGN);
    if(!udata)
        return OutOfMemoryError(size);
    uchar** adata = alignPtr((uchar**)udata + 1, CV_MALLOC_ALIGN);
    adata[-1] = udata;
    return adata;
}

如何检查是否由于返回void*(可能为uchar*OutOfMemoryError而成功)>

我试图弄清楚如何捕获OpenCV内存分配错误,因此我可以根据需要默认执行就地操作。但是我不知道如何处理OpenCV错误。错误消息I ...

c++ opencv exception
1个回答
0
投票

[假设您在这里的* nix机器上,malloc and co将在无法分配更多内存时返回NULL。例如,以下内容将捕获该内容:

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