0

アップデート

すべてのフィードバックに感謝します。答えが非常に辛抱強く指摘しているように、私はばかでした.問題は、インターフェイスによって正しく更新されていない mParams.amount の値にあります。なぜこれを明示的にチェックしなかったのか、デバッガーで気付かなかったのかわかりません。そのうちの 1 日だけです。

関数全体を提供した理由は、なぜ物事が機能しないのかについて完全に当惑し、イテレータを取り巻く何らかの文脈上の問​​題があるのではないかと心配したためです.しかし、上記と同様に、もう少し常識が必要でした.


元の質問

次のようにイテレータを使用して、4 チャネルの正規化されたフロート 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;

中央からの距離 = (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 に答える