灰度直方圖及處理“cvQueryHistValue_1D”: 找不到識別符號”的問題(上)
阿新 • • 發佈:2019-02-12
// 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; }
結果圖: