OpenCV 直方图与匹配

直方图的基本数据结构

typedef struct CvHistogram
{
    int type;
    CvArr* bins;
    float thresh[CV_MAX_DIM][2];
    float** thresh2;
    CvMatND mat;
}CvHistogram;

创建一个直方图

CvHistogram* cvCreateHist(
    int dims,                    // 维数
    int* sizes,                  // 整数数组, 长度等于 dims
    int type,                    // CV_HIST_ARRAY(用来表示使用密集多维矩阵结构(CvSparseMat)方式存储),CV_HIST_SPARSE(稀疏矩阵(CvSparseMat)方式存储)
    float** ranges = NULL,       // 浮点数对构成的数组,数组的个数等于维数
    int uniform = 1              // 布尔类型变量,说明直方图是否有均匀的bin
);

void cvSetHistBinRanges(
    CvHistogram* hist,
    float** ranges,
    int uniform = 1
);
void cvClearHist(
    CvHistogram* hist
);
void cvReleaseHist(
    CvHistogram** hist
);

根据已给出的数据创建直方图:

CvHistogram* cvMakeHistHeaderForArray(
    int dims,
    int* sizes,
    CvHistogram* hist,
    float* data,
    float** ranges = NULL,
    int uniform = 1
);


访问直方图

double cvQueryHistValue_1D (
    CvHistogram* hist,
    int idx0
);
double cvQueryHistValue_2D (
    CvHistogram* hist,
    int idx0,
    int idx1
);
double cvQueryHistValue_3D (
    CvHistogram* hist,
    int idx0,
    int idx1,
    int idx2
);
double cvQueryHistValue_3D (
    CvHistogram* hist,
    int idx0,
    int idx1,
    int idx2
);
double cvQureyHistValue_nD (
    CvHistogram* hist,
    int* idxN
);

float* cvGetHistValue_1D (
    CvHistogram* hist,
    int idx0
);
float* cvGetHistValue_2D (
    CvHistogram* hist,
    int idx0,
    int idx1
);
float* cvGetHistValue_3D (
    CvHistogram* hist,
    int idx0,
    int idx1,
    int idx2
);
float* cvGetHistValue_3D (
    CvHistogram* hist,
    int idx0,
    int idx1,
    int idx2
);
float* cvGetHistValue_nD (
    CvHistogram* hist,
    int* idxN
);


直方图的基本操作

cvNormalizeHist( CvHistogram* hist, double factor);
cvThreashHist( CvHistogram* hist, double factor);
void cvCopyHist( const CvHistogram* src, CvHistogram** dst);

输出直方图中找到的最小值和最大值:

void cvGetMinMaxHistValue(
    const CvHistogram* hist,
    float* mix_value,
    float* max_value,
    int* min_idx = NULL,
    int* max_idx = NULL
);


自动计算直方图:

void cvCalcHist(
    IplImage** image,
    CvHistogram* hist,
    int accumulate = 0,
    const CvArr* mask = NULL
);


对比两个直方图:

double cvCompareHist(
    const CvHistogram* hist1,
    const CvHistogram* hist2,
    int method
);


1569337228143784.png


1569337323694567.png


1569337380168859.png

1569337423254226.png


陆地移动距离

float cvCalcEMD2 (
    const CvArr* signature1,
    const CvArr* signature2,
    int distance_type,
    CvDistanceFunction distance_func = NULL,
    const CvArr* cost_matrix = NULL,
    CvArr* flow = NULL,
    float* lower_bound = NULL,
    void* userdata = NULL
);

反向投影

void cvCalcBackProject(
    IplImage** image,
    CvArr* back_project,
    const CvHistogram* hist
);

模板匹配

void cvMatchTemplate (
    const CvArr* image,
    const CvArr* templ,
    CvArr* result,
    int method
);

1569338594154806.png

标签: OpenCV C/C++
相关文章
评论留言
发布留言