У меня вопрос об ускорении нескольких вызовов emguCV. В настоящее время у меня есть карта захвата, которая снимает камеру с разрешением 1920x1080 при 30 Гц. Используя directshow с образцом grabber, я фиксирую каждый кадр и отображаю его на форме. Теперь я написал стабилизатор изображения, но самый быстрый, который я могу запустить, составляет около 20 Гц.Ускорение методов emguCV
Первое, что я делаю в своем стабилизаторе, - это масштаб 1920x1080 с точностью до 640x480, что значительно ускоряет работу функции.
Затем я использую goodFeaturesToTrack
previousFrameGray.GoodFeaturesToTrack(sampleSize, sampleQuality, minimumDistance, blockSize)[0]);
, который занимает около 12-15 мс.
Следующая вещь, которую я делаю это вычисление оптического потока с использованием этого
OpticalFlow.PyrLK(previousFrameGray, frame_gray, prev_corner.ToArray(), new Size(15, 15), 5, new MCvTermCriteria(5), out temp, out status, out err);
и занимает около 15-18ms.
В последний раз метод, который я называю потребляя функция warpAffine
Image<Bgr, byte> warped_frame = frame.WarpAffine(T, interpMethod, Emgu.CV.CvEnum.WARP.CV_WARP_DEFAULT, new Bgr(BackgroundColor));
это занимает около 10-12ms.
Остальные вычисления, масштабирование изображения и то, что не занимает в общей сложности около 7-8 мс.
Таким образом, общее время для расчета кадра составляет около 48 мс или около 21 Гц.
Как-то мне нужно получить общее время до 33 мс. Итак, теперь для моих вопросов.
Во-первых: Если я переключусь на использование GPU для goodFeatures и opticalFlow, это обеспечит необходимое увеличение скорости, если таковое имеется?
Second: Есть ли другие методы, кроме использования графического процессора, который может ускорить эти вычисления?
Сколько вашего процессора используется? Возможно, вы можете сделать два первых вызова параллельно (если они не параллельны внутри) iow: лучше процессор/больше ядер ускорит его ;-) –
У меня i7-3960X @ 4Ghz, и он использует 52%. Похоже, он использует все мои ядра. – Axis