C++ 根据HSV直方图确定颜色

C++ 根据HSV直方图确定颜色,c++,opencv,colors,histogram,C++,Opencv,Colors,Histogram,我想确定图像中物体的颜色。我能够确定物体的遮罩,并使用遮罩生成图像的HSV直方图。 cvtColor( Frame, hsv_base, CV_BGR2HSV ); int h_bins = 50; int s_bins = 32; int v_bins = 10; int histSize[] = { h_bins, s_bins, v_bins }; float h_ranges[] = { 0, 180 }; float s_ranges[] = { 0, 256 }; float v

我想确定图像中物体的颜色。我能够确定物体的遮罩,并使用遮罩生成图像的HSV直方图。

cvtColor( Frame, hsv_base, CV_BGR2HSV );
int h_bins = 50; 
int s_bins = 32;
int v_bins = 10;
int histSize[] = { h_bins, s_bins, v_bins };

float h_ranges[] = { 0, 180 };
float s_ranges[] = { 0, 256 };
float v_ranges[] = { 0, 256 };

const float* ranges[] = { h_ranges, s_ranges, v_ranges };
int channels[] = { 0, 1, 2};
calcHist( &hsv_base, 1, channels, mask, hist_base, 3, histSize, ranges, true, false ); //mask is the mask of the object


每个人都展示了不同的方法。谁能告诉我一个简单的方法来确定直方图的颜色吗?

绘制直方图时,X轴充当我们的“箱子”。如果我们构建一个256个像素的直方图,那么我们实际上是在计算每个像素值出现的次数

相反,如果我们只使用2个(等间距)存储单元,那么我们计算的是一个像素在[0,128]或[128,255]范围内的次数。然后将与X轴值绑定的像素数绘制在Y轴上


因此,如果您想获得最常见的颜色,您需要256个箱子(对于256位图像),并计算输入的数量。

我认为这会对您有所帮助。我也发现这可能会对您有所帮助。您的意思是我应该只使用两个箱子值,每个箱子值的范围从[0128]到[0128]?您的问题不清楚您实际想要实现的目标。“确定颜色”这可能意味着相当多的洛蒂猜测与颜色最相关的是色调和饱和度通道。这取决于你如何定义“相同/相似的颜色”你可以选择大小或箱子我想我可以问得更简单一些。我想基本上确定最基本的颜色,如红色、绿色、蓝色、粉色等。我知道色调值可以给出这些I颜色,但我想问的是,如何编写代码?如果你把它分成256个类别,你会得到每个箱子有多少个颜色的值例如,如果你有一个完全粉红色的图像,并将你的直方图分成256个类别,那么你的所有条目都会有特定的粉红色值。如果你有一个复杂的图像,最大的数字将是最常见的颜色等。