cv :: Normalise()中L2_NORM和NORM_MINMAX实现之间有什么区别?

问题描述 投票:1回答:1

我正在尝试复制此处讨论的密集光流:https://nanonets.com/blog/optical-flow/这是代码段,我用来处理每个帧的光流。直觉是H->渐变角度,S-> 255,V->渐变量的范数。该渐变来自calcOpticalFlowFarenback的输出。

       cv::calcOpticalFlowFarneback(prevgray,gray,flow,0.5,3,15,3,5,1.2,0);
       cv::split(flow,channels);
       cv::cartToPolar(channels[0],channels[1],mag,angle);




       std::vector<cv::Mat> channels_m;
       cv::Mat c1 (Mask.size(),CV_8UC1);
       cv::Mat c0 (Mask.size(),CV_8UC1);
       cv::Mat c2 (Mask.size(),CV_8UC1);
       c1 = cv::Scalar::all(255);
       c0= angle*((180/3.14)/2);
       c0.convertTo(c0, CV_8U);
       cv::normalize(mag,c2,0,255,cv::NORM_MINMAX); <----- Line of interest
       c2.convertTo(c2, CV_8U);
       channels_m.push_back(c0);
       channels_m.push_back(c1);
       channels_m.push_back(c2);

       cv::merge(channels_m,Mask);
       cv::cvtColor(Mask,cflow,cv::COLOR_HSV2BGR_FULL);

当使用规范类型cv :: NORM_L2时,我的整个HSV V数组仅返回零。但是,当更改为cv :: NORM_MINMAX时,它返回非零值。我认为cv :: normalise的实际功能是对alpha和beta范围内的数组进行规范化。范数只是用于实现测距目标的归一化公式的类型。那么为什么我们看到输出的差异呢?

预先感谢!

c++ opencv
1个回答
0
投票

cv::NORM_L2]对数据进行归一化,这样,如果您拍摄了整个图像并将其转换为一个长矢量,则此矢量的magnitude就会变成alphabeta在规范化中被忽略。 因此,一旦您通过cv::NORM_L2进行了归一化,然后在您进行了归一化后(如果您将此归一化的输入视为一个长向量),则该向量的L [2]范数将变为alpha。因为您指定了alpha = 0,所以输出图像完全为0也就不足为奇了,因为您指定规范化后标准化为0。[cv::NORM_MINMAX同时使用alphabeta,以便将输入数组中的最小值映射到alpha,将最大值映射到beta,并且所有值都按比例缩放。

如果您想知道我是怎么知道的,该函数的文档对此非常清楚:https://docs.opencv.org/4.3.0/d2/de8/group__core__array.html#ga87eef7ee3970f86906d69a92cbf064bd

© www.soinside.com 2019 - 2024. All rights reserved.