cv::MatND Video::calcRgbHist(const VFrameData* m_frame) const
{
//m_frame->frameData是解码后的yuv的一帧图像
cv::Mat yuvImg;
yuvImg.create(m_frame->frameHeight*3/2,m_frame->frameWidth,CV_8UC1);//to resure
memcpy(yuvImg.data,m_frame->frameData,m_frame->frameDataLength*sizeof(unsigned char));
cv::Mat rgbImg;
cv::cvtColor(yuvImg,rgbImg,CV_YUV420p2RGB);//CV_YUV420p2RGB to resure
//calculate 3-d hist
const int channels[3] = {0,1,2};
const int histSize[3] = {16,16,16};
float hranges[2] = {0,256};//range of value in every dim
const float* ranges[3]={hranges,hranges,hranges};
cv::MatND hist;
cv::calcHist(& rgbImg,1,channels,cv::Mat(),hist,3,histSize,ranges,true,false);//ATTENTION
return hist;
}
bool Video::compareRgbHist(const cv::MatND& histToCompare, const double threshold)
{
double histSimilarity = 0.0;
if (preKeyFrameHist.empty()) {
preKeyFrameHist = histToCompare;
return true;
} else
histSimilarity = cv::compareHist(preKeyFrameHist,histToCompare,CV_COMP_CORREL);//CV_COMP_CORREL:1,CV_COMP_CHISQR:2,CV_COMP_INTERSECT :3,CV_COMP_BHATTACHARTTA:4
//std::cout<<"Similarity"<<histSimilarity<<std::endl;
//microsecond
if (histSimilarity <= threshold) {
preKeyFrameHist = histToCompare;
return true;
} else
return false;
}
其中比较直方图时有四种算法
公式如下
对于 Correlation 和 Intersection 算法, 值越大相似度越大。而另外两种算法,则是结果越小相似度越大。
由公式可以得到:
Correlation算法得到的最大值是1,且越接近于1,表示越相似。
Bhattacharyya算法得到的最大值是1,不过越接近于0,越为相似。