我现在正在使用vector <cv::Vec3b>
存储图像的RGB值。
为避免混淆,请让我更多地澄清我的问题。例如,我有一个大小为10的向量。存储的值如下所示:
Vector address RGB Values(R,G,B)
[0][0][0]= 255,255,255
[1][1][1]= 40,42,40
[2][2][2]= 40,42,40
[3][3][3]= 40,42,40
[4][4][4]= 40,2,60
[5][5][5]= 9,9,0
[6][6][6]= 40,2,60
[7][7][7]= 40,42,40
[8][8][8]= 255,255,40
[9][9][9]= 255,255,40
如所观察到的,最常出现的值是(40,42,40)。我如何获得这些值? 我希望找到矢量最常出现的RGB值。有没有人有任何建议,代码样本我怎么做?感谢。
答案 0 :(得分:2)
假设您的3D数组是array[][][]
,并且在某个位置(x,y)您得到R = 200,G = 100,B = 10,那么您将array[200][100][10]
的值增加1让我们在另一个地方再次获得R = 200,G = 100,B = 10然后再次将array[200][100][10]
增加1,所以现在array[200][100][10]
的总值为2.你将对所有像素位置执行相同操作。
然后,最后您将在3D数组中找到最大值,并假设array[210][15][10]
处的最大值为1000。这表示出现最大次数的R.G和B的组合是“R = 210,G = 15,B = 10”
所以,简而言之,我们可以说[] [] []的值告诉你,组合[R] [G] [B]发生了多少次。
答案 1 :(得分:1)
我对知识产权并不十分熟悉。如果它只是获取大多数RGB对象的问题,那么可以使用algorithm.h头文件中存在的sort()和equal_range()算法来完成。在下面的代码片段中,我采用了vector而不是RGB类型的示例。此代码段可用于您的目的,通过一些更改来查找最高对象的计数:
void main()
{
vector<int> vecInt;
vecInt.push_back(0);
vecInt.push_back(1);
vecInt.push_back(2);
vecInt.push_back(3);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(9);
vecInt.push_back(1);
vecInt.push_back(0);
vecInt.push_back(0);
sort(vecInt.begin(), vecInt.end());
vector<int>::iterator it;
it = vecInt.begin();
pair<vector<int>::iterator, vector<int>::iterator> pairIter;
int count = 0;
for(; it != vecInt.end(); ++it)
{
if(it != vecInt.end() )
{
pairIter = equal_range(it, vecInt.end(), *it);
}
while(pairIter.first != pairIter.second)
{
++count;
++(pairIter.first);
}
}
}
equal_count(),对已排序的容器起作用并返回一对迭代器(已排序容器中的一个范围),其中包含要搜索的值。
pairIter = equal_range(it, vecInt.end(), *it);
现在,我们可以使用如下循环来获取该对迭代器中的项目数:
while(pairIter.first != pairIter.second)
{
++count;
++(pairIter.first);
}
如果对此代码进行一些更改,我认为这将解决您的目的。
答案 2 :(得分:1)
我认为你可以定义一个三维数组,你可以按照这里提到的那样做: http://www.cplusplus.com/forum/articles/7459/
然后在图像的每个位置提取像素(Veb3b pixelValue;
)的值,然后根据R,G和B值(rValue = pixelValue[0];
,gValue = pixelValue[1];
,{{1}提取})递增3D数组的相应bin