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 {
				}
			}
		}
	}
}
Beispiel #2
0
/*
* 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;
}