我目前正在使用此代码分析网络摄像头帧:
{"year": "2016", "country": "France"}
但是,它导致内存错误不足:
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个图像的矢量并使用计数器来实现它。这是我后来使用的代码:
OpenCV Error: Insufficient Memory (failed to allocate xyz bytes) in unknown function, file
..\..\opecv\modules\core\src\alloc.cpp line 52.
那么有没有办法让我指定opencv来平均每15张图像而不必使用9000图像矢量?
答案 0 :(得分:7)
编译为64位。 8 GB并不过分,但32位程序最多只能限制为4GB。 (我假设你有足够的RAM - 总共至少12 GB)。 OpenCV支持64位。
答案 1 :(得分:2)
您可能需要找到一种方法来处理您的帧,而无需同时打开它们。
我真的不知道OpenCV语法,但似乎打开了9000个480 * 640像素的图像,假设每像素3个字节,则需要9000 * 480 * 640 * 3字节的内存,即8 GB 。使用具有“经典数量”RAM的标准计算机并不容易。
如果治疗是连续的并且不需要同时打开所有框架,最好的办法是使治疗顺序逐帧进行。