/*通过标记帧与帧之间显著的边缘和颜色的统计变化来检测视频场景的变化
Dims : 需要统计的特征数目
bins:每个特征区间子区段的数目
range:每个特征空间的取值范围
计算直方图
void calcHist( const Mat* images,//输入数组 CV_8U 或者 CV_32F 相同深度 相同尺寸
int nimages,// 输入数组的个数,也就是一个参数有多少张图
const int* channels,//需要统计通道(dim)的索引
InputArray mask,//可选操作掩码,如果不为空必须为8位
SparseMat& hist, // 输出目标直方图
int dims,//直方图的维度 必须正数 不大于CV_MAX_DIMS
const int* histSize,//存放每个维度的直方图尺寸的数组
const float** ranges,//表示每一个维度数组的每一维边界阵列
bool uniform = true,//指示直方图时候均匀的标识符
bool accumulate = false //累计标识符, 如果为true 直方图在配置阶段不清0, 主要是润许多个阵列中计算单个直方图,或者用于在特定的时间更新直方图
);
寻找最值
void minMaxLoc(const SparseMat& a, //单通道阵列
double* minVal,//返回最小值的指针
double* maxVal,//返回最大值的指针
Point* minIdx = 0,//返回最小位置的指针
Point* maxIdx = 0//返回最大位置的指针
Inputarray mask=noArray()//用于选择子阵列的可选掩膜
);
*/
#include <opencv2//highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/photo/photo.hpp>
using namespace std;
using namespace cv;
//*********************************
// 绘制H----S直方图
//*********************************
int main()
{
Mat srcImage, hsvImage;
srcImage = imread("C:/Users/hasee-pc/Desktop/women.jpg");
cvtColor(srcImage, hsvImage, CV_BGR2HSV);//转换为HSV类型
int hueBinNum = 30;//色调的直方图直条数量
int saturationBinNum = 32;//饱和度的直方直条数量
int histSize[] = { hueBinNum,saturationBinNum };
float hueRanges[] = { 0,180 };//色调变化0-179
float staturationRanges[] = { 0,256 };//饱和度变化范围0 黑、白、灰、到255
const float *ranges[] = { hueRanges,staturationRanges };
MatND dstHist;
//计算0通道和1通道
int channels[] = { 0,1 };
calcHist(&hsvImage,//输入数组
1,//数组个数
channels,//通道索引
Mat(),//不使用掩膜
dstHist,//输出的目标直方图
2,//需要计算的直方图维度为2
histSize,//存放每个维度的直方图尺寸的数组
ranges,//每一维数值的取值范围数组
true,//指示直方图是否均匀的标识符
false//累计标识符
);
double maxValue = 0;//最大值
//查找数组和子数组的全局最小值和最大值存入maxValue中
minMaxLoc(
dstHist,
0,
&maxValue,
0,
0
);
int scale = 10;
//直方图绘制
Mat histImg = Mat::zeros(saturationBinNum*scale, hueBinNum * 10, CV_8UC3);
for (int hue = 0; hue < hueBinNum; ++hue)
{
for (int saturation = 0; saturation < saturationBinNum; ++saturation)
{
float binValue = dstHist.at<float>(hue, saturation);//直方图直条的值
int intensity = cvRound(binValue * 255 / maxValue);//强度
rectangle(//绘制
histImg,
Point(hue*scale, saturation*scale),
Point((hue + 1)*scale - 1, (saturation + 1)*scale - 1),
Scalar::all(intensity), FILLED
);
}
}
imshow("素材图", srcImage);
imshow("H_S直方图", histImg);
waitKey(0);
}