3dpcp/include/shapes/integralimg.h

109 lines
2.6 KiB
C
Raw Permalink Normal View History

2012-09-16 12:33:11 +00:00
// =====================================================================================
//
// Filename: integralimg.cc
//
// Description:
//
// Version: 1.0
// Created: 09/20/2010 06:58:34 PM
// Revision: none
// Compiler: g++
//
// Author: Jan Elseberg (), jelseber@uos.de
// Company: Universitaet Osnabrueck
//
// =====================================================================================
//
#include <iostream>
using std::cout;
using std::cerr;
using std::endl;
#ifndef __INTEGRALIMG_H__
#define __INTEGRALIMG_H__
#define TBB 5
#define SBB 7
#define HEIGHT 26
//#define HEIGHT 40
#define WIDTH 30
const int black[4][2] = { {0,0}, {WIDTH+2*SBB,0}, {WIDTH+2*SBB,HEIGHT+TBB}, {0,HEIGHT+TBB}};
const int white[4][2] = { {SBB,TBB}, {WIDTH+SBB,TBB}, {WIDTH+SBB,HEIGHT+TBB}, {SBB,HEIGHT+TBB}};
/*const int black[4][2] = { {0,0}, {30+2*SBB,0}, {30+2*SBB,40+TBB}, {0,40+TBB}};
const int white[4][2] = { {SBB,TBB}, {30+SBB,TBB}, {30+SBB,40+TBB}, {SBB,40+TBB}};
*/
class integral_img {
public:
integral_img(int **_img, int x, int y) {
img = _img;
X = x;
Y = y;
for (int i = 1; i < X; i++) {
img[i][0] += img[i-1][0];
}
for (int j = 1; j < Y; j++) {
img[0][j] += img[0][j-1];
}
for (int i = 1; i < X; i++) {
for (int j = 1; j < Y; j++) {
img[i][j] += img[i-1][j] + img[i][j-1] - img[i-1][j-1];
}
}
}
int At(int x, int y) {
if (x < 0 || y < 0) {
return 0;
}
if (x >= X) x = X - 1;
if (y >= Y) y = Y - 1;
return img[x][y];
}
double getBest(int &x, int&y) {
int score;
int maxscore = 0;
int maxx = 0;
int maxy = 0;
for (int i = -SBB; i < X+SBB; i++) {
for (int j = -TBB; j < Y+TBB; j++) {
score = 2*getWhite(i,j) - getBlack(i,j);
// cout << i << " " << j << ": W " << getWhite(i,j)<< " B " << getBlack(i,j) << " SCORE " << score << endl;
if (score > maxscore) {
maxscore = score;
maxx = i;
maxy = j;
}
}
}
x = maxx + SBB;
y = maxy + TBB;
return (double)maxscore/(double)(HEIGHT*WIDTH);
}
inline int getWhite(int x, int y) {
return At(x + white[0][0], y + white[0][1]) + At(x + white[2][0], y + white[2][1]) -
At(x + white[1][0], y + white[1][1]) - At(x + white[3][0], y + white[3][1]);
}
inline int getBlack(int x, int y) {
return At(x + black[0][0], y + black[0][1]) + At(x + black[2][0], y + black[2][1]) -
At(x + black[1][0], y + black[1][1]) - At(x + black[3][0], y + black[3][1]);
}
int **img;
int X;
int Y;
};
#endif