Я настраиваю проект сшивания видео в реальном времени, используя алгоритмы оптического потока opencv. Проблема, с которой я сталкиваюсь, заключается в том, что расчет оптического потока занимает много времени, я пытаюсь использовать его в нескольких потоках но это совсем не ускоряет. Есть ли что-то не так с моим кодом, или есть какие-нибудь алгоритмы оптического потока, которые могут заменить тот, который предоставляет opencv? Заранее спасибо.
Вот мой тестовый код:
Ptr<cuda::DensePyrLKOpticalFlow> brox[6];
void callOptical(GpuMat d_frame0f, GpuMat d_frame1f, GpuMat d_flow, Stream stream,int i)
{
brox[i]->calc(d_frame0f, d_frame1f, d_flow, stream);
brox[i]->calc(d_frame1f, d_frame0f, d_flow, stream);
}
int main()
{
String filename[12] = { "l0.png", "r0.png", "l1.png", "r1.png", "l2.png", "r2.png", "l3.png", "r3.png", "l4.png", "r4.png", "l5.png", "r5.png" };
Mat frame[12];
GpuMat d_frame[12];
GpuMat d_framef[12];
for (int i = 0; i < 6; i++)
{
frame[2 * i] = imread(filename[2 * i], IMREAD_GRAYSCALE);
frame[2 * i + 1] = imread(filename[2 * i + 1], IMREAD_GRAYSCALE);
d_frame[2 * i].upload(frame[2 * i]);
d_frame[2 * i + 1].upload(frame[2 * i + 1]);
brox[i] = cuda::DensePyrLKOpticalFlow::create(Size(7, 7));
}
GpuMat d_flow[6];
GpuMat pre_flow[6];
Stream stream[6];
vector<std::thread> threads;
const int64 start = getTickCount();
for (int i = 0; i < 6; i++)
{
threads.emplace_back(
callOptical,
d_frame[2 * i],
d_frame[2 * i + 1],
d_flow[i],
stream[i],
i
);
}
for (std::thread& t : threads)
t.join();
const double timeSec = (getTickCount() - start) / getTickFrequency();
cout << "Brox : " << timeSec << " sec" << endl;
system("pause");
return 0;
}