加快emguCV方法
本文关键字:方法 emguCV 加快 | 更新日期: 2023-09-27 18:26:16
我有一个关于加快几个emguCV调用的问题。目前,我有一张拍摄卡,可以在1920x1080@30Hz.使用directshow和一个采样器,我捕捉每一帧并将其显示在一个窗体上。现在我已经编写了一个图像稳定器,但我能运行的最快速度约为20Hz。
我在稳定器中做的第一件事是将1920x1080缩小到640x480,因为这会使功能轨迹更快。
然后我使用良好的功能来跟踪
previousFrameGray.GoodFeaturesToTrack(sampleSize, sampleQuality, minimumDistance, blockSize)[0]);
大约需要12-15ms。
接下来我要做的是使用进行光流计算
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-8ms左右。
因此,帧计算的总时间约为48ms或21Hz。
不知怎么的,我需要把总时间控制在33毫秒以下。现在我的问题到此为止。
第一:如果我切换到使用GPU来获得良好的功能和opticalFlow,这是否会提供必要的速度提升(如果有的话)?
第二:除了使用GPU之外,还有其他方法可以加快这些计算吗?
我终于将函数转换为GPU对应的函数,并获得了我想要的速度提升。我从48毫秒降到了22毫秒。