cvCreateVideoWriter - не может изменить имя файла при последующих вызовах - PullRequest
0 голосов
/ 16 августа 2011

OpenCV 2.2 Windows 7

У меня есть метод C ++ (ниже), который создает файл avi из массива фреймов (IplImage *).Имя файла основывается на том, какой из двух потоков (назовем их «левый» и «правый») выполняет запись.

Код:

void AvtCameraCapture::save_as_video(IplImage **frames,const char * fname, int num_frames, int playback_fps,CvSize &size)
{
    //EnterCriticalSection(&cs); 

    CvVideoWriter *writer = cvCreateVideoWriter(fname,CV_FOURCC('D', 'I', 'B', ' '),playback_fps,size);
    printf("Writer is %x\n", writer);
    for (int i=0; i < num_frames; i++) 
    {
        printf("Wrote frame %d to file %s\n",i,fname);
        cvWriteFrame(writer,frames[i]);
    }
    cvReleaseVideoWriter(&writer);

    //LeaveCriticalSection(&cs);
}

Файл создан дляпервый поток, который выполняет метод.Но файл для второго потока не создается.

Я вижу отпечатки для обоих потоков с правильными именами файлов для каждого.Обратите внимание, что CvVideoWriter * не равен нулю.

writing to file c:\flyball_passes\Left_dog_2.avi
Writer is 4dabf60
Wrote frame 0 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 1 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 2 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 3 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 4 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 5 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 6 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 7 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 8 to file c:\flyball_passes\Left_dog_2.avi
writing to file c:\flyball_passes\Right_dog_2.avi
Writer is 4d2a930
Wrote frame 0 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 1 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 2 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 3 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 4 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 5 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 6 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 7 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 8 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 9 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 10 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 11 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 12 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 13 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 14 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 15 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 16 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 17 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 18 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 19 to file c:\flyball_passes\Right_dog_2.avi
video written to file c:\flyball_passes\Right_dog_2.avi
Masking for 2.696000 seconds in lane Right.
Wrote frame 9 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 10 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 11 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 12 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 13 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 14 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 15 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 16 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 17 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 18 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 19 to file c:\flyball_passes\Left_dog_2.avi
video written to file c:\flyball_passes\Left_dog_2.avi

Если я раскомментирую критические разделы ввода / выхода, один поток завершает запись до запуска другого, но все равно не создается файл для потока, который достигнет последнего:

writing to file c:\flyball_passes\Left_dog_2.avi
Writer is 4f5d298
Wrote frame 0 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 1 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 2 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 3 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 4 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 5 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 6 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 7 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 8 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 9 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 10 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 11 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 12 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 13 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 14 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 15 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 16 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 17 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 18 to file c:\flyball_passes\Left_dog_2.avi
Wrote frame 19 to file c:\flyball_passes\Left_dog_2.avi
video written to file c:\flyball_passes\Left_dog_2.avi
Masking for 2.570000 seconds in lane Left.
writing to file c:\flyball_passes\Right_dog_2.avi
Writer is 4f5d298
Wrote frame 0 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 1 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 2 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 3 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 4 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 5 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 6 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 7 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 8 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 9 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 10 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 11 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 12 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 13 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 14 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 15 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 16 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 17 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 18 to file c:\flyball_passes\Right_dog_2.avi
Wrote frame 19 to file c:\flyball_passes\Right_dog_2.avi
video written to file c:\flyball_passes\Right_dog_2.avi

Даже если я подожду несколько секунд, чтобы запустить событие, которое инициирует запись второго файла, оно никогда не появится.

Если я запускаю только события, которые инициируют запись файла для правой полосы (без предварительного вызова cvCreateVideoWriter на левой полосе), я вижу файл avi для правой полосы.

Любое понимание будет с благодарностью!

Спасибо,

Дейв Томас

1 Ответ

1 голос
/ 17 августа 2011

Вы вызываете функции OpenCV из отдельных потоков. Нет никаких гарантий, что ваша система будет работать должным образом, поскольку OpenCV не поточно-ориентированный.

Используйте мьютексы или какой-либо другой механизм для защиты вызовов OpenCV, выполняемых в потоках.

Вы должны защитить весь этот блок кода от одновременного выполнения:

// lock global mutex

CvVideoWriter *writer = cvCreateVideoWriter(fname,CV_FOURCC('D', 'I', 'B', ' '),playback_fps,size);
printf("Writer is %x\n", writer);
for (int i=0; i < num_frames; i++) 
{
    printf("Wrote frame %d to file %s\n",i,fname);
    cvWriteFrame(writer,frames[i]);
}
cvReleaseVideoWriter(&writer);

// unlock mutex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...