I've read the documentation for calcHist() many times, but I think my inexperience with OpenCV and rusty programming skills are completely precluding me from understanding it.
I'm looking to count pixels in one channel of an HSV image (Hue, or channel[0]) for segmentation purposes using 10 bins that closely approximate color according to something like (let's use this as an example, I stole the ranges off the web - fwiw, it seems erroneous to omit purple-red):
Red: 0-19 & 330-360 Red-Yellow (RY): 20-49 Yellow: 50-69 YG: 70-84 Green: 85-170 GB: 171-191 Blue: 192-264 BP: 265-289 Purple: 290-329
And so on...
So how do I do this with calcHist?
I'm as far as:
#include <opencv2/opencv.hpp>
#include <vector>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
Mat scene, sceneHSV, dest, histo;
int numImages = 1, histChannel[] = {0}, dims = 1, histSize[] = {10};
float redRange[] = {0, 10};
float roRange[] = {10, 25};
float orangeRange[] = {25, 35};
float oyRange[] = {35, 42};
float yellowRange[] = {42, 85};
float ygRange[] = {85, 96};
float greenRange[] = {96, 132};
float gbRange[] = {132, 145};
float blueRange[] = {145, 160};
float bpRange[] = {160, 165};
float purpleRange[] = {165, 180};
const float* ranges[] = {redRange, roRange, orangeRange, oyRange, yellowRange, ygRange, greenRange, gbRange, blueRange, bpRange, purpleRange};
vector<Mat> channels;
scene = imread("Apple.jpg", 1);
if (scene.data == NULL)
{
cout<<"FAIL"<<endl;
cin.get();
}
cvtColor(scene, sceneHSV, CV_BGR2HSV);
dilate(sceneHSV, sceneHSV, Mat(), Point(-1, -1), 1, BORDER_CONSTANT, 1);
pyrMeanShiftFiltering(sceneHSV, dest, 2, 50, 3);
split(sceneHSV, channels);
calcHist(&scene, 1, histChannel, Mat(), histo, dims, histSize, ranges, false, false);
cout<<histo<<endl;
waitKey(0);
return 0;
}
Now what? What would the arguments to calcHist look like in this case, and what does the output histogram look like? Simply a 1x9 array full of ints?
Thanks very much.