设计OpenCV操作。确定何时使用CPU与GPU

时间:2018-12-31 16:42:28

标签: c# performance opencv gpu cpu

我正在研究一个OpenCV项目,以监视1080p 60fps视频提要,并且还将自定义图形应用于此提要。我正在寻找有关设计系统中组成多个矩阵操作的一些高级操作的一般指导。例如,在我的一项功能中,我正在调整视频帧的大小,并将覆盖图应用于该已调整大小的帧。下图描述了该过程:

image description

这是流程的实现(当前是在C#opencvsharp中完成的,但是,此时我可以切换到任何语言)

private void updateFrame(Mat currentFrame, Mat background, Mat mask, Mat invertedMask)
{
    int w = 400, h = 224;

    using (var resizedFrame = new Mat(
        new OpenCvSharp.Size(currentFrame.Size().Width - w, currentFrame.Size().Height - h), 
        currentFrame.Type()))
    using (var resizedBorderFrame = new Mat(currentFrame.Size(), currentFrame.Type()))
    using (var maskedFrame = new Mat(currentFrame.Size(), currentFrame.Type()))
    using (var maskedBackground = new Mat(currentFrame.Size(), currentFrame.Type()))
    using (var output = new Mat(currentFrame.Size(), currentFrame.Type()))
    {
        Cv2.Resize(currentFrame, resizedFrame, resizedFrame.Size());
        Cv2.CopyMakeBorder(resizedFrame, resizedBorderFrame, h/4, h*3/4, w/2, w/2, BorderTypes.Constant, new Scalar(0));
        Cv2.BitwiseAnd(resizedBorderFrame, mask, maskedFrame);
        Cv2.BitwiseAnd(background, invertedMask, maskedBackground);
        Cv2.BitwiseOr(maskedBackground, maskedFrame, output);
        pictureBox.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(output);
    }
}

此过程(以及其他一些操作)开始花费的时间比视频的帧速率长,从而造成明显的延迟。当前,该过程是使用基于CPU的操作执行的,但是我读到,应用GPU操作可以大大加快运行时间。此外,我读到,创建一个自定义内核以合并操作(或将整个系列创建为复合内核操作)可以进一步提高速度。我还试图分析哪些操作不受CPU的限制,这可能会使GPU等效的操作成为一个过大的杀伤力。

如果您要从一开始就评估此问题,您将如何确定要对CPU,GPU和自定义内核执行哪些操作?或者,我可以使用哪些资源和工具来分析性能差异?而且,在考虑这些类型的问题时,我还应该采用哪些其他优化或流程?

0 个答案:

没有答案