我试图弄清楚如何捕获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 ...
[假设您在这里的* nix机器上,malloc
and co将在无法分配更多内存时返回NULL
。例如,以下内容将捕获该内容: