Я пишу приложение, которое захватывает кадр с помощью v4l2 и сохраняет его на диске. Приложение должно хранить 10000 изображений.
Env: Poky (Yocto Project Reference Distro) 2.4.3 Оперативная память: 4 ГБ Дисковая память: 32 ГБ (Linux ядро потребляет 900 МБ свободного места: 26,5 ГБ)
int count = 0;
unsigned char * buff = NULL;
cv::Mat matt(800, 1280, CV_8UC4);
cv::Mat mat;
while(count < 10000) {
buff = captureFrame(); // Using V4L2 to capture frame
memcpy(matt.data, buff, 1280*800*4);
cv::cvtColor(matt, mat, cv::COLOR_BGRA2BGR);
sprintf(file_name, "./camera_images_data/frame%d.bmp", count);
cv::imwrite(file_name, mat);
count++;
}
Если я закомментирую cv :: imwrite (file_name, mat) ; Buff / cache будет только 50 МБ во время выполнения, иначе buff / cache увеличивается, когда он достигает 650 МБ, система зависает
Вывод команды 'free -h' во время работы приложения
Любые предложения или решения будут полезны, заранее спасибо.
РЕДАКТИРОВАТЬ: Я попытался записать двоичный файл вместо bmp, чтобы я мог позже преобразовать его в bmp, но при записи в двоичный файл также увеличивался буфер / кеш и система зависала.
int count = 0;
unsigned char * buff = NULL;
cv::Mat matt(800, 1280, CV_8UC4);
cv::Mat mat;
while(count < 10000) {
buff = captureFrame(); // Using V4L2 to capture frame
memcpy(matt.data, buff, 1280*800*4);
cv::cvtColor(matt, mat, cv::COLOR_BGRA2BGR);
sprintf(file_name, "./camera_images_data/frame%d.bmp", count);
std::ofstream fout(file_name, std::ios::binary);
int type = mat[i].type();
fout.write((const char*)(&mat[i].rows), sizeof(int));
fout.write((const char*)(&mat[i].cols), sizeof(int));
fout.write((const char*)(&type), sizeof(int));
fout.write((const char*)(mat[i].data), mat[i].elemSize() * mat[i].total());
fout.flush();
fout.close();
count++;
}