0

更新

感谢所有的反馈。我是个白痴,因为答案非常耐心地指出:问题在于界面未正确更新的 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)

谁能解释我在这个迭代器上做错了什么以及如何解决它?

4

2 回答 2

2

你有V = (0.94902,0.960784,0.929412,0.211765)

mid = (.5, .5, .5, .5)

所以distanceFromMiddle = V - mid = (0.44902,0.460784,0.429412,-0.288235)

但是你的输出cout << "added on " << (mParams.amount * distanceFromMiddle) << endl; 是一样的 distanceFromMiddle== (mParams.amount * distanceFromMiddle)

结论 :mParams.amount == 1

于 2013-06-14T11:23:05.133 回答
1

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

怎么看 :

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。

于 2013-06-14T11:27:37.310 回答