【发布时间】:2014-12-07 10:44:10
【问题描述】:
我有一个关于加快 emguCV 调用速度的问题。目前我有一张采集卡,可以接收 1920x1080@30Hz 的相机。使用带有样本采集器的 directshow 我捕获每一帧并将其显示在表单上。现在我已经写了一个图像稳定器,但我能运行它的最快速度大约是 20Hz。
我在稳定器中做的第一件事是将 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-18 毫秒。
我最后调用的耗时方法是warpAffine函数
Image<Bgr, byte> warped_frame = frame.WarpAffine(T, interpMethod, Emgu.CV.CvEnum.WARP.CV_WARP_DEFAULT, new Bgr(BackgroundColor));
这大约需要 10-12 毫秒。
其余的计算、图像缩放等总共需要大约 7-8 毫秒。
所以一帧计算的总时间大约是 48ms 或大约 21Hz。
不知何故,我需要将总时间控制在 33 毫秒以下。 那么现在来回答我的问题。
首先:如果我切换到使用 GPU 来实现 goodFeatures 和opticalFlow 是否会提供必要的速度提升(如果有的话)?
第二:除了使用 GPU 之外,还有其他方法可以加速这些计算吗?
【问题讨论】:
-
您的 CPU 使用了多少?也许您可以并行执行两个第一个调用(如果它们在内部不是并行的)iow:更好的 CPU/更多内核将加速它;-)
-
我有一个 i7-3960X @ 4Ghz,它正在使用 52%。它看起来也正在使用我所有的核心。