我有一个灰度图像矢量(使用OpenCV 3加载)。每个图像为2560x64800像素,矢量最多可容纳23个图像。因此,矢量的最大尺寸约为3.6GB。我需要进行"斑点检测"在每个图像上并加快速度,我想使用图像的并行处理来运行图像分析。对于所有检测到的斑点,应返回小的40x40像素图像。整个数据集最多包含13组图像 - 我选择使外部循环成为正常的顺序for循环:
for (size_t cn = 0; cn < numberOfChannels.size(); ++cn)
{
vector<Mat> imageVector = readImages(...);
// Loop through images in "imageVector"
concurrency::parallel_for(size_t(0), size_t(imageVector.size()), [&](size_t ii)
{
// Detect blobs
vector<KeyPoint> keypoints = detectBlobs(imageVector[ii], false);
// Return result
theSnips[cn][ii] = collectImageSnips(imageVector[ii], keypoints, 40);
});
};
两个函数的函数声明&#34; detectBlobs&#34; (基于OpenCV 3&#34; SimpleBlobDetection&#34;)和&#34; collectImageSnips&#34;是:
vector<KeyPoint> detectBlobs(Mat image, bool useTestImage)
vector<Mat> collectImageSnips(Mat image, vector<KeyPoint> keyPoints, int rectSize)
当我运行提供的&#34; parallel_for&#34;循环我希望(希望)3.6 GB RAM将用于存储已加载的&#34; imageVector&#34;并为每个线程额外约。结果将是160 GB(用于斑点检测的小开销以及存储检测到的斑点的小图像)。而是内存使用量爆炸,因为每个线程占用额外的3.6 GB(+额外开销),Windows停止响应。
因为我是C ++的新手 - 编码器我可能错过了一些明显的东西,但是我看到了预期的行为吗?更重要的是,有没有办法避免每个线程的整个imageVector倍增?
NB!由于我想要分析的图像是从大量较小的图像重建的,因此无法一次只读取一个图像而没有大的磁盘I / O开销。
NB!尽管减少允许的线程数量将解决Windows崩溃的问题,但由于CPU资源无法正常使用,因此无法接受解决方案。