更新资料

感谢您的所有反馈。我是个白痴,答案很耐心地指出:问题出在接口(interface)未正确更新mParams.amount的值中。我不知道为什么我没有明确检查或在调试器中注意到它。只是那些日子之一。

我提供整个功能的原因是因为我对事情为什么不起作用感到完全困惑,并且担心迭代器周围可能存在某种上下文相关的问题-但与上面的问题相比,它需要一些常识。

原始问题

我正在尝试使用迭代器在四通道归一化浮点cv::Mat上实现对比度过滤器,如下所示:

void FilterDepthContrast::process(cv::Mat& data)
{
    typedef cv::Vec<float, 4> V;
    V mid = V(.5, .5, .5, .5);
    for (auto v=data.begin<V>(); v!=data.end<V>(); ++v)
    {
        V distanceFromMiddle = *v - mid;
        cout << "v before " << *v << endl;
        *v = mid + mParams.amount * distanceFromMiddle;
        cout << "added on " << (mParams.amount * distanceFromMiddle) << endl;
        cout << "v after " << *v << endl;
    }
}

但是,分配给* v似乎无效。这是打印的内容:
v before (0.94902,0.960784,0.929412,0.211765)
added on (0.44902,0.460784,0.429412,-0.288235)
v after (0.94902,0.960784,0.929412,0.211765)

谁能解释这个迭代器在做什么,以及如何解决?

最佳答案

迭代器没有问题。
使用公式,您将在打印时得到结果。

怎么看 :

V mid = V(.5, .5, .5, .5);

打印时的初始* v = 0.94902,0.960784,0.929412,0.211765

应用
V distanceFromMiddle = *v - mid;

distanceFromMiddle =(0.44902,0.460784,0.429412,-0.288235)

同样是打印的
(mParams.amount * distanceFromMiddle)=(0.44902,0.460784,0.429412,-0.288235)

现在申请
*v = mid + mParams.amount * distanceFromMiddle;

(.5,.5,.5,.5)+(0.44902,0.460784,0.429412,-0.288235)=(0.94902,0.960784,0.929412,0.211765)

我认为问题出在因为mParams.amount = 1。

关于c++ - 为什么我对cv::Mat迭代器的分配不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17107148/

10-15 09:51