예제 #1
0
void YARPDispMap::getDisparity(	unsigned char * img1, 
								unsigned char * img2,
								unsigned char * disparity)
{
	unsigned char * DSet1 = (unsigned char*) _DataSet1.GetRawBuffer();
	unsigned char * DSet2 = (unsigned char*) _DataSet2.GetRawBuffer();

//	unsigned char * image1 = (unsigned char*) img1.GetRawBuffer();
//	unsigned char * image2 = (unsigned char*) img2.GetRawBuffer();

//	int * dispOffset;
//	int * tmpDisparity;

	int imgOffset;
	node * graph;

	int top, bottom;

	int totNodes= 0; 
	int totArcs = 0;

	int length;


	int graphSize;

	int i,j,k,n,m;
	
	getImageSet(img1, DSet1);
	getImageSet(img2, DSet2);

	int levels = (int)(0.5+log(_xSize)/log(2.0));
	
	unsigned char * data1;
	unsigned char * data2;
	
	for (j=0; j<_totSize; j++)
	{
		_dispOffset[j] = 0;
		_tmpDisp[j] = INT_MAX;
	}

	bool found; 

	for (length = _xSize/8; length<=_xSize; length*=2)
	{
		graphSize = length*_deltaDisp+2;

		//Graph Allocation
			graph = new node [graphSize];
			graph[0].foll_nodes = new int   [4*graphSize*(_deltaDisp+2)];
			graph[0].arcweight  = new float [4*graphSize*(_deltaDisp+2)];
		//End Allocation

		memset(disparity,255,length*length);

		imgOffset = _totSize-(4*length*length-1)/3;

		data1 = DSet1 + imgOffset;
		data2 = DSet2 + imgOffset;

		top = 0;
		bottom = length-1;

		found = false;

		for (j=1; j<length; j++)
			for (i=1; i<length; i++)
			{
				if(data1[j*length+i]!=0)
				{
					top = j;
					j = length;
					found = true;
					break;
				}
			}

		if (!found)
		{
			delete [] graph[0].foll_nodes;
			delete [] graph[0].arcweight;
			delete [] graph;
//			delete [] dispOffset;
//			delete [] tmpDisparity;
//			delete [] leftDataSet;
///			delete [] rightDataSet;
//			delete [] Sobel;
			return;
		}

		for (j=top; j<length; j++)
			for (i=1; i<length; i++)
			{
				if(data2[j*length+i]!=0)
				{
					top = j;
					j = length;
					break;
				}
			}

		for (j=length-1; j>=top; j--)
			for (i=length-1; i>=0; i--)
			{
				if(data1[j*length+i]!=0)
				{
					bottom = j;
					j = 0;
					break;
				}
			}

		for (j=bottom; j>=top; j--)
			for (i=length-1; i>=0; i--)
			{
				if(data2[j*length+i]!=0)
				{
					bottom = j;
					j = 0;
					break;
				}
			}

		for (j=1; j<length-1; j++)
			for (i=1; i<length-1; i++)
			{
				_sobel[j*length+i]  = data1[(j-1)*length+(i-1)]+2*data1[(j-1)*length+(i)]+data1[(j-1)*length+(i+1)];
				_sobel[j*length+i] += -data1[(j+1)*length+(i-1)]-2*data1[(j+1)*length+(i)]-data1[(j+1)*length+(i+1)];
			}

		int ls,le;
		int rs,re;

		for (j=top; j<=bottom; j++)
		{
			data1 = DSet1 + imgOffset + j*length;
			data2 = DSet2 + imgOffset + j*length;

			ls = 0;
			le = length-1;
			rs = 0;
			re = length-1;

			for (i=0;i<length; i++)
			{
				if (data1[i] != 0)
				{
					ls = i;
					for (m=length-1;m>=0; m--)
						if(data1[m] != 0)
						{
							le = m;
							break;
						}
					break;
				}
			}

			for (i=0;i<length; i++)
			{
				if (data2[i] != 0)
				{
					rs = i;
					for (m=length-1;m>=0; m--)
						if(data2[m] != 0)
						{
							re = m;
							break;
						}
					break;
				}
			}

			int maxR = 0;
			int minR = length;
			int position;

			for (i=ls; i<=le; i++)
			{
				position = -(*(_dispOffset+imgOffset+j*length+i));
				position +=i;
				if (position+_maxDisp>maxR)
					maxR = position+_maxDisp;
				if (position+_minDisp<minR)
					minR = position+_minDisp;
			}

			buildGraph2D(graph, le-ls+1,maxR-minR+1,ls,minR, _dispOffset+imgOffset+j*length, &totNodes, &totArcs);

			if ((j==0)||(j==length-1))
				assignWeights(graph,length,data1,data2,_sobel, _tmpDisp, -1.0f, totArcs, totNodes);
			else
				assignWeights(graph,length,data1,data2,&_sobel[(j)*length], &_tmpDisp[imgOffset+(j-1)*length], _alpha, totArcs, totNodes) ;


			dynProgr(totNodes, graph);

			i = totNodes-1;
				//printf("Line: %d. Vertical Disparity: %d. Cost: %f\n",j,l,graph[i].pathweight);

//				if (graph[i].pathweight < cost)
//				{
//					cost = graph[i].pathweight;
//					vd = l;
//				}

			memset (&_tmpDisp[imgOffset+j*length],0, length*sizeof(int));

			for (k=0; k<=4*length; k++)
			{
				n = graph[i].prevNode;
				if (k!=0)
				{
					_tmpDisp[imgOffset+j*length+graph[i].left]= graph[i].left-graph[i].right;
//					if (j==length-2)
//						printf("Length: %d, Disparity=%d\n",length,tmpDisparity[imgOffset+j*length+graph[i].left]);

					disparity[j*length+graph[i].left] = (4*(graph[i].left-graph[i].right)+128);
					m = graph[i].left;
				}
				i=n;
				if((i<=0)||(i>totNodes-1))
					break;
			}//end k for

//			printf("Line: %d. Vertical Disparity: %d. Cost: %f\n",j,vd,cost);

			int a,b;

			//Process discontinuities in tmpDisparity
			if (disparity[j*length]==255) //Occlusion in zero//e se sono tutti zero???
			{
				for (k=0; k<length; k++)
				{
					if (disparity[j*length+k]!= 255)
						break;
				}
				if(k<length)
					for (m=0; m<k; m++)
						_tmpDisp[imgOffset+j*length+m]=_tmpDisp[imgOffset+j*length+k];
			}
			else if (disparity[j*length+length-1]==255)
			{
				for (k=length-1; k>=0; k--)
				{
					if (disparity[j*length+k]!= 255)
						break;
				}
				for (m=k+1; m<length; m++)
					_tmpDisp[imgOffset+j*length+m]=_tmpDisp[imgOffset+j*length+k];
			}
			else
			{
				for (k=0; k<length; k++)
				{
					if (disparity[j*length+k]== 255)
					{
						for (m=k; m<length; m++)
						{
							if (disparity[j*length+m]!= 255)
							{
								for (n=k; n<m; n++)
								{
									a = m-k+1;
									b = _tmpDisp[imgOffset+j*length+m]-_tmpDisp[imgOffset+j*length+k-1];
									if (((n-k+1)*b/a)+_tmpDisp[imgOffset+j*length+k-1]>0)
										_tmpDisp[imgOffset+j*length+n] = (int)( ((n-k+1)*b/a)+_tmpDisp[imgOffset+j*length+k-1]+0.5f);
									else
										_tmpDisp[imgOffset+j*length+n] = (int)( ((n-k+1)*b/a)+_tmpDisp[imgOffset+j*length+k-1]-0.5f);
								}
								m=length;
							}
						}
						k=n;
					}
				}
			}//endif

			if (length<_xSize)
			{
				for (k=0; k<length; k++)
				{
					if (_tmpDisp[imgOffset+j*length+k]!=INT_MAX)
					{
						_dispOffset[imgOffset-4*length*length+2*j*2*length+2*k] = 2*_tmpDisp[imgOffset+j*length+k];
						_dispOffset[imgOffset-4*length*length+2*j*2*length+2*k+1] = 2*_tmpDisp[imgOffset+j*length+k];
						_dispOffset[imgOffset-4*length*length+(2*j+1)*2*length+2*k] = 2*_tmpDisp[imgOffset+j*length+k];
						_dispOffset[imgOffset-4*length*length+(2*j+1)*2*length+2*k+1] = 2*_tmpDisp[imgOffset+j*length+k];
					}
				}
			}//endif
		}//endj
			
		

//		sprintf(File_Name,"%s%d%s","C:/Users/Fabio/Projects/DinamicDisparity/Images/_dpoutput",length,".bmp");
//		Save_Bitmap(dispImg,length,length,1,File_Name);

//		endTime = Get_Time();
//		printf("Time Elapsed: %d msec\n", endTime-startTime);
		//Graph Deallocation
			
		delete [] graph[0].foll_nodes;
		delete [] graph[0].arcweight;
		delete [] graph;
		
		//End Deallocation
	}
	
//	delete []  dispOffset;
//	delete [] tmpDisparity;
//	delete []  leftDataSet;
//	delete [] rightDataSet;
//	delete [] Sobel;

	//Disparity Inversion
/*
	unsigned char * invDisp;
//	invDisp = new unsigned char [xSize*ySize];
	memset(invDisp,255,xSize*ySize);

	for (j=0; j<ySize; j++)
		for (i=0; i<xSize; i++)
		{
			if (dispImg[j*xSize+i]!=255)
			k = (dispImg[j*xSize+i]-128)/8;
			
			if( ((i-k)>=0)&&((i-k)<xSize) )
				invDisp[j*xSize+(i-k)] = (-k*8)+128;
		}
						
	sprintf(File_Name,"%s%d%s","C:/Users/Fabio/Projects/DinamicDisparity/Images/_dpoutput_inv",xSize,".bmp");
	Save_Bitmap(invDisp,xSize,xSize,1,File_Name);
*/
//	endTime = Get_Time();

//	printf("Line : %d, Time Elapsed: %d msec\n",j, endTime-startTime);

}
예제 #2
0
ParticleEmitter::ParticleEmitter(const XmlNodePtrConst emitterNode,
                                 Particle *const target,
                                 Map *const map, const int rotation,
                                 const std::string& dyePalettes) :
    mParticleTarget(target),
    mMap(map),
    mParticleImage(nullptr),
    mOutputPauseLeft(0),
    mDeathEffectConditions(0),
    mParticleFollow(false)
{
    // Initializing default values
    mParticlePosX.set(0.0F);
    mParticlePosY.set(0.0F);
    mParticlePosZ.set(0.0F);
    mParticleAngleHorizontal.set(0.0F);
    mParticleAngleVertical.set(0.0F);
    mParticlePower.set(0.0F);
    mParticleGravity.set(0.0F);
    mParticleRandomness.set(0);
    mParticleBounce.set(0.0F);
    mParticleAcceleration.set(0.0F);
    mParticleDieDistance.set(-1.0F);
    mParticleMomentum.set(1.0F);
    mParticleLifetime.set(-1);
    mParticleFadeOut.set(0);
    mParticleFadeIn.set(0);
    mOutput.set(1);
    mOutputPause.set(0);
    mParticleAlpha.set(1.0F);

    for_each_xml_child_node(propertyNode, emitterNode)
    {
        if (xmlNameEqual(propertyNode, "property"))
        {
            const std::string name = XML::getProperty(
                propertyNode, "name", "");

            if (name == "position-x")
            {
                mParticlePosX = readParticleEmitterProp(propertyNode, 0.0F);
            }
            else if (name == "position-y")
            {
                mParticlePosY = readParticleEmitterProp(propertyNode, 0.0F);
                mParticlePosY.minVal *= SIN45;
                mParticlePosY.maxVal *= SIN45;
                mParticlePosY.changeAmplitude *= SIN45;
            }
            else if (name == "position-z")
            {
                mParticlePosZ = readParticleEmitterProp(propertyNode, 0.0F);
                mParticlePosZ.minVal *= SIN45;
                mParticlePosZ.maxVal *= SIN45;
                mParticlePosZ.changeAmplitude *= SIN45;
            }
            else if (name == "image")
            {
                std::string image = XML::getProperty(
                    propertyNode, "value", "");
                // Don't leak when multiple images are defined
                if (!image.empty() && !mParticleImage)
                {
                    if (!dyePalettes.empty())
                        Dye::instantiate(image, dyePalettes);

                    ResourceManager *const resman
                        = ResourceManager::getInstance();
                    mParticleImage = resman->getImage(image);
                }
            }
            else if (name == "subimage")
            {
                std::string image = XML::getProperty(
                    propertyNode, "value", "");
                // Don't leak when multiple images are defined
                if (!image.empty() && !mParticleImage)
                {
                    if (!dyePalettes.empty())
                        Dye::instantiate(image, dyePalettes);

                    ResourceManager *const resman
                        = ResourceManager::getInstance();
                    Image *img = resman->getImage(image);
                    if (img)
                    {
                        mParticleImage = resman->getSubImage(img,
                            XML::getProperty(propertyNode, "x", 0),
                            XML::getProperty(propertyNode, "y", 0),
                            XML::getProperty(propertyNode, "width", 0),
                            XML::getProperty(propertyNode, "height", 0));
                        img->decRef();
                    }
                    else
                    {
                        mParticleImage = nullptr;
                    }
                }
            }
            else if (name == "horizontal-angle")
            {
                mParticleAngleHorizontal =
                    readParticleEmitterProp(propertyNode, 0.0F);
                mParticleAngleHorizontal.minVal
                    += static_cast<float>(rotation);
                mParticleAngleHorizontal.minVal *= DEG_RAD_FACTOR;
                mParticleAngleHorizontal.maxVal
                    += static_cast<float>(rotation);
                mParticleAngleHorizontal.maxVal *= DEG_RAD_FACTOR;
                mParticleAngleHorizontal.changeAmplitude *= DEG_RAD_FACTOR;
            }
            else if (name == "vertical-angle")
            {
                mParticleAngleVertical =
                    readParticleEmitterProp(propertyNode, 0.0F);
                mParticleAngleVertical.minVal *= DEG_RAD_FACTOR;
                mParticleAngleVertical.maxVal *= DEG_RAD_FACTOR;
                mParticleAngleVertical.changeAmplitude *= DEG_RAD_FACTOR;
            }
            else if (name == "power")
            {
                mParticlePower = readParticleEmitterProp(propertyNode, 0.0F);
            }
            else if (name == "gravity")
            {
                mParticleGravity = readParticleEmitterProp(propertyNode, 0.0F);
            }
            else if (name == "randomnes"
                     || name == "randomness")  // legacy bug
            {
                mParticleRandomness = readParticleEmitterProp(propertyNode, 0);
            }
            else if (name == "bounce")
            {
                mParticleBounce = readParticleEmitterProp(propertyNode, 0.0F);
            }
            else if (name == "lifetime")
            {
                mParticleLifetime = readParticleEmitterProp(propertyNode, 0);
                mParticleLifetime.minVal += 1;
            }
            else if (name == "output")
            {
                mOutput = readParticleEmitterProp(propertyNode, 0);
                mOutput.maxVal += 1;
            }
            else if (name == "output-pause")
            {
                mOutputPause = readParticleEmitterProp(propertyNode, 0);
                mOutputPauseLeft = mOutputPause.value(0);
            }
            else if (name == "acceleration")
            {
                mParticleAcceleration = readParticleEmitterProp(
                    propertyNode, 0.0F);
            }
            else if (name == "die-distance")
            {
                mParticleDieDistance = readParticleEmitterProp(
                    propertyNode, 0.0F);
            }
            else if (name == "momentum")
            {
                mParticleMomentum = readParticleEmitterProp(
                    propertyNode, 1.0F);
            }
            else if (name == "fade-out")
            {
                mParticleFadeOut = readParticleEmitterProp(propertyNode, 0);
            }
            else if (name == "fade-in")
            {
                mParticleFadeIn = readParticleEmitterProp(propertyNode, 0);
            }
            else if (name == "alpha")
            {
                mParticleAlpha = readParticleEmitterProp(propertyNode, 1.0F);
            }
            else if (name == "follow-parent")
            {
                const std::string value = XML::getProperty(propertyNode,
                    "value", "0");
                if (value == "1" || value == "true")
                    mParticleFollow = true;
            }
            else
            {
                logger->log("Particle Engine: Warning, "
                            "unknown emitter property \"%s\"",
                            name.c_str());
            }
        }
        else if (xmlNameEqual(propertyNode, "emitter"))
        {
            ParticleEmitter newEmitter(propertyNode, mParticleTarget, map,
                                       rotation, dyePalettes);
            mParticleChildEmitters.push_back(newEmitter);
        }
        else if (xmlNameEqual(propertyNode, "rotation")
                 || xmlNameEqual(propertyNode, "animation"))
        {
            ImageSet *const imageset = getImageSet(propertyNode);
            if (!imageset)
            {
                logger->log1("Error: no valid imageset");
                continue;
            }
            mTempSets.push_back(imageset);

            Animation &animation = (xmlNameEqual(propertyNode, "rotation")) ?
                mParticleRotation : mParticleAnimation;

            // Get animation frames
            for_each_xml_child_node(frameNode, propertyNode)
            {
                const int delay = XML::getIntProperty(
                    frameNode, "delay", 0, 0, 100000);
                const int offsetX = XML::getProperty(frameNode, "offsetX", 0)
                    - imageset->getWidth() / 2 + mapTileSize / 2;
                const int offsetY = XML::getProperty(frameNode, "offsetY", 0)
                    - imageset->getHeight() + mapTileSize;
                const int rand = XML::getIntProperty(
                    frameNode, "rand", 100, 0, 100);

                if (xmlNameEqual(frameNode, "frame"))
                {
                    const int index = XML::getProperty(frameNode, "index", -1);

                    if (index < 0)
                    {
                        logger->log1("No valid value for 'index'");
                        continue;
                    }

                    Image *const img = imageset->get(index);

                    if (!img)
                    {
                        logger->log("No image at index %d", index);
                        continue;
                    }

                    animation.addFrame(img, delay,
                        offsetX, offsetY, rand);
                }
                else if (xmlNameEqual(frameNode, "sequence"))
                {
                    int start = XML::getProperty(frameNode, "start", -1);
                    const int end = XML::getProperty(frameNode, "end", -1);

                    if (start < 0 || end < 0)
                    {
                        logger->log1("No valid value for 'start' or 'end'");
                        continue;
                    }

                    while (end >= start)
                    {
                        Image *const img = imageset->get(start);
                        if (!img)
                        {
                            logger->log("No image at index %d", start);
                            continue;
                        }

                        animation.addFrame(img, delay,
                            offsetX, offsetY, rand);
                        start ++;
                    }
                }
                else if (xmlNameEqual(frameNode, "end"))
                {
                    animation.addTerminator(rand);
                }
            }  // for frameNode
        }
        else if (xmlNameEqual(propertyNode, "deatheffect"))