CV做直方图的比较说明图形越相似性

#include "opencv/cv.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

String cascadeName = "D:\\OpenCV-2.4.2\\data\\haarcascades\\haarcascade_frontalface_alt.xml";

IplImage* cutImage(IplImage* src, CvRect rect) {
    cvSetImageROI(src, rect);
    IplImage* dst = cvCreateImage(cvSize(rect.width, rect.height),
            src->depth,
            src->nChannels);

    cvCopy(src,dst,0);
    cvResetImageROI(src);
    return dst;
}

IplImage* detect( Mat& img, CascadeClassifier& cascade, double scale)
{
    int i = 0;
    double t = 0;
    vector<Rect> faces;
    Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );

    cvtColor( img, gray, CV_BGR2GRAY );
    resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
    equalizeHist( smallImg, smallImg );

    t = (double)cvGetTickCount();
    cascade.detectMultiScale( smallImg, faces,
        1.3, 2, CV_HAAR_SCALE_IMAGE,
        Size(30, 30) );
    t = (double)cvGetTickCount() - t;
    printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
    for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
    {
        IplImage* temp = cutImage(&(IplImage(img)), cvRect(r->x, r->y, r->width, r->height));
        return temp;
    }

    return NULL;
}
//画直方图用
int HistogramBins = 256;
float HistogramRange1[2]={0,255};
float *HistogramRange[1]={&HistogramRange1[0]};
int CompareHist(IplImage* image1, IplImage* image2)
{
    IplImage* srcImage;
    IplImage* targetImage;
    if (image1->nChannels != 1) {
        srcImage = cvCreateImage(cvSize(image1->width, image1->height), image1->depth, 1);
        cvCvtColor(image1, srcImage, CV_BGR2GRAY);
    } else {
        srcImage = image1;
    }

    if (image2->nChannels != 1) {
        targetImage = cvCreateImage(cvSize(image2->width, image2->height), srcImage->depth, 1);
        cvCvtColor(image2, targetImage, CV_BGR2GRAY);
    } else {
        targetImage = image2;
    }

    CvHistogram *Histogram1 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);
    CvHistogram *Histogram2 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);

    cvCalcHist(&srcImage, Histogram1);
    cvCalcHist(&targetImage, Histogram2);

    cvNormalizeHist(Histogram1, 1);
    cvNormalizeHist(Histogram2, 1);

    // CV_COMP_CHISQR,CV_COMP_BHATTACHARYYA这两种都可以用来做直方图的比较,值越小,说明图形越相似
    printf("CV_COMP_CHISQR : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CHISQR));
    printf("CV_COMP_BHATTACHARYYA : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_BHATTACHARYYA));

    // CV_COMP_CORREL, CV_COMP_INTERSECT这两种直方图的比较,值越大,说明图形越相似
    printf("CV_COMP_CORREL : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL));
    printf("CV_COMP_INTERSECT : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_INTERSECT));

    cvReleaseHist(&Histogram1);
    cvReleaseHist(&Histogram2);
    if (image1->nChannels != 1) {
        cvReleaseImage(&srcImage);
    }
    if (image2->nChannels != 1) {
        cvReleaseImage(&targetImage);
    }
    return 0;
}
String srcImage = "d:\\ldh1.jpg";
String targetImage = "d:\\ldh5.jpg";
int main(int argc, char* argv[])
{
    CascadeClassifier cascade;
    namedWindow("image1");
    namedWindow("image2");
    if( !cascade.load( cascadeName ) )
    {
        return -1;
    }

    Mat srcImg, targetImg;
    IplImage* faceImage1;
    IplImage* faceImage2;
    srcImg = imread(srcImage);
    targetImg = imread(targetImage);
    faceImage1 = detect(srcImg, cascade, 1);
    if (faceImage1 == NULL) {
        return -1;
    }
//    cvSaveImage("d:\\face.jpg", faceImage1, 0);
    faceImage2 = detect(targetImg, cascade, 1);
    if (faceImage2 == NULL) {
        return -1;
    }
//    cvSaveImage("d:\\face1.jpg", faceImage2, 0);
    imshow("image1", Mat(faceImage1));
    imshow("image2", Mat(faceImage2));

    CompareHist(faceImage1, faceImage2);
    cvWaitKey(0);
    cvReleaseImage(&faceImage1);
    cvReleaseImage(&faceImage2);
    return 0;
}

  

时间: 2024-08-30 15:38:53

CV做直方图的比较说明图形越相似性的相关文章

python对web服务器做压力测试并做出图形直观显示

压力测试有很多工具啊.apache的,还有jmeter, 还有loadrunner,都比较常用. 其实你自己用python写的,也足够用. 压力测试过程中要统计时间. 比如每秒的并发数,每秒的最大响应时间, 最小响应时间, 平均响应时间.最后再统一所有的请求完成后的上术参数. 将这些参数输出成CSV格式的文件. 如果不知道什么是CSV就是指将数据用引号包起来,中间用逗号分开,一系统数据放一行. 有了这个CSV文件,你用EXCEL打开来做图就可以. 如果你熟练,可以使用gnuplot这个命令行工具

cv 2.0入门

环境 VS2010UltimTrial1.iso                    http://pan.baidu.com/s/1dEL85kl VS2010UltimTrialCHS版注册码    YCFHQ-9DWCY-DKV88-T2TMH-G7BHP opencv-2.4.9.exe                              http://pan.baidu.com/s/1kVaVwoR 图片地址:                                  

灰色直方图图像匹配

#include "opencv2/highgui/highgui.hpp" #include "opencv/cv.hpp" #include "string.h" //画直方图用 int HistogramBins = 256; float HistogramRange1[2] = { 0, 255 }; float *HistogramRange[1] = { &HistogramRange1[0] }; /* * imagefil

OpenCV编程-&gt;对比直方图

OpenCv提供了5种对比直方图的方式:CORREL(相关).CHISQR(卡方).INTERSECT(相交).BHATTACHARYYA.EMD(最小工作距离),其中CHISQR速度最快,EMD速度最慢且有诸多限制,但是EMD的效果可能最好. 接下来开始测试一下: 对比函数如下: #define cvQueryHistValue_3D( hist, idx0, idx1, idx2 ) cvGetReal3D( (hist)->bins, (idx0), (idx1), (idx2) ) //

基于头部跟踪初代码测试

#include "iostream" #include "queue" #include "Windows.h" #include <opencv2/ml/ml.hpp> #include "opencv2/opencv.hpp" #include "Windows.h" #include "opencv2/core/core.hpp" #include "ope

cv1.5

使用均值漂移算法查找物体 #include <opencv2/opencv.hpp> using namespace cv; using namespace std; #include "Histogram1D.h" #include <iostream> #include <vector> #include "ContentFinder.h" #include "colorhistogram.h" int m

opencv学习之路(20)、直方图应用

一.直方图均衡化--equalizeHist() 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 4 void main() 5 { 6 Mat srcImg = imread("E://02.jpg", 0); //以灰度方式打开,需要输入单通道图像 7 imshow("src", srcImg); 8 Mat dstImg; //均衡化后的图像 9 equalizeHist(sr

opencv python:图像直方图 histogram

直接用matplotlib画出直方图 def plot_demo(image): plt.hist(image.ravel(), 256, [0, 256]) # image.ravel()将图像展开,256为bins数量,[0, 256]为范围 plt.show() 图像直方图 def image_hist(image): color = ('blue', 'green', 'red') for i, color in enumerate(color): # 计算出直方图,calcHist(i

Oracle 直方图理论

一.何为直方图 直方图是一种几何形图表,它是根据从生产过程中收集来的质量数据分布情况,画成以组距为底边.以频数为高度的一系列连接起来的直方型矩形图,如图所示 二.ORACLE 直方图 在Oracle中直方图是一种对数据分布情况进行描述的工具.它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择.在某些情况下,表的列中的数值分布将会影响优化器使用索引还是执行全表扫描的决策. 直方图的使用不受索引的限制,可以在表的任何列上构建直方图