C ++ Opencv: производительность в многопоточной среде - PullRequest
0 голосов
/ 20 мая 2018

В моей программе на C ++ я создаю 3 pthread.Первые 2 потока создают сокет и получают данные (целые числа) из разных портов.Функция main () одновременно записывает полученные значения (двумя потоками) в текстовый файл.У меня есть третий поток, который начинает захватывать изображения с камеры, используя библиотеки opencv, и я хочу сохранить каждый кадр в виде файла png.Я знаю, что моя камера может развивать скорость до 60 кадров в секунду, что приводит к частоте дискретизации 16 миллисекунд.Я использую функцию gettimeofday() до и после захвата изображения, чтобы получить время получения изображения.

//Thread number 3
Mat IMG; 
unsigned long ms;
VideoCapture cap(0);
struct timeval tp1,tp2;
while(1)
{
   gettimeofday(&tp1,NULL);
   cap>>IMG;
   gettimeofday(&tp2,NULL);
   ms=10000000*(tp1.tv_sec-tp2.tv_sec)+(tp1.tv_usec-tp2.tv_usec);
   cout<<ms/1000<<endl;
}

Моя основная программа начинает запись в текстовый файл, как только данные становятся доступны другим двум потокам, которыепроисходит примерно через 10 секунд после первого снимка.В течение этих 10 секунд, отслеживая время, для захвата каждого кадра требуется не более 16 мс.Однако, как только инициализация записи в текстовый файл инициализируется, даже если я не сохраняю изображения, время, которое я получаю, не всегда составляет 16 мс, а иногда достигает 35 миллисекунд (хотя в большинстве случаев эта длительность все еще составляет 16 мс или меньше).Теперь кроме того, если я начну сохранять изображения, это время увеличивается.Я попытался поместить функцию imwrite() для сохранения изображения в другой поток, но это не помогло.Как я могу избежать этого?доступ к памяти настолько привилегирован, что даже запись в текстовый файл может замедлить работу других потоков, которые отвечают только за захват изображений?Есть ли способ сохранить это время и сохранить изображения во время работы других потоков и основной функции, выполняющей свою работу?

...