灰度直方图及处理“cvQueryHistValue_1D”: 找不到标识符”的问题(上)

来源:互联网 发布:oppo官方软件商店 编辑:程序博客网 时间:2024/04/30 08:22
[cpp] view plaincopyprint?
  1. // HIstogram.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "opencv2/opencv.hpp"  
  6. #define cvQueryHistValue_1D( hist, idx0 ) \  
  7.     ((float)cvGetReal1D( (hist)->bins, (idx0)))  
  8.   
  9. int main()  
  10. {  
  11.     IplImage* src= cvLoadImage("F:\\Opencv_picture\\05.jpg");  
  12.     IplImage* gray_dst= cvCreateImage(cvGetSize(src), 8, 1);  
  13.     cvCvtColor(src, gray_dst, CV_BGR2GRAY);  
  14.   
  15.     //一维维数  
  16.     int dims= 1;  
  17.     //直方图的尺寸  
  18.     int size= 256;  
  19.     //直方图的高度  
  20.     int height = 256;  
  21.     //灰度图的范围0到255  
  22.     float range[]= {0, 256};  
  23.     float *ranges[]= {range};   
  24.       
  25.     //创建一维直方图  
  26.     CvHistogram* hist;  
  27.     hist= cvCreateHist(dims, &size, CV_HIST_ARRAY, ranges, 1);        
  28.   
  29.     //计算灰度图的一维直方图  
  30.     cvCalcHist(&gray_dst, hist, 0, 0);  
  31.     //归一化直方图  
  32.     cvNormalizeHist(hist, 1.0);  
  33.   
  34.     int scale= 2;  
  35.     //创建图像,用于显示直方图  
  36.     IplImage* hist_img= cvCreateImage(cvSize(size* scale, height), 8, 3);  
  37.     //图像置零  
  38.      cvZero(hist_img);  
  39.   
  40.      //计算直方图的最大方块值,初始化为0  
  41.      float max_value= 0;  
  42.      cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0);  
  43.   
  44.      //绘制直方图  
  45.      for(int i=0; i<size; i++)  
  46.      {  
  47.          float bin_val= cvQueryHistValue_1D(hist, i);   //像素i的概率  
  48.          int intensity = cvRound(bin_val* height/ max_value);  // 绘制的高度  
  49.          cvRectangle(hist_img,  
  50.                             cvPoint(i* scale, height- 1),  
  51.                             cvPoint((i+1)* scale- 1, height- intensity),  
  52.                             CV_RGB(255, 255, 255));  
  53.      }  
  54.   
  55.      cvNamedWindow("gray");  
  56.      cvShowImage("gray", gray_dst);  
  57.      cvNamedWindow("Histogram");  
  58.      cvShowImage("Histogram", hist_img);  
  59.   
  60.      cvWaitKey(0);  
  61.   
  62.      cvReleaseImage(&src);  
  63.      cvReleaseImage(&gray_dst);  
  64.      cvReleaseImage(&hist_img);  
  65.   
  66.      cvDestroyWindow("gray");  
  67.      cvDestroyWindow("Histogram");  
  68. }  

看了小魏的修行路写的灰度直方图后写的,但我写的程序中出现f:\编程杂物区\histogram\histogram\histogram.cpp(45) : error C3861: “cvQueryHistValue_1D”: 找不到标识符的错误。经过搜索在程序中添加了

[cpp] view plaincopyprint?
  1. #define cvQueryHistValue_1D( hist, idx0 ) \  
  2.     ((float)cvGetReal1D( (hist)->bins, (idx0)))  
程序就不报错了。


但是一样的程序(没有添加程序)在VC++6.0+opencv1.0上就不会出现报错的问题

[cpp] view plaincopyprint?
  1. // HIstogram.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "cv.h"  
  6. #include "highgui.h"  
  7.   
  8. int main()  
  9. {  
  10.     IplImage* src= cvLoadImage("F:\\Opencv_picture\\05.jpg");  
  11.     IplImage* gray_dst= cvCreateImage(cvGetSize(src), 8, 1);  
  12.     cvCvtColor(src, gray_dst, CV_BGR2GRAY);  
  13.   
  14.     //一维维数  
  15.     int dims= 1;  
  16.     //直方图的尺寸  
  17.     int size= 256;  
  18.     //直方图的高度  
  19.     int height = 256;  
  20.     //灰度图的范围0到255  
  21.     float range[]= {0, 256};  
  22.     float *ranges[]= {range};   
  23.       
  24.     //创建一维直方图  
  25.     CvHistogram* hist;  
  26.     hist= cvCreateHist(dims, &size, CV_HIST_ARRAY, ranges, 1);        
  27.   
  28.     //计算灰度图的一维直方图  
  29.     cvCalcHist(&gray_dst, hist, 0, 0);  
  30.     //归一化直方图  
  31.     cvNormalizeHist(hist, 1.0);  
  32.   
  33.     int scale= 2;  
  34.     //创建图像,用于显示直方图  
  35.     IplImage* hist_img= cvCreateImage(cvSize(size* scale, height), 8, 3);  
  36.     //图像置零  
  37.      cvZero(hist_img);  
  38.   
  39.      //计算直方图的最大方块值,初始化为0  
  40.      float max_value= 0;  
  41.      cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0);  
  42.   
  43.      //绘制直方图  
  44.      for(int i=0; i<size; i++)  
  45.      {  
  46.          float bin_val= cvQueryHistValue_1D(hist,i);   //像素i的概率  
  47.          int intensity = cvRound(bin_val* height/ max_value);  // 绘制的高度  
  48.          cvRectangle(hist_img,  
  49.                             cvPoint(i* scale, height- 1),  
  50.                             cvPoint((i+1)* scale- 1, height- intensity),  
  51.                             CV_RGB(255, 255, 255));  
  52.      }  
  53.   
  54.      cvNamedWindow("gray");  
  55.      cvShowImage("gray", gray_dst);  
  56.      cvNamedWindow("Histogram");  
  57.      cvShowImage("Histogram", hist_img);  
  58.   
  59.      cvWaitKey(0);  
  60.   
  61.      cvReleaseImage(&src);  
  62.      cvReleaseImage(&gray_dst);  
  63.      cvReleaseImage(&hist_img);  
  64.   
  65.      cvDestroyWindow("gray");  
  66.      cvDestroyWindow("Histogram");  
  67.   
  68.      return 0;  
  69. }  


结果图:

0 0
原创粉丝点击