calcHist()のドキュメントを何度も読んだことがありますが、OpenCVの経験が浅く、さびたプログラミングスキルがあるため、理解できなくなっていると思います。
HSV画像の1つのチャネル(色相、またはchannel [0])のピクセルを、次のような色に近い10個のビンを使用してセグメンテーションの目的でカウントしようとしています(これを例として使用します。範囲を盗みました)ウェブ-fwiw、紫赤を省略するのは誤りのようです):
赤:0-19&330-360赤-黄(RY):20-49黄:50-69 YG:70-84緑:85-170 GB:171-191青:192-264 BP:265-289紫:290-329
等々...
では、calcHistでこれを行うにはどうすればよいですか?
私は次のようにしています:
#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;
}
それで?この場合、calcHistの引数はどのようになり、出力ヒストグラムはどのようになりますか?単にintでいっぱいの1x9配列?
どうもありがとう。