OpenCV3 rgb颜色直方图生成与比较

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,越为相似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值