1. 程式人生 > >灰度直方圖及處理“cvQueryHistValue_1D”: 找不到識別符號”的問題(上)

灰度直方圖及處理“cvQueryHistValue_1D”: 找不到識別符號”的問題(上)

// HIstogram.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include "opencv2/opencv.hpp"
#define cvQueryHistValue_1D( hist, idx0 ) \
    ((float)cvGetReal1D( (hist)->bins, (idx0)))

int main()
{
	IplImage* src= cvLoadImage("F:\\Opencv_picture\\05.jpg");
	IplImage* gray_dst= cvCreateImage(cvGetSize(src), 8, 1);
	cvCvtColor(src, gray_dst, CV_BGR2GRAY);

	//一維維數
    int dims= 1;
	//直方圖的尺寸
	int size= 256;
	//直方圖的高度
	int height = 256;
	//灰度圖的範圍0到255
	float range[]= {0, 256};
	float *ranges[]= {range}; 
    
	//建立一維直方圖
	CvHistogram* hist;
	hist= cvCreateHist(dims, &size, CV_HIST_ARRAY, ranges, 1);      

	//計算灰度圖的一維直方圖
	cvCalcHist(&gray_dst, hist, 0, 0);
    //歸一化直方圖
	cvNormalizeHist(hist, 1.0);

	int scale= 2;
	//建立影象,用於顯示直方圖
	IplImage* hist_img= cvCreateImage(cvSize(size* scale, height), 8, 3);
	//影象置零
     cvZero(hist_img);

	 //計算直方圖的最大方塊值,初始化為0
	 float max_value= 0;
	 cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0);

	 //繪製直方圖
     for(int i=0; i<size; i++)
	 {
	     float bin_val= cvQueryHistValue_1D(hist, i);   //畫素i的概率
		 int intensity = cvRound(bin_val* height/ max_value);  // 繪製的高度
		 cvRectangle(hist_img,
			                cvPoint(i* scale, height- 1),
		                    cvPoint((i+1)* scale- 1, height- intensity),
							CV_RGB(255, 255, 255));
	 }

	 cvNamedWindow("gray");
	 cvShowImage("gray", gray_dst);
	 cvNamedWindow("Histogram");
     cvShowImage("Histogram", hist_img);

	 cvWaitKey(0);

	 cvReleaseImage(&src);
	 cvReleaseImage(&gray_dst);
	 cvReleaseImage(&hist_img);

	 cvDestroyWindow("gray");
	 cvDestroyWindow("Histogram");
}

看了小魏的修行路寫的灰度直方圖後寫的,但我寫的程式中出現f:\程式設計雜物區\histogram\histogram\histogram.cpp(45) : error C3861: “cvQueryHistValue_1D”: 找不到識別符號的錯誤。經過搜尋在程式中添加了

#define cvQueryHistValue_1D( hist, idx0 ) \
    ((float)cvGetReal1D( (hist)->bins, (idx0)))
程式就不報錯了。

但是一樣的程式(沒有新增程式)在VC++6.0+opencv1.0上就不會出現報錯的問題

// HIstogram.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int main()
{
	IplImage* src= cvLoadImage("F:\\Opencv_picture\\05.jpg");
	IplImage* gray_dst= cvCreateImage(cvGetSize(src), 8, 1);
	cvCvtColor(src, gray_dst, CV_BGR2GRAY);

	//一維維數
    int dims= 1;
	//直方圖的尺寸
	int size= 256;
	//直方圖的高度
	int height = 256;
	//灰度圖的範圍0到255
	float range[]= {0, 256};
	float *ranges[]= {range}; 
    
	//建立一維直方圖
	CvHistogram* hist;
	hist= cvCreateHist(dims, &size, CV_HIST_ARRAY, ranges, 1);      

	//計算灰度圖的一維直方圖
	cvCalcHist(&gray_dst, hist, 0, 0);
    //歸一化直方圖
	cvNormalizeHist(hist, 1.0);

	int scale= 2;
	//建立影象,用於顯示直方圖
	IplImage* hist_img= cvCreateImage(cvSize(size* scale, height), 8, 3);
	//影象置零
     cvZero(hist_img);

	 //計算直方圖的最大方塊值,初始化為0
	 float max_value= 0;
	 cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0);

	 //繪製直方圖
     for(int i=0; i<size; i++)
	 {
	     float bin_val= cvQueryHistValue_1D(hist,i);   //畫素i的概率
		 int intensity = cvRound(bin_val* height/ max_value);  // 繪製的高度
		 cvRectangle(hist_img,
			                cvPoint(i* scale, height- 1),
		                    cvPoint((i+1)* scale- 1, height- intensity),
							CV_RGB(255, 255, 255));
	 }

	 cvNamedWindow("gray");
	 cvShowImage("gray", gray_dst);
	 cvNamedWindow("Histogram");
     cvShowImage("Histogram", hist_img);

	 cvWaitKey(0);

	 cvReleaseImage(&src);
	 cvReleaseImage(&gray_dst);
	 cvReleaseImage(&hist_img);

	 cvDestroyWindow("gray");
	 cvDestroyWindow("Histogram");

	 return 0;
}


結果圖: