void FillHoleShiftMap::ProcessNeighbor(CvPoint currentPoint, CvPoint neighborPoint,
									   IplImage* maskNeighbor, CvMat* mapping, GCoptimizationGeneralGraph* gcGeneral)
{
	CvScalar value =  cvGet2D(mapping, currentPoint.y, currentPoint.x);
	int nodeId1 = value.val[0];
	if(nodeId1 >= 0)
	{
		if(!IsOutside(currentPoint, cvSize(maskNeighbor->width, maskNeighbor->height)) &&
			!IsOutside(neighborPoint, cvSize(maskNeighbor->width, maskNeighbor->height)))
		{
			// printf("i: %i, j: %i\n", neighborPoint.x, neighborPoint.y);
			CvScalar value = cvGet2D(mapping, neighborPoint.y, neighborPoint.x);
			int nodeId2 = value.val[0];
			if(nodeId2 >= 0)
			{	
				gcGeneral->setNeighbors(nodeId1, nodeId2);				
			}
			if(!IsMaskedPixel(currentPoint.x, currentPoint.y,_mask) && IsMaskedPixel(neighborPoint.x,neighborPoint.y,_mask))
			{
				CvScalar value = cvGet2D(maskNeighbor, currentPoint.y, currentPoint.x);
				SetMaskNeighbor(currentPoint, neighborPoint, &value);					
				cvSet2D(maskNeighbor, currentPoint.y, currentPoint.x, value);
			}
		}
	}
}
IplImage* FillHoleShiftMap::CalculatedRetargetImage()
{	 
	IplImage* output = cvCloneImage(_maskData);

	int num_pixels = _pointMapping->size();

	printf("Rendering graph-cut result to image... \n");
	for(int i = 0; i < num_pixels; i++)
	{
		int label = _gcGeneral->whatLabel(i);
		CvPoint* point = (*(_pointMapping))[i];
		CvPoint shift = GetShift(label, _shiftSize);		 
		CvPoint pointLabel = cvPoint(point->x + shift.x, point->y + shift.y);

		if(!IsOutside(pointLabel, cvSize(_input->width, _input->height)))
		{
			CvScalar value = cvGet2D(_input, pointLabel.y, pointLabel.x);
			cvSet2D(output, point->y, point->x, value);
			// printf("*%i %i %i %i", point->x, point->y, pointLabel.x, pointLabel.y);
		}
		else
		{
			printf("warning mapped outside");
			cvSet2D(output, point->y, point->x, cvScalar(255, 0, 0));
		}
	}
	return output;
}
IplImage* ShiftMapHierarchy::GetRetargetImageH()
{
	IplImage* output = cvCreateImage(_outputSize, _input->depth, _input->nChannels);
	int num_pixels = _outputSize.width * _outputSize.height;

	printf("Rendering graph-cut result to image... \n");
	for(int i = 0; i < num_pixels; i++)
	{
		int label = _gc->whatLabel(i);
		CvPoint point = GetPoint(i, _outputSize);		
		CvPoint pointLabel = GetMappedPointInitialGuess(i, label, _outputSize, _shiftSize, _initialGuess);
		
		if(!IsOutside(pointLabel, _inputSize))
		{
			CvScalar value = cvGet2D(_input, pointLabel.y, pointLabel.x);
			cvSet2D(output, point.y, point.x, value);		
		}
		else
		{
			printf("warning mapped outside");
			cvSet2D(output, point.y, point.x, cvScalar(255, 0, 0));
		}
	}
	return output;
}
Exemplo n.º 4
0
static __inline int eval_n_mobility(int sq, int color)
{
  int dest,r = 0,score = 0;
  int opcolor = color ^ 1;
  
  dest = sq + 14;
  if(!IsOutside(dest) && PieceColor(dest) != color)
  { r++;
    score += sq_ctrl[dest];
    score += *(safety[opcolor] + dest);
  }	
  dest = sq - 14;
  if(!IsOutside(dest) && PieceColor(dest) != color)
  { r++;
    score += sq_ctrl[dest];
    score += *(safety[opcolor] + dest);
  }
  dest = sq + 18;
  if(!IsOutside(dest) && PieceColor(dest) != color)
  { r++;
    score += sq_ctrl[dest];
    score += *(safety[opcolor] + dest);
  }
  dest = sq - 18;
  if(!IsOutside(dest) && PieceColor(dest) != color)
  { r++;
    score += sq_ctrl[dest];
    score += *(safety[opcolor] + dest);
  }
  dest = sq + 31;
  if(!IsOutside(dest) && PieceColor(dest) != color)
  { r++;
    score += sq_ctrl[dest];
    score += *(safety[opcolor] + dest);
  }
  dest = sq - 31;
  if(!IsOutside(dest) && PieceColor(dest) != color)
  { r++;
    score += sq_ctrl[dest];
    score += *(safety[opcolor] + dest);
  }
  dest = sq + 33;
  if(!IsOutside(dest) && PieceColor(dest) != color)
  { r++;
    score += sq_ctrl[dest];
    score += *(safety[opcolor] + dest);
  }
  dest = sq - 33;
  if(!IsOutside(dest) && PieceColor(dest) != color)
  { r++;
    score += sq_ctrl[dest];
    score += *(safety[opcolor] + dest);
  }

  score += (mobility[KNIGHT][r]);
  return score;
}
bool FillHoleShiftMap::IsMaskedPixel(int x, int y, IplImage* mask)
{
	if(!IsOutside(cvPoint(x,y), cvSize(mask->width, mask->height)))
	{
		CvScalar value = cvGet2D(mask, y, x);
		if(value.val[0] < 100)
			return true;
		else return false;
	}
	else
	{
		return true;
	}
}
int smoothFunctionFH(int pixel1, int pixel2, int label1, int label2, void* extraData)
{
	ForSmoothFH* data = (ForSmoothFH*)extraData;
	CvPoint* point1 = (*(data->pointMapping))[pixel1];
	CvPoint* point2 = (*(data->pointMapping))[pixel2];
	CvPoint shift1 = GetShift(label1, data->shiftSize);
	CvPoint shift2 = GetShift(label2, data->shiftSize);
	CvPoint origin1 = cvPoint(shift1.x + point1->x, shift1.y + point1->y);
	CvPoint origin2 = cvPoint(shift2.x + point2->x, shift2.y + point2->y);
	CvPoint neighbor1 = GetNeighbor(*point1, *point2, origin1);
	CvPoint neighbor2 = GetNeighbor(*point2, *point1, origin2);

	CvSize inputSize = cvSize(data->input->width, data->input->height);
	if(IsOutside(origin1, inputSize) || IsOutside(origin2, inputSize)
		|| IsOutside(neighbor1, inputSize) || IsOutside(neighbor2, inputSize))
		return 10000;

	int energy = 0;
	energy += SquareColorDifference(origin1, neighbor2, data->input);
	energy += SquareColorDifference(origin2, neighbor1, data->input);
	energy += SquareColorDifference(origin1, neighbor2, data->inputGradient);
	energy += SquareColorDifference(origin2, neighbor1, data->inputGradient);	
}
int dataFunctionFH(int pixel, int label, void *extraData)
{
	ForDataFH* forData = (ForDataFH*) extraData;
	CvPoint* point = (*(forData->pointMapping))[pixel];
	
	CvPoint origin;
	CvPoint shift = GetShift(label, forData->shiftSize);
	origin.x = point->x + shift.x;
	origin.y = point->y + shift.y;
	
	// penalty if outside
	if(IsOutside(origin, forData->inputSize)) 
		return 1000000;

	// saliency cost
	double saliency = 0;
	CvScalar value = cvGet2D(forData->saliency, origin.y, origin.x);
	saliency += (value.val[0] + value.val[1] + value.val[2]); 	
	
	// smooth cost with predefined region
	int energy = 0;
	value = cvGet2D(forData->maskNeighbor, point->y, point->x);
	if(value.val[0] == 1)
	{
		// compare with up position
		energy += smoothFunctionFHMask(origin, *point, cvPoint(point->x, point->y - 1), 
			forData->input, forData->inputGradient, forData->maskData, forData->maskDataGradient);
	}
	if(value.val[1] == 1)
	{
		// compare with right
		energy += smoothFunctionFHMask(origin, *point, cvPoint(point->x + 1, point->y), 
			forData->input, forData->inputGradient, forData->maskData, forData->maskDataGradient);
	}
	if(value.val[2] == 1)
	{
		// compare with down
		energy += smoothFunctionFHMask(origin, *point, cvPoint(point->x, point->y + 1), 
			forData->input, forData->inputGradient, forData->maskData, forData->maskDataGradient);
	}
	if(value.val[3] == 1)
	{
		// compare with left
		energy += smoothFunctionFHMask(origin, *point, cvPoint(point->x - 1, point->y), 
			forData->input, forData->inputGradient, forData->maskData, forData->maskDataGradient);
	}

	return energy + saliency;
}
void Filler::GetCluster(Pos pos, std::unordered_set<int>& cluster_out)
{
	if (IsOutside(pos) ||
		visited_.find(pos.GetHash()) != visited_.end() ||
		piece_index_.find(pos.GetHash()) == piece_index_.end())
	{
		return;
	}

	visited_.insert(pos.GetHash());
	cluster_out.insert(piece_index_[pos.GetHash()]);
	for (const auto& direction : directions_)
	{
		GetCluster({ pos.x + direction.first, pos.y + direction.second }, cluster_out);
	}
}
int smoothFunctionFHMask2(CvPoint inputPoint, CvPoint outputPoint, CvPoint knownPoint, ForDataFH2* forData)
{
	
	CvPoint inputNeighbor = GetNeighbor(knownPoint, outputPoint, inputPoint); // neighbor of inputPoint
	// neighbor of the knownPoint is actually the outputPoint
	
	int energy = 0;
	if(IsOutside(inputNeighbor, cvSize(forData->input->width, forData->input->height)))
	{
		return 100000;
	}
	
	// data term
	energy += SquareColorDifference(inputNeighbor, forData->input, knownPoint, forData->mask, forData->input);
	energy += SquareColorDifference(inputPoint, forData->input, outputPoint, forData->mask, forData->input);

	// gradient different term 
	energy += 2 * SquareColorDifference(inputNeighbor, forData->inputGradient, knownPoint, forData->mask, forData->inputGradient);
	energy += 2 * SquareColorDifference(inputPoint, forData->inputGradient, outputPoint, forData->mask, forData->inputGradient);
	
	return energy;
}
Exemplo n.º 10
0
void CreateMask(IplImage* input, IplImage* mask, CvPoint shift, CvSize outputSize, IplImage* outputMask, IplImage* outputData)
{
	// check size
	if(outputMask->width != outputSize.width || outputMask->height != outputSize.height)
		return;
	if(outputData->width != outputSize.width || outputData->height != outputSize.height)
		return;
	
	 
	
	for(int i = 0; i < outputMask->width; i++)
		for(int j = 0; j < outputMask->height; j++)
		{
			CvPoint inputPixel;
			inputPixel.x = shift.x + i;
			inputPixel.y = shift.y + j;
			if(!IsOutside(inputPixel, cvSize(input->width, input->height)))
			{
				cvSet2D(outputMask, j, i, cvGet2D(mask, inputPixel.y, inputPixel.x)); 
			}
			else
			{
				cvSet2D(outputMask, j, i, cvScalar(255));				 
			}
		}
	for(int i = 0; i < outputSize.width; i++)
		for(int j = 0; j < outputSize.height; j++)
		{
			cvSet2D(outputData,j,i, cvScalar(231,233,233));	
		}
	for(int i = 0; i < outputSize.width; i++)
		for(int j = 0; j < outputSize.height; j++)
		{
			
			if(IsMaskedPixel(i, j, outputMask))
			{
				// check neighbor
				CvPoint inputPixel;
				inputPixel.x = shift.x + i;
				inputPixel.y = shift.y + j;
				CvScalar value;
				CvSize inputSize = cvSize(input->width, input->height);
				
				if(!IsOutside(cvPoint(inputPixel.x, inputPixel.y), inputSize) && 
					!IsOutside(cvPoint(i,j),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y, inputPixel.x);
					cvSet2D(outputData, j, i, value);
				}

				if(!IsOutside(cvPoint(inputPixel.x+1, inputPixel.y), inputSize) && 
					!IsOutside(cvPoint(i+1,j),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y, inputPixel.x + 1);
					 
					cvSet2D(outputData, j, i+1, value);
				}

				if(!IsOutside(cvPoint(inputPixel.x - 1, inputPixel.y), inputSize) && 
					!IsOutside(cvPoint(i-1,j),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y, inputPixel.x - 1);
					cvSet2D(outputData, j, i-1, value);
				}
 
				if(!IsOutside(cvPoint(inputPixel.x, inputPixel.y+1), inputSize) && 
					!IsOutside(cvPoint(i,j+1),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y + 1, inputPixel.x);
					
					cvSet2D(outputData, j+1, i, value);
				}


				if(!IsOutside(cvPoint(inputPixel.x, inputPixel.y-1), inputSize) && 
					!IsOutside(cvPoint(i,j-1),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y - 1, inputPixel.x);
					cvSet2D(outputData, j-1, i, value);
				}
			}
		}		
	
		for(int i = 0; i < outputSize.width - 1; i++)
		for(int j = 0; j < outputSize.height - 1; j++)
		{
			if(IsMaskedPixel(i, j, outputMask))
			{
				// check neighbor
				CvScalar value;
				value = cvGet2D(outputData, j, i);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
				value = cvGet2D(outputData, j+1, i);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
				value = cvGet2D(outputData, j-1, i);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
				value = cvGet2D(outputData, j, i+1);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
				value = cvGet2D(outputData, j, i-1);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
			}
		}

}
Exemplo n.º 11
0
// mask is of the same size as input
MaskShift* CreateMaskShift(IplImage* input, IplImage* mask, CvPoint shift, CvSize outputSize)
{
	IplImage* outputMask = cvCreateImage(outputSize, IPL_DEPTH_8U, 3);

	IplImage* outputTest = cvCreateImage(outputSize, IPL_DEPTH_8U, 3);
	IplImage* outputData = cvCreateImage(outputSize, IPL_DEPTH_8U, 3);
	for(int i = 0; i < outputMask->width; i++)
		for(int j = 0; j < outputMask->height; j++)
		{
			CvPoint inputPixel;
			inputPixel.x = shift.x + i;
			inputPixel.y = shift.y + j;
			if(!IsOutside(inputPixel, cvSize(input->width, input->height)))
			{
				cvSet2D(outputMask, j, i, cvGet2D(mask, inputPixel.y, inputPixel.x)); 
			}
			else
			{
				cvSet2D(outputMask, j, i, cvScalar(255));				 
			}
		}
	for(int i = 0; i < outputSize.width; i++)
		for(int j = 0; j < outputSize.height; j++)
		{
			cvSet2D(outputData,j,i, cvScalar(231,233,233));	
		}
	for(int i = 0; i < outputSize.width; i++)
		for(int j = 0; j < outputSize.height; j++)
		{
			
			if(IsMaskedPixel(i, j, outputMask))
			{
				// check neighbor
				CvPoint inputPixel;
				inputPixel.x = shift.x + i;
				inputPixel.y = shift.y + j;
				CvScalar value;
				CvSize inputSize = cvSize(input->width, input->height);
				
				if(!IsOutside(cvPoint(inputPixel.x, inputPixel.y), inputSize) && 
					!IsOutside(cvPoint(i,j),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y, inputPixel.x);
					cvSet2D(outputData, j, i, value);
				}

				if(!IsOutside(cvPoint(inputPixel.x+1, inputPixel.y), inputSize) && 
					!IsOutside(cvPoint(i+1,j),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y, inputPixel.x + 1);
					 
					cvSet2D(outputData, j, i+1, value);
				}

				if(!IsOutside(cvPoint(inputPixel.x - 1, inputPixel.y), inputSize) && 
					!IsOutside(cvPoint(i-1,j),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y, inputPixel.x - 1);
					cvSet2D(outputData, j, i-1, value);
				}
 
				if(!IsOutside(cvPoint(inputPixel.x, inputPixel.y+1), inputSize) && 
					!IsOutside(cvPoint(i,j+1),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y + 1, inputPixel.x);
					
					cvSet2D(outputData, j+1, i, value);
				}


				if(!IsOutside(cvPoint(inputPixel.x, inputPixel.y-1), inputSize) && 
					!IsOutside(cvPoint(i,j-1),  outputSize))
				{
					value = cvGet2D(input, inputPixel.y - 1, inputPixel.x);
					cvSet2D(outputData, j-1, i, value);
				}
			}
		}

		int j2 =21;
		int i2 = 5;	 
		CvScalar value2 = cvGet2D(outputData, j2+1, i2);
 
	for(int i = 0; i < outputSize.width; i++)
		for(int j = 0; j < outputSize.height; j++)
		{
			if(IsMaskedPixel(i, j, outputMask))
			{
				// check neighbor
				CvScalar value;
				value = cvGet2D(outputData, j, i);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
				value = cvGet2D(outputData, j+1, i);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
				value = cvGet2D(outputData, j-1, i);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
				value = cvGet2D(outputData, j, i+1);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
				value = cvGet2D(outputData, j, i-1);
				if(value.val[0] == 231 && value.val[1] == 233 && value.val[2] == 233)
					printf("Test");
			}
		}
	//cvNamedWindow("Test");
	//while(1)
	//{
	//	cvShowImage("Test", outputData);
	//	cvWaitKey(100);
	//}
	MaskShift* maskShift = new MaskShift(outputMask, input);
	maskShift->SetMaskData(outputData);
	return maskShift;
}