我目前使用此代码来分析网络摄像头帧:减少内存消耗
int main()
{
VideoCapture cap(0); // open the default camera
if (!cap.isOpened()) // check if we succeeded
return -1;
cap.set(CV_CAP_PROP_FPS, 15);
std::vector<cv::Mat> images(9000);
for (framenumb = 0; framenumb < 9000; ++framenumb)
{
images[framenumb].create(480, 640, CV_8UC3);
}
for (framenumb = 0; framenumb < 9000; ++framenumb)
{
Mat frame;
cap >> frame;
if (frame.empty()) break; // end of video stream
if (waitKey(1) == 27) break; // stop capturing by pressing ESC
frame.copyTo(images[framenumb]);
imshow("webcam", images[framenumb]);
}
//We can then process the captured frames
但是,它会导致内存不足错误:
OpenCV Error: Insufficient Memory (failed to allocate xyz bytes) in unknown function, file
..\..\opecv\modules\core\src\alloc.cpp line 52.
有我避免这种情况的方式?非常感谢先进!
编辑:感谢所有建设性的反馈大家!我想我现在所能做的就是改变我对这个问题的态度。我试图完成的是平均每15帧。例如:9000帧,我将有600张平均图片。因此,我创建了9000个图像的载体,使用计数器来实现that.This是我后来使用的代码:
for (int i = 0; i < 600; i++)
{
Mat avgImg(480, 640, CV_32FC3, Scalar());
for (framenumb = 15 * i; framenumb < (15 * i) + 15; ++framenumb)
{
cv::accumulate(images[framenumb], avgImg);
}
//stacking every 15 images into a single image
avgImg = avgImg/15;
avgImg.convertTo(avgImg, CV_8UC3);
char filename[80];
sprintf(filename, "C:/AvgPics/test_%d.jpeg", framenumb);
imwrite(filename, avgImg);
那么,有没有办法为我指定的OpenCV采取每15幅图像的平均,而无需使用9000图像矢量?
9000图像可能需要大量内存。我建议少放一些图像,或者减少每个图像的大小,并保存在'cv :: Mat'类型中。 – nobar
我肯定在@nobar上,也为什么你有完全相同的两个循环? 此外,为了您的代码的良好,可以在for循环的外部声明** Mat frame **。 – Prometheus
640 * 480 *每帧3字节* 9000帧大约8千兆字节。 – molbdnilo