gpt4 book ai didi

c++ - cv::Normalise() 中的 L2_NORM 和 NORM_MINMAX 实现有什么区别?

转载 作者:行者123 更新时间:2023-12-01 14:22:41 34 4
gpt4 key购买 nike

我正在尝试复制此处讨论的密集光流:https://nanonets.com/blog/optical-flow/.This是片段,我用来处理光流的每一帧。直觉是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 范围内的数组。 Norm 只是一种用于实现测距目标的归一化公式。那么,为什么我们会看到输出差异?

提前致谢!

最佳答案

cv::NORM_L2 规范化您的数据,这样如果您获取整个图像并将其转换为一个长 vector ,则该 vector 的幅度会变成阿尔法beta 在规范化中被忽略。 因此,一旦您通过 cv::NORM_L2 归一化后,如果您将此归一化输入视为一个长 vector ,则此 vector 的 L2 范数将变为阿尔法。因为您指定了 alpha = 0,所以输出图像完全为 0 也就不足为奇了,因为您指定规范化后需要为 0。

cv::NORM_MINMAX 同时使用 alphabeta 使得输入数组中的最小值映射到 alpha 并且最大值被映射到 beta,中间的所有值都按比例缩放。

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

关于c++ - cv::Normalise() 中的 L2_NORM 和 NORM_MINMAX 实现有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62230135/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com