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. 如果不是您再次搜索(如果已经找到则再次重复操作),否则如果未找到,则查找最近的(没关系),但是您是否处理没有的情况(即 in 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

0x000000您可以通过添加标记值和0xFFFFFF(一次)来解决迭代器超出范围的问题。这样,你总是有一个有效的下限和上限。当然,这可能会影响算法的结果。例如,如果您的“最小”真实颜色是纯蓝色 ( 0x0000FF),那么深蓝色 ( 0x00007F) 现在会找到黑色,而不是纯蓝色。当然,这很容易通过两次比较来解决。

哨兵就位后,呼叫QMap::lower_bound。您需要检查是否确实找到了精确匹配:如果*lower_bound是您想要的值,则返回它。否则,lower_bound指向大于您输入的第一个元素。因此,--lowerbound指向最后一个小于您输入的元素。检查两者中哪个更接近。

请注意,唯一lower_bound可以指向的方法begin是您的输入是精确0x000000的(哨兵),在这种情况下您将无法到达--lower_bound. 没有范围错误。同样的逻辑,end sentinel0xFFFFFF意味着你总能找到一个lower_bound.

于 2011-07-18T12:51:15.313 回答