             nextPts[blockIdx.x] = nextPt;
 
             if (calcErr)
-                err[blockIdx.x] = static_cast<float>(errval) / (cn * c_winSize_x * c_winSize_y);
+                err[blockIdx.x] = static_cast<float>(errval) / (::min(cn, 3) * c_winSize_x * c_winSize_y) * DenormalizationFactor<T>::factor;
         }
     }
 

    template class pyrLK_caller<float, 4>;
}

#endif /* CUDA_DISABLER */
        return ret;
    }

    template <typename T>
    struct DenormalizationFactor
    {
        static const float factor = 1.0;
    };

    template <>
    struct DenormalizationFactor<uchar>
    {
        static const float factor = 255.0;
    };

    template <int cn, int PATCH_X, int PATCH_Y, bool calcErr, typename T>
    __global__ void sparseKernel(const float2* prevPts, float2* nextPts, uchar* status, float* err, const int level, const int rows, const int cols)
    {
