我想知道如何在opencv c ++中绘制HSV Mat的二维直方图.我当前试图显示它的代码失败了.我已经四处查看如何绘制直方图,我发现的所有直方图都是将它们绘制为独立的1d直方图.
这是我当前的输出,色调分箱数为30,饱和分箱数为32:

这是另一个输出,其中色调分箱数为7,饱和分箱数为5:

我希望它看起来更像是这里的结果
我也注意到每当我做cout << Hist.size它给我50x50.我理解这只是意味着数组的第一个维度是250的大小?
另外,如何将直方图从最高到最低(或反之亦然)值频率排序?这是我想要解决的另一个问题.
我目前的功能如下.
void Perform_Hist(Mat& MeanShift, Mat& Pyramid_Result, Mat& BackProj){
Mat HSV, Hist;
int histSize[] = {hbins, sbins};
int channels[] = {0, 1};
float hranges[] = {0, 180};
float sranges[] = {0, 256};
const float* ranges[] = {hranges, sranges};
cvtColor(MeanShift, HSV, CV_BGR2HSV);
Mat PyrGray = Pyramid_Result.clone();
calcHist(&HSV, 1, channels, Mat(), Hist, 2, histSize, ranges, true, false);
normalize(Hist, Hist, 0, 255, NORM_MINMAX, -1, Mat());
invert(Hist, Hist, 1);
calcBackProject(&PyrGray, 1, channels, Hist, …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在 opencv java 中转换一些 opencv C++ 代码,但似乎无法让像素分割正常工作。我拿了一个 meanshiftsegmented mat,然后转换为灰度,然后转换为 32F。
然后我将最下采样然后上采样的图像(由灰色均值偏移垫组成)与原始灰色均值偏移垫进行比较。
我已经阅读了Using get() and put() to access pixel values in OpenCV for Java
但是,它和其他类似的东西不起作用。我收到的错误消息是无效的垫子类型 5。但是,即使我能够看到显着图,我也肯定这是错误的。这是因为当我在 C++ 中传入图像 001.jpg 时,我应该看到原始图像 + 对象周围的红色方块。在java中,我只看到最后的原始图像。
笔记 :
AbstractImageProvider.deepCopy(AbstractImageProvider.matToBufferedImage(Saliency),disp);
是一个 API 调用,当我尝试显示原始垫、meanShift 垫和灰色 meanShift 垫时有效。它无法显示显着性。
C++
我只做了一个通道拆分,因为我正在测试其他颜色空间,但是在 java 中我只想使用灰度。
input = MeanShift.clone();
input.convertTo(input, CV_32F);
for(int i = 0; i < Pyramid_Size; i++){DS_Pyramid[i] = input.clone();}
for (int i = 0; i < Pyramid_Size; i++){
for (int k = 0; k <= i; k++){ // Why …Run Code Online (Sandbox Code Playgroud)