1

最も近いRGB値を見つけようとしていますQMap(おそらくHSVである必要があることはわかっていますが、それは問題ではありません)。これが私がこれまでに得たものです:

        it = images_map.find(current_rgb);

        if(it != images_map.begin()){
            mi = images_map.lowerBound(current_rgb).value();
        }
        else{
            mi = images_map.upperBound(current_rgb).value();
        }

私のマップは次のように見えます。

images_map[ 4283914078 ] 
images_map[ 4284046165 ] 
images_map[ 4284902241 ] 
images_map[ 4289239953 ] 
images_map[ 4282200377 ] 
images_map[ 4289440688 ] 

current_rgbたとえばmy の場合4285046165は問題ありませんが、最大のインデックスよりも大きな値が存在すると、プログラムがクラッシュします。私は何を間違っていますか?

4

3 に答える 3

3

.value()存在しないアイテムを逆参照しようとしている可能性がありますか?

これは独自のカスタム マップの実装 (またはラッパー) のように見えますが、ロジックが間違っているようです

  1. lowerBound探しているアイテムがマップの最初にある場合を除いて、毎回呼び出します
  2. 地図の最初の場合は、もう一度検索しますか???
  3. 再度検索しない場合 (既に見つかった場合は操作をもう一度繰り返します)、見つからない場合は最も近いものを探します (これで問題ありませんlowerBound)。

ロジックは次のようになります。

it = images_map.find(current_rgb);

if(it == images_map.end())
{
  it = images_map.lowerBound(current_rgb);
  if (it == images_map.begin())
  {
    it = images_map.upperBound(current_rgb);
    if (it == images_map.end()) 
      // throw error
  }
  // now you know you have a valid iterator - de-reference
  mi = *it.value();
}
于 2011-07-18T08:14:30.720 に答える
1

電話

images_map.upperBound(current_rgb) 

戻る可能性があります

images_map.end()

その場合、 を呼び出すべきではありませんvalue()

于 2011-07-18T08:16:41.923 に答える
0

センチネル値0x0000000xFFFFFF(1回)を追加することで、イテレータが範囲外の問題を解決できます。そうすれば、常に有効な下限と上限が得られます。もちろん、これはアルゴリズムの結果に影響を与える可能性があります。たとえば、「最小」の実際の色が純粋な青 ( 0x0000FF) の場合、濃い青 ( 0x00007F) は純粋な青ではなく黒を検出します。もちろん、これは 2 つの比較によって簡単に修正できます。

センチネルを配置したら、 を呼び出しますQMap::lower_bound。実際に正確な一致を見つけたかどうかを確認する必要があります: が必要な*lower_bound値である場合は、それを返します。それlower_bound以外の場合は、入力よりも大きい最初の要素を指します。したがって、--lowerbound入力よりも小さい最後の要素を指します。どちらが近いかを確認します。

lower_boundを指すことができる唯一の方法beginは、入力が正確0x000000(センチネル) である場合であることに注意してください--lower_bound。そこに範囲エラーはありません。同じ論理で、エンド センチネル0xFFFFFFは、常にlower_bound.

于 2011-07-18T12:51:15.313 に答える