您的位置:首页 > 产品设计 > UI/UE

opencv 3版本中 cvQueryHistValue_1D 函数问题

2018-03-09 12:19 399 查看
最近在用opencv画直方图时,按照书上的例子程序,发现opencv 3 版本中没有cvQueryHistValue_1D这个函数,但是在以前的版本中都是有的,查看网上的解决方法是写一个宏,程序在下面:
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#define cvQueryHistValue_1D( hist, idx0 ) \
    ((float)cvGetReal1D( (hist)->bins, (idx0)))


int size =  255 ;
float range[] = { 0,255 }; float* ranges[] = { range };
//画直方图函数
IplImage* draw_hist_img(CvHistogram* hist, float scaleX, float scaleY) {
float histMax = 0;
cvGetMinMaxHistValue(hist, 0, &histMax, 0, 0);
IplImage* hist_img = cvCreateImage(cvSize(255 * scaleX, 64 * scaleY), 8, 1);
cvZero(hist_img);
for (int i = 0; i < size; i++)
{
float histvalue = cvQueryHistValue_1D(hist, i);
int intensity = cvRound(histvalue * 255 / histMax);
cvRectangle(hist_img,
CvPoint(i*scaleX, 64 * scaleY),
CvPoint((i + 1)*scaleX, (1 - histvalue / histMax) * 64 * scaleY), CvScalar(255),
CV_FILLED, 8, 0);
}
return hist_img;
}
int main() {
IplImage* img = cvLoadImage("H:\\3.jpg", 1);
//将BGR分解成三个单通道图像
IplImage* b_img = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* g_img = cvCreateImage(cvGetSize(img), 8, 1);
IplImage* r_img = cvCreateImage(cvGetSize(img), 8, 1);
cvSplit(img, b_img, g_img, r_img, 0);
//创建三个直方图
CvHistogram* b_hist = cvCreateHist(1, &size, CV_HIST_ARRAY, ranges, 1);
CvHistogram* g_hist = cvCreateHist(1, &size, CV_HIST_ARRAY, ranges, 1);
CvHistogram* r_hist = cvCreateHist(1, &size, CV_HIST_ARRAY, ranges, 1);
cvClearHist(b_hist); cvClearHist(g_hist); cvClearHist(r_hist);
//计算三个直方图
cvCalcHist(&b_img, b_hist, 0, 0);
cvCalcHist(&g_img, g_hist, 0, 0);
cvCalcHist(&r_img, r_hist, 0, 0);
//画三个直方图
IplImage* b_hist_img = draw_hist_img(b_hist, 2, 2);
IplImage* g_hist_img = draw_hist_img(g_hist, 2, 2);
IplImage* r_hist_img = draw_hist_img(r_hist, 2, 2);
//显示
cvShowImage("原图", img);
cvShowImage("B_HIST",b_hist_img);
cvShowImage("G_HIST", g_hist_img);
cvShowImage("R_HIST", r_hist_img);
cvWaitKey(0);

return(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv 画直方图