C++ 减少内存消耗
我目前正在使用此代码分析网络摄像头帧:C++ 减少内存消耗,c++,opencv,C++,Opencv,我目前正在使用此代码分析网络摄像头帧: 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 (framen
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
我有没有办法避免这种情况?非常感谢先进的
编辑:谢谢大家的建设性反馈!我想我现在能做的就是改变我对这个问题的看法。我试图做到的是平均每15帧拍摄一次。例如:9000帧,我将有600张平均图片。因此,我创建了一个9000个图像的矢量,并使用计数器来实现。这是我稍后使用的代码:
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);
for(int i=0;i<600;i++)
{
Mat avgImg(480640,CV_32FC3,Scalar());
对于(framenumb=15*i;framenumb<(15*i)+15;++framenumb)
{
cv::累计(图像[framenumb],平均);
}
//将每15幅图像叠加为一幅图像
avgImg=avgImg/15;
平均转换器(平均,CV_8UC3);
字符文件名[80];
sprintf(文件名,“C:/AvgPics/test_u%d.jpeg”,framenumb);
imwrite(文件名,avgImg);
那么,有没有一种方法可以让我指定opencv在不使用9000图像向量的情况下平均每15幅图像一次?您可能需要找到一种方法来处理帧,而不同时打开所有帧 我真的不知道OpenCV语法,但似乎打开了9000个480*640像素的图像,假设每个像素3个字节,需要9000*480*640*3个字节的内存,即8GB。这对于具有“经典数量”RAM的标准计算机来说并不容易处理
如果处理是按顺序进行的,并且不需要同时打开所有帧,那么最好的做法是调整处理以按顺序逐帧进行处理。编译为64位。8 GB并不过量,但32位程序最多只能打开4GB。(我假设您有足够的RAM-总共至少12 GB).OpenCV支持64位。9000个图像可能需要大量内存。我建议保存更少的图像,或者减少存储在
cv::Mat
类型中的每个图像的大小。我肯定支持@nobar,而且为什么您有完全相同的两个for循环?另外,为了代码的好处,可以在f for循环。640*480*3字节/帧*9000帧大约为8gb。标题有误导性-它不是vector
使用内存,而是内存中的对象。我将编辑标题。带有64位程序的虚拟内存应该可以处理8gb的内存。这台机器有32GB的物理内存。这不是过度延迟调用创建
直到调用frame.copyTo(images[framenumb])之前,在不需要的情况下,可能会使用相同的内存。
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);