前辈写的不能直接用,自己改了改
#include "cv.h"
#include "highgui.h"
#include "opencv2/imgproc.hpp"
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <ctype.h>
using namespace std;
using namespace cv;
//结构体
IplImage *src = 0;//*ip=地址中那个值
IplImage *histimg = 0;
//多维直方图
CvHistogram *hist = 0;
int hdims = 50;//划分HIST的初始个数,越高越精确
//滚动条函数
void HIST(int t)
{
float hranges_arr[] = { 0,255 };
float* hranges = hranges_arr;
int bin_w;
int bin_u;
float max;
int i;
char string[10];
CvFont font;
//通过&变量名访问地址
cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, 8);//字体结构初始化
if (hdims == 0)
{
printf("直方图条数不能为零!\n");
}
else
{
hist = cvCreateHist(1, &hdims, CV_HIST_ARRAY, &hranges, 1); // 创建直方图
histimg = cvCreateImage(cvSize(800, 512), 8, 3);
cvZero(histimg);//新建图像后紧接着加个cvZero()函数,就是将图像中的每个像素都置为0,那么显示的frame自然就是全黑了。
cvCalcHist(&src, hist, 0, 0); // 计算直方图
cvGetMinMaxHistValue(hist, NULL, &max, NULL, NULL);//寻找最大值及其位置
//printf("max_val:%f \n",max_val);
cvZero(histimg);
//c++ 中的“->”的意思是指向结构变量的指针。
//指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值
double bin_w = (double)histimg->width / hdims; // hdims: 条的个数,则 bin_w 为条的宽度
double bin_u = (double)histimg->height / max; //// max: 最高条的像素个数,则 bin_u 为单个像素的高度
// 画直方图
for (int i = 0; i < hdims; i++)
{
CvPoint p0 = cvPoint(i*bin_w, histimg->height);
int val = cvGetReal1D(hist->bins, i);
CvPoint p1 = cvPoint((i + 1)*bin_w, histimg->height - cvGetReal1D(hist->bins, i)*bin_u);
cvRectangle(histimg, p0, p1, cvScalar(0, 255), 1, 8, 0);
}
//画纵坐标刻度(像素个数)
int kedu = 0;
for (int i = 1; kedu < max; i++)
{
kedu = i * max / 10;
_itoa_s(kedu, string, 10);//把一个整数转换为字符串
//在图像中显示文本字符串
cvPutText(histimg, string, cvPoint(0, histimg->height - kedu * bin_u), &font, CV_RGB(0, 255, 255));
}
//画横坐标刻度(像素灰度值)
kedu = 0;
for (int i = 1; kedu < 256; i++)
{
kedu = i * 20;
_itoa_s(kedu, string, 10);//把一个整数转换为字符串
//在图像中显示文本字符串
cvPutText(histimg, string, cvPoint(kedu*(histimg->width / 256), histimg->height), &font, CV_RGB(255, 0, 0));
}
cvShowImage("Histogram", histimg);
}
}
//指针的指针,*p为指针,**p为一个指向*p指针的指针,**p中存放的是*p的地址*p中存的是p的地址
int main(int argc, char** argv)
{
argc = 2;
//argv[1] = "D:\\opencv\\sources\\samples\\data\\lena.jpg";
if (argc != 2 || (src = cvLoadImage("D:\\opencv\\sources\\samples\\data\\lena.jpg", 0)) == NULL) // force to gray image
return -1;
cvNamedWindow("src", 1);
cvShowImage("src", src);
cvNamedWindow("Histogram", 1);
cvCreateTrackbar("hdims", "src", &hdims, 256, HIST);
HIST(0);
cvWaitKey(0);
/*cvDestroyWindow("src");
cvDestroyWindow("Histogram");
cvReleaseImage(&src);
cvReleaseImage(&histimg);
cvReleaseHist(&hist);*/
return 0;
}