找到大多数出现的值(cv :: Vec3b)结果似乎是错误的

时间:2014-02-26 10:51:32

标签: c++ opencv

我试图通过for循环找到最多值的值。我没有使用排序函数currentCharmostCharcv::Vec3b值。该计划如下所示:

for (int z = 0; z < temp.size(); z++)
{
    currentChar = temp[z];
    mostChar = temp[z];
    currentCount = 0;
    mostCount = 0;
    for (int i =0; i < temp.size(); i++)
    {
        cv::Vec3b c = temp[i];

        if (c == currentChar)
            currentCount++;

        if (currentCount > mostCount)
        {
            mostChar = currentChar;
            mostCount = currentCount;
        }
    }
}
std::cout << "most occurring values is" << mostChar << "with " << mostCount << " times!" << endl;

结果似乎很奇怪。我已经尝试了很多。不确定我的程序流程是否有问题。我习惯做这样的事情,有效:

sort(temp.begin(), temp.end());
int currentChar = temp[0];
int mostChar = temp[0];
int currentCount = 0;
int mostCount = 0;
for (int i =0; i <temp.size(); i++)
{
    int c = temp[i];
    if (c == currentChar)
        currentCount++;
    else
    {
        if (currentCount > mostCount)
        {
            mostChar = currentChar;
            mostCount = currentCount;
        }
        currentChar = c;
        currentCount = 1;
    }
}

std::cout << "most occurring values is" << mostChar << "with " << mostCount << " times!" << endl;

现在没有sort函数和使用for循环,我的结果似乎很奇怪。任何的想法?我试过了:

if (c == currentChar)
    currentCount++;
else
{
    if ( currentCount > mostCount)
    {
            mostChar = currentChar;
        mostCount = currentCount;
    }
        currentChar = c;
        currentCount = 1;
    }
}
在for循环方法中

,并且在这里和那里不断变化,但结果似乎仍然很奇怪。任何的想法。自从我玩编程以来已经有一段时间了,并且因为被困在这么简单的事情而感到尴尬,但我想改进!所以请帮忙。流程出了什么问题?

编辑:尝试使用运算符,但结果似乎仍然不正确。

我的运营商代码:

struct //Compare : public std::binary_function<cv::Vec3b,cv::Vec3b,bool>
{
    bool operator()(cv::Vec3b &a, cv::Vec3b &b)
    {
         return std::tie(a[0], a[1], a[2]) < std::tie(b[0], b[1], b[2]); 
    }
}inOrder;

我用它作为sort函数的参数。

sort(temp.begin(), temp.end(),inOrder);

然而,结果仍然不可取,或者说似乎不对。我是否错误地声明了操作员?我从自定义函数对象下的http://en.cppreference.com/w/cpp/algorithm/sort得到了这个想法。

1 个答案:

答案 0 :(得分:1)

您的mostCharmostCount会在每次重复时重置,因此mostChar将始终是最后一个元素。

移动

mostChar = temp[z]; // replace by temp[0]
mostCount = 0;

在循环之外。