C++ 为什么我对cv::Mat迭代器的赋值不起作用? 更新

C++ 为什么我对cv::Mat迭代器的赋值不起作用? 更新,c++,opencv,iterator,C++,Opencv,Iterator,感谢所有的反馈。答案耐心地指出,我是个白痴:问题在于mParams.amount的值没有被接口正确更新。我不知道为什么我没有明确地检查这个问题,或者在调试器中没有注意到它。只是其中的一天 我提供整个函数的原因是,我完全不明白为什么事情不起作用,并且担心迭代器周围可能存在某种上下文问题,但与上面一样,它只需要多一点常识 原始问题 我试图使用迭代器在四通道标准化浮点cv::Mat上实现对比度过滤器,如下所示: void FilterDepthContrast::process(cv::Mat&am

感谢所有的反馈。答案耐心地指出,我是个白痴:问题在于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=(0.94902,0.960784,0.929412,0.211765)

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

因此
distancefrommide=V-mid=(0.44902,0.460784,0.429412,-0.288235)

但是
cout的输出值是
V=(0.94902,0.960784,0.929412,0.211765)

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

因此
distancefrommide=V-mid=(0.44902,0.460784,0.429412,-0.288235)


但是从
cout输出的迭代器没有问题。
使用公式,您将在打印时得到结果

看看如何:

V mid = V(.5, .5, .5, .5); 
打印首字母*v=0.94902,0.960784,0.929412,0.211765

申请

V distanceFromMiddle = *v - mid;
中间距离=(0.44902,0.460784,0.429412,-0.288235)

也如印刷品所示, (mParams.amount*distance from middle)=(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。

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

看看如何:

V mid = V(.5, .5, .5, .5); 
打印首字母*v=0.94902,0.960784,0.929412,0.211765

申请

V distanceFromMiddle = *v - mid;
中间距离=(0.44902,0.460784,0.429412,-0.288235)

也如印刷品所示, (mParams.amount*distance from middle)=(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。

为什么不打印
mid+mParams.amount*distance from middle?如果
mParams.amount
1
,则您有
*v=*v
。存在一些无关的代码。您不需要循环或函数来演示您的问题。创建一个简单的示例,一个。为什么不打印
mid+mParams.amount*distance fromMiddle?如果
mParams.amount
1
,则您有
*v=*v
。存在一些无关的代码。您不需要循环或函数来演示您的问题。创建一个简单的例子,一个。是的,是的,非常明显。非常感谢。是的,是的,非常明显。非常感谢。谢谢,你们都完全正确-请看我对原始问题的评论谢谢,你们都完全正确-请看我对原始问题的评论