2013-07-28 70 views
0

我在生成直方图时遇到了问题。我有一组数据,我想要计算并存储在一个文件中,以便在excel中创建图表,就像图像直方图一样。生成直方图

这是我的代码,但我得到的数据总数是正确的,但不是频率多少。我已经将直方图的宽度设置为0.01,仅在稍后进行测试,我必须对其进行改进。

void TPictureWindow::Histogramm() 
{ 
    unsigned long retval; 
    char buffer[100]; 

    int valueHist[260]; 
    int finalVal; 
    double value = 0.0; 
    double histWidth = 0.01; 
    int counter = 0; 
    scaling = 0.005078125; 

    HANDLE hDataFile = CreateFile("Histogramm.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

    for(int i = 0; i < NumImages; i++) 
    { 

    for(int j = 0; j < edge[i][0]->total; j++) 
    { 
     for(int k = 0;k < sizeof(valueHist);k++){ 

      CvPoint* pt1 = CV_GET_SEQ_ELEM(CvPoint, edge[i][0], j); 
      CvPoint* pt2 = CV_GET_SEQ_ELEM(CvPoint, edge[i][1], j); 

      value = (pt1->y-pt2->y)*scaling; 

      if(value < 0) value = 0.0; 

      finalVal = value/histWidth; 
     //sprintf(buffer, "final: %d\nvalue: %f\n", finalVal, value); 
     //MessageBox(buffer, "", MB_OK); 



      if(finalVal == k){ 

       counter++; 
       valueHist[k] = counter; 
       sprintf(buffer, "%9.3d\n", valueHist[k]); 
       WriteFile(hDataFile, buffer, strlen(buffer), &retval, NULL); 
      } 
     } 
    } 


} 
CloseHandle(hDataFile); 
PostMessage(READY_WITH, IMG_3D_PROFILE, 0); 
} 

回答

0

使用该值来计算它的bin而不是搜索bin应该既简单又快捷。

for(int i = 0; i < NumImages; i++) { 
    for(int j = 0; j < edge[i][0]->total; j++) { 
     CvPoint* pt1 = CV_GET_SEQ_ELEM(CvPoint, edge[i][0], j); 
     CvPoint* pt2 = CV_GET_SEQ_ELEM(CvPoint, edge[i][1], j); 
     int bin 

     value = (pt1->y-pt2->y)*scaling; 

     if(value < 0) value = 0.0; 

     int bin = floor(value/binSize); 

     if (bin < maxBin) { 
      hist[bin] = hist[bin] + 1; 
     } else { 
     /* Report a lost point if interested */ 
     } 
    } 
} 

你将失去​​点,如果maxBin * binSize <最大(值)。