У меня проблема с генерацией гистограммы. У меня есть набор данных, которые я хочу подсчитать и сохранить в файле, чтобы составить в 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);
}
Использовать значение для вычисления его корзины вместо того, чтобы искать корзину, должно быть и проще, и быстрее.
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 < макс (значение).
Других решений пока нет …