void ObjectEdgeDetectorCPU::applyAngleImageCalculation() { DataSegment<float,4> norm; if (m_data->params.useNormalAveraging == true) { norm = m_data->avgNormals; } else { norm = m_data->normals; } const int w = m_data->w, h = m_data->h; core::Channel32f angleI = m_data->angleImage[0]; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { int i = x + w * y; if (y < m_data->params.neighborhoodRange || y >= h - (m_data->params.neighborhoodRange) || x < m_data->params.neighborhoodRange || x >= w - (m_data->params.neighborhoodRange)) { angleI(x, y) = 0; } else { float snr = 0; //sum right float snl = 0; //sum left float snt = 0; //sum top float snb = 0; //sum bottom float sntr = 0; //sum top-right float sntl = 0; //sum top-left float snbr = 0; //sum bottom-right float snbl = 0; //sum bottom-left for (int z = 1; z <= m_data->params.neighborhoodRange; z++) { //angle between normals //flip if angle is bigger than 90° snr += scalarAndFlip(norm[i],norm[i + z]); snl += scalarAndFlip(norm[i],norm[i - z]); snt += scalarAndFlip(norm[i],norm[i + w * z]); snb += scalarAndFlip(norm[i],norm[i - w * z]); sntr += scalarAndFlip(norm[i],norm[i + w * z + z]); sntl += scalarAndFlip(norm[i],norm[i + w * z - z]); snbr += scalarAndFlip(norm[i],norm[i - w * z + z]); snbl += scalarAndFlip(norm[i],norm[i - w * z - z]); } snr /= m_data->params.neighborhoodRange; snl /= m_data->params.neighborhoodRange; snt /= m_data->params.neighborhoodRange; snb /= m_data->params.neighborhoodRange; sntr /= m_data->params.neighborhoodRange; sntl /= m_data->params.neighborhoodRange; snbr /= m_data->params.neighborhoodRange; snbl /= m_data->params.neighborhoodRange; if (m_data->params.neighborhoodMode == 0) {//max angleI(x, y) = maxAngle(snr, snl, snt, snb, snbl, snbr, sntl, sntr); } else if (m_data->params.neighborhoodMode == 1) {//mean angleI(x, y) = (snr + snl + snt + snb + sntr + sntl + snbr + snbl) / 8; } else { } } } } }
/* * findTilt() : Angle of tilt calculated with distance * from corners (max/min_x/y) * * findDirection() : Direction of tilt calculated with * distance from side mid points (max/min_x/y, center_x/y) * * min_x, min_y center_x,min_y max_x, min_y * +---#-----+---------+ * | | | * | x2,y2 | x1,y1 # * | | | * min_x,center_y +---------+---------+ max_x,center_y * | | | * # x3,y3 | x4,y4 | * | | | * +---------+-----#---+ * min_x, max_y center_x,max_y max_x, max_y * * * # - tilted anchor corner points ( x1/2/3/4, y1/2/3/4 ) * */ int Shape::findTilt() { int x1 = center_x, y1 = center_y, p1 = grid_w * grid_h; int x2 = center_x, y2 = center_y, p2 = grid_w * grid_h; int x3 = center_x, y3 = center_y, p3 = grid_w * grid_h; int x4 = center_x, y4 = center_y, p4 = grid_w * grid_h; int angle = 0, a1=0, a2=0, a3=0, a4=0; int x=0, y=0, p=0; // p : roximity to corner int bbx = (max_x - min_x)/3, bby = (max_y - min_y)/3; //inner bounding box int direction = 1; if(debug){ cout << endl << "[W " ; int c = max_y-min_y; for(int i = 1; i < c/2; i++){ cout << widths_at_y[i] << "~" << widths_at_y[c-i] << " "; } cout << "W] " << endl; cout << endl << "[H " ; c = max_x-min_x; for(int i = 1; i < c/2; i++){ cout << heights_at_x[i] << "~" << heights_at_x[c-i] << " "; } cout << "H] " << endl; } /* * loop through all border pixels * only select pixels close to bounding box edge * (selected by outside inner bounding box) * for each quandrant measure disance from coner * closeset to corner for each quandrant is picked as * the anchor corner point */ int i = 0; while( i < mapcount ){ x = xmap[i]; y = ymap[i]; if( abs(x-center_x) > bbx || abs(y-center_y) > bby){//close to edge if( x > center_x && y <= center_y ){ //top right Q1 p = (max_x - x) + (y - min_y); if(p < p1){ p1 = p; x1 = x; y1 = y; } }else if( x <= center_x && y <= center_y ){ //top left Q2 p = (x - min_x) + (y - min_y); if(p < p2){ p2 = p; x2 = x; y2 = y; } }else if( x <= center_x && y > center_y ){ //bot left Q3 p = (x - min_x) + (max_y - y); if(p < p3){ p3 = p; x3 = x; y3 = y; } }else if( x > center_x && y > center_y ){ //bot right Q4 p = (max_x - x) + (max_y - y); if(p < p4){ p4 = p; x4 = x; y4 = y; } } } i++; } a1 = findAngle(x2, y2, x1, y1); a2 = findAngle(x1, y1, x4, y4); a3 = findAngle(x4, y4, x3, y3); a4 = findAngle(x3, y3, x2, y2); angle = isDiagonal(a1, a2, a3, a4) ? maxAngle(a1, a2, a3, a4) : (a1+a2+a3+a4)/4; if(angle != 45 ) direction = findDirection(x1, y1, x2, y2, x3, y3, x4, y4); angle*=direction; if(debug) cout << "[ " << angle << " | " << a1 << " " << a2 << " " << a3 << " " << a4 << " ]" << endl ; if( pixdebug ){ d_pixmap->clearPixmap(); d_markAnchor(); d_pixmap->setPen(0, 255, 0); d_pixmap->markPoint( x1, y1, 6); d_pixmap->setPen(0, 0, 255); d_pixmap->markPoint( x4, y4, 6); d_pixmap->setPen(0, 255, 255); d_pixmap->markPoint( x3, y3, 6); d_pixmap->setPen(0, 0, 0); d_pixmap->markPoint( x2, y2, 6); d_pixmap->writeImage("corners"); } return angle; }