void ImageProcessSystem::sharpEffect()
{
	BasisOperation::sharpEffect(srcMat.get(),resultMat.get());
	updateMat();
	updateToolBar();
	updateDisplayImage();
}
void ImageProcessSystem::interactiveLacalEnhencementActionTriggered()
{
	if(interactiveStatus&INTERACTIVE_LOCAL_ENHENCEMENT_SELECTED)
		return;
	if(interactiveHasProduceResult)
	{
		interactiveHasProduceResult=false;
		updateMat();
	}
	interactiveStatus=0;
	interactiveStatus|=INTERACTIVE_LOCAL_ENHENCEMENT_SELECTED;
	delete ImageLabel;
	ImageLabel=new LocalEnhencementLabel(ui.centralWidget);
	initImageLabel();
	((LocalEnhencementLabel *)(ImageLabel))->setParameters(&srcImage,ui.pixelValueLabel,&regionMask.get(),&srcMat.get(),tolerance,featherRadius);
	connect(ImageLabel,SIGNAL(interactiveLocalEnhencementFinished()),this,SLOT(interactiveLocalEnhencementFinishSignalEmit()));
	interactiveOptionWidgetHasInit=true;
	delete interactiveOptionWidget;
	interactiveOptionWidget=new InteractiveLocalEnhencementWidget(ui.centralWidget,(LocalEnhencementLabel *)ImageLabel);
	interactiveOptionWidget->setGeometry(ImageLabel->x()+ImageLabel->width()+10,ImageLabel->y(),240,ImageLabel->height());
	interactiveOptionWidget->setVisible(true);
	interactiveLocalEnhencementConnecting();
	updateToolBar();
	updateDisplayImage();
}
void ImageProcessSystem::automaticLocalEnhencement()
{
	BasisOperation::colorLevel(srcMat.get(),resultMat.get(),0,255,2);
	updateMat();
	updateToolBar();
	updateDisplayImage();
}
void ImageProcessSystem::interactiveColorLevelTriggered()
{
	if(interactiveStatus&INTERACTIVE_COLOR_LEVEL_SELECTED)
		return;
	if(interactiveHasProduceResult)
	{
		interactiveHasProduceResult=false;
		updateMat();
	}
	interactiveStatus=0;
	interactiveStatus|=INTERACTIVE_COLOR_LEVEL_SELECTED;
	delete ImageLabel;
	ImageLabel=new OriginalImageLabel(ui.centralWidget);
	initImageLabel();
	interactiveOptionWidgetHasInit=true;
	delete interactiveOptionWidget;
	interactiveOptionWidget=new InteractiveColorLevelWidget(ui.centralWidget);
	interactiveOptionWidget->setGeometry(ImageLabel->x()+ImageLabel->width()+10,ImageLabel->y(),240,ImageLabel->height());
	interactiveOptionWidget->setVisible(true);
	connect(((InteractiveColorLevelWidget *)interactiveOptionWidget)->redSlider.get(),SIGNAL(valueChanged(int)),this,SLOT(interactiveColorLevelParametersChanged(int)));
	connect(((InteractiveColorLevelWidget *)interactiveOptionWidget)->lightnessSlider.get(),SIGNAL(valueChanged(int)),this,SLOT(interactiveColorLevelParametersChanged(int)));
	connect(((InteractiveColorLevelWidget *)interactiveOptionWidget)->saturationSlider.get(),SIGNAL(valueChanged(int)),this,SLOT(interactiveColorLevelParametersChanged(int)));
	connect(((InteractiveColorLevelWidget *)interactiveOptionWidget)->contrastSlider.get(),SIGNAL(valueChanged(int)),this,SLOT(interactiveColorLevelParametersChanged(int)));
	srcHSVMat.get()=Mat(srcMat->rows,srcMat->cols,CV_32FC3);
	ColorSpaceTransition::rgb2Hsv(srcMat.get(),srcHSVMat.get());
	updateToolBar();
	updateDisplayImage();
}
GrabCut3DObjectSegmenter::GrabCut3DObjectSegmenter()
{
    // Initialize window
    //setImages(_img,_depth_image);
    updateDisplayImage();

    iter_count_ = 0;
}
ImageDisplayWidget::ImageDisplayWidget(QWidget *parent) : QWidget(parent),
    layout(new QGridLayout),scrollArea(new QScrollArea),
    imageDisplayLabel(new QLabel)
{
    connect(this, SIGNAL(pathChanged(QString)),this, SLOT(updateDisplayImage(QString)));
    connect(this, SIGNAL(imageChanged(QImage)),this, SLOT(updateDisplayArea(QImage)));
    setupDisplayArea();
}
void ImageProcessSystem::cancelOperation()
{
	srcImage=images.top();
	currentDisplayImageImproper=false;
	BasisOperation::qimage2Mat(srcImage,srcMat.get());
	images.pop();
	resetStatus();
	updateToolBar();
	updateDisplayImage();
}
void ImageProcessSystem::automaticHighlightRemoval()
{
	highlightDetection();
	srcMat.get().copyTo(resultMat.get());
	HighLightRemoval::removal(srcMat.get(),resultMat.get(),highlightMask.get(),face,HIGHLIGHT_REMOVAL_POSSION_MATHOD);
	updateMat();
	updateToolBar();
#ifdef DEBUG
	imshow("result",resultMat.get());
#else
	updateDisplayImage();
#endif
}
void ImageProcessSystem::automaticColorCorrection()
{
	if(colorCorrection())
	{
		updateMat();
		updateToolBar();
#ifdef DEBUG
		imshow("result",resultMat.get());
#else
		updateDisplayImage();
#endif
	}
}
void ImageProcessSystem::interactiveLocalEnhencementFinishSignalEmit()
{
	BasisOperation::qimage2OneChannelMat(((LocalEnhencementLabel *)ImageLabel)->paintMask,INTERACTIVE_PIXEL_VALUE,regionMask.get(),PIXEL_SELECTED_VALUE);
	blur(regionMask.get(),regionMask.get(),Size(featherRadius,featherRadius));
	double x=0.5,y;
	if(((InteractiveLocalEnhencementWidget *)interactiveOptionWidget)->dodgeRadioButton->isChecked())
	{
		y=0.45;
	}
	else
		y=0.55;
	srcMat.get().copyTo(resultMat.get());
	BasisOperation::localEnhencementUsingMappingMethod(resultMat.get(),&regionMask.get(),x,y);
	updateMat();
	updateToolBar();
	updateDisplayImage();
}
void ImageProcessSystem::interactiveTriangleActionTriggered()
{
	if(interactiveStatus&INTERACTIVE_TRIANGLE_SELECTED)
		return;
	if(interactiveHasProduceResult)
	{
		interactiveHasProduceResult=false;
		updateMat();
	}
	interactiveStatus=INTERACTIVE_TRIANGLE_SELECTED;
	delete ImageLabel;
	ImageLabel=new InteractiveTriangleLabel(pointX,pointY,ui.centralWidget);
	initImageLabel();
	((InteractiveTriangleLabel *)ImageLabel)->initDrawingImage();
	updateToolBar();
	updateDisplayImage();
}
// TODO: Should this be public?
void
GrabCut3DObjectSegmenter::initializedIs(bool _init)
{
    if (_init)
        initialized_=_init;
    else
    {
        if ( !mask_.empty() ) mask_.setTo(Scalar::all(GC_BGD));
        bgd_pxls_.clear();
        fgd_pxls_.clear();
        pr_bgd_pxls_.clear();
        pr_fgd_pxls_.clear();
        initialized_   = _init;
        rect_state_ = NOT_SET;
        lbls_state_ = NOT_SET;
        pr_lbls_state_ = NOT_SET;
        iterCountIs(0);
        updateDisplayImage();
    }
}
void ImageProcessSystem::interactiveFaceActionTriggered()
{
	if(interactiveStatus&INTERACTIVE_FACE_SELECTED)
		return;
	if(interactiveHasProduceResult)
	{
		interactiveHasProduceResult=false;
		updateMat();
		updateDisplayImage();
	}
	interactiveStatus=0;
	interactiveStatus|=INTERACTIVE_FACE_SELECTED;
	delete ImageLabel;
	ImageLabel=new InteractiveFaceLabel(ui.centralWidget);
	initImageLabel();
	((InteractiveFaceLabel *)ImageLabel)->setParameters(&srcImage,ui.pixelValueLabel,&face);
	delete interactiveOptionWidget;
	interactiveOptionWidget=NULL;
	interactiveOptionWidgetHasInit=false;
	updateToolBar();
}
void GrabCut3DObjectSegmenter::iterCountIs(int _icnt)
{
    if (_icnt == 0) {
        iter_count_ = 0;
        return;
    }

    int iter_inc = _icnt - iter_count_;
    if (iter_inc <= 0) return;

    if( initialized() )
        grabCut3D( image_, depth_image_, mask_, rect_, bgd_model_, fgd_model_, iter_inc );
    else
    {
        if( rect_state_ != SET ) return;

        if (rect_.area()==0) return;
        //  rect_state_=EMPTY;

        if( lbls_state_ == SET || pr_lbls_state_ == SET )
            grabCut3D( image_, depth_image_, mask_, rect_, bgd_model_, fgd_model_,
                       iter_inc, GC_INIT_WITH_MASK );
        else
            grabCut3D( image_, depth_image_, mask_, rect_, bgd_model_, fgd_model_,
                       iter_inc, GC_INIT_WITH_RECT );

        initializedIs(true);
    }
    iter_count_ = _icnt;

    bgd_pxls_.clear();
    fgd_pxls_.clear();
    pr_bgd_pxls_.clear();
    pr_fgd_pxls_.clear();

    updateDisplayImage();

    return;
}
void ImageProcessSystem::interactiveHighlightFinishSignalEmit()
{
	memset(highlightMask.get().data,NOTHIGHLIGHT_PIXEL_VALUE,sizeof(uchar)*highlightMask->rows*highlightMask->cols);
	BasisOperation::qimage2OneChannelMat(((HighLightLabel *)ImageLabel)->paintMask,INTERACTIVE_PIXEL_VALUE,highlightMask.get(),HIGHLIGHT_PIXEL_VALUE);
	unsigned char mode=0;
	if(((InteractiveHighlightWidget *)interactiveOptionWidget)->possionMethodIsChecked())
	{
		//detect face is time-consuming
		face=Rect(1,1,srcMat->cols-1,srcMat->rows-1);
		mode=HIGHLIGHT_REMOVAL_POSSION_MATHOD;
	}
	else
	{
		faceDetectingCombined();
		srcMat.get().copyTo(resultMat.get());
		mode=HIGHLIGHT_REMOVAL_INPAINTING_MATHOD;
	}
	HighLightRemoval::removal(srcMat.get(),resultMat.get(),highlightMask.get(),face,mode);
	updateMat();
	updateToolBar();
	updateDisplayImage();
}
void ImageProcessSystem::interactiveSwitchActionTriggered()
{
	if(interactiveStatus&INTERACTIVE_FACE_SELECTED)
	{
		if(((InteractiveFaceLabel *)ImageLabel)->getFaceStatus())
		{
			memset(faceMask.get().data,NOTFACE_PIXEL_VALUE,srcImage.width()*srcImage.height()*sizeof(uchar));
			faceDetector::detectingFace(srcMat.get(),faceMask.get(),FACE_COLORMODEL,face);
			processStatus|=FACE_DETECTION_DONE;
		}
	}
	interactiveStatus=0;
	delete ImageLabel;
	ImageLabel=new OriginalImageLabel(ui.centralWidget);
	initImageLabel();
	if(interactiveHasProduceResult)
	{
		updateMat();
		interactiveHasProduceResult=false;
	}
	updateToolBar();
	updateDisplayImage();
}
void ImageProcessSystem::interactiveColorCorrectionActionTriggered()
{
	if(interactiveStatus&INTERACTIVE_COLOR_CORRECTION_SELECTED)
		return;
	if(interactiveHasProduceResult)
	{
		interactiveHasProduceResult=false;
		updateMat();
	}
	interactiveStatus=0;
	interactiveStatus|=INTERACTIVE_COLOR_CORRECTION_SELECTED;
	delete ImageLabel;
	ImageLabel=new OriginalImageLabel(ui.centralWidget);
	initImageLabel();
	interactiveOptionWidgetHasInit=true;
	delete interactiveOptionWidget;
	interactiveOptionWidget=new InteractiveColorCorrectionWidget(ui.centralWidget);
	interactiveOptionWidget->setGeometry(ImageLabel->x()+ImageLabel->width()+10,ImageLabel->y(),240,ImageLabel->height());
	interactiveOptionWidget->setVisible(true);
	interactiveColorCorrectionConnecting();
	updateDisplayImage();
	updateToolBar();
}
/* Mutator for rectangle. */
void GrabCut3DObjectSegmenter::rectIs(const Rect &_r)
{
    if (_r == DEFAULT_RECT)
        rect_ = Rect(image_.cols/(DEFAULT_RECT_SCALE_FACTOR*2),
                     image_.rows/(DEFAULT_RECT_SCALE_FACTOR*2),
                     image_.cols/DEFAULT_RECT_SCALE_FACTOR,
                     image_.rows/DEFAULT_RECT_SCALE_FACTOR);
    else
        rect_=_r;

    rect_state_ = SET;

    ROS_INFO_STREAM("rect area is " << rect_.area());
    if (rect_.area()==0)
        rect_state_=EMPTY;

    setRectInMask();
    assert( bgd_pxls_.empty()
            && fgd_pxls_.empty()
            && pr_bgd_pxls_.empty()
            && pr_fgd_pxls_.empty() );
    updateDisplayImage();

}
void ImageProcessSystem::intercativeHighlightActionTriggered()
{
	if(interactiveStatus&INTERACTIVE_HIGHLIGHT_SELECTED)
		return;
	if(interactiveHasProduceResult)
	{
		interactiveHasProduceResult=false;
		updateMat();
		updateDisplayImage();
	}
	interactiveStatus=0;
	interactiveStatus|=INTERACTIVE_HIGHLIGHT_SELECTED;
	delete ImageLabel;
	ImageLabel=new HighLightLabel(ui.centralWidget);
	initImageLabel();
	ImageLabel->setParameters(&srcImage,ui.pixelValueLabel);
	connect(ImageLabel,SIGNAL(interactiveHighlightFinished()),this,SLOT(interactiveHighlightFinishSignalEmit()));
	interactiveOptionWidgetHasInit=true;
	delete interactiveOptionWidget;
	interactiveOptionWidget=new InteractiveHighlightWidget(ui.centralWidget);
	interactiveOptionWidget->setGeometry(ImageLabel->x()+ImageLabel->width()+10,ImageLabel->y(),240,ImageLabel->height());
	interactiveOptionWidget->setVisible(true);
	updateToolBar();
}
void ImageProcessSystem::interacitveColorBalanceTriggered()
{
	if(interactiveStatus&INTERACTIVE_COLOR_BALANCE_SELECTED)
		return ;
	if(interactiveHasProduceResult)
	{
		interactiveHasProduceResult=false;
		updateMat();
	}
	interactiveStatus=INTERACTIVE_COLOR_BALANCE_SELECTED;
	interactiveOptionWidgetHasInit=true;
	delete ImageLabel;
	ImageLabel=new OriginalImageLabel(ui.centralWidget);
	initImageLabel();
	delete interactiveOptionWidget;
	interactiveOptionWidget=new InteractiveColorBalanceWidget(ui.centralWidget);
	interactiveOptionWidget->setGeometry(ImageLabel->x()+ImageLabel->width()+10,ImageLabel->y(),240,ImageLabel->height());
	interactiveOptionWidget->setVisible(true);
	connect(((InteractiveColorBalanceWidget *)interactiveOptionWidget)->redSlider.get(),SIGNAL(valueChanged(int)),this,SLOT(interativeColorBalanceParametersChanged(int)));
	connect(((InteractiveColorBalanceWidget *)interactiveOptionWidget)->greenSlider.get(),SIGNAL(valueChanged(int)),this,SLOT(interativeColorBalanceParametersChanged(int)));
	connect(((InteractiveColorBalanceWidget *)interactiveOptionWidget)->blueSlider.get(),SIGNAL(valueChanged(int)),this,SLOT(interativeColorBalanceParametersChanged(int)));
	updateToolBar();
	updateDisplayImage();
}
/* Mouse callback function passed to OpenCV window. Handles marking the ROI
 * rectangle and foreground and background pixel hints. */
void GrabCut3DObjectSegmenter::mouseClick( MouseEvent event, int x, int y, bool control_down, bool shift_down)
{
    // TODO add bad args check
    switch( event )
    {
    case LEFT_BUTTON_DOWN: // set rect or GC_BGD(GC_FGD) labels
    {
        bool isb = control_down;
        bool isf = shift_down;
        if( rect_state_ == NOT_SET && !isb && !isf )
        {
            rect_state_ = IN_PROCESS;
            rect_ = Rect( x, y, 1, 1 );
        }
        if ( (isb || isf) && rect_state_ == SET )
            lbls_state_ = IN_PROCESS;
    }
    break;

    case RIGHT_BUTTON_DOWN: // set GC_PR_BGD(GC_PR_FGD) labels
    {
        bool isb = control_down;
        bool isf = shift_down;
        if ( (isb || isf) && rect_state_ == SET )
            pr_lbls_state_ = IN_PROCESS;
    }
    break;

    case LEFT_BUTTON_UP:
        if( rect_state_ == IN_PROCESS )
        {
            rect_ = Rect( Point(rect_.x, rect_.y), Point(x,y) );
            rect_state_ = SET;

            ROS_INFO_STREAM("rect area is " << rect_.area());
            if (rect_.area()==0)
                rect_state_=EMPTY;

            setRectInMask();
            assert( bgd_pxls_.empty()
                    && fgd_pxls_.empty()
                    && pr_bgd_pxls_.empty()
                    && pr_fgd_pxls_.empty() );
            updateDisplayImage();
        }
        if( lbls_state_ == IN_PROCESS )
        {
            setLblsInMask(control_down, shift_down, Point(x,y), false);
            lbls_state_ = SET;
            updateDisplayImage();
        }
        break;

    case RIGHT_BUTTON_UP:
        if( pr_lbls_state_ == IN_PROCESS )
        {
            setLblsInMask(control_down, shift_down, Point(x,y), true);
            pr_lbls_state_ = SET;
            updateDisplayImage();
        }
        break;

    case MOUSE_MOVE:
        if( rect_state_ == IN_PROCESS )
        {
            rect_ = Rect( Point(rect_.x, rect_.y), Point(x,y) );
            assert( bgd_pxls_.empty()
                    && fgd_pxls_.empty()
                    && pr_bgd_pxls_.empty()
                    && pr_fgd_pxls_.empty() );
            updateDisplayImage();
        }
        else if( lbls_state_ == IN_PROCESS )
        {
            setLblsInMask(control_down, shift_down, Point(x,y), false);
            updateDisplayImage();
        }
        else if( pr_lbls_state_ == IN_PROCESS )
        {
            setLblsInMask(control_down, shift_down, Point(x,y), true);
            updateDisplayImage();
        }
        break;
    }
}
/* Mutator for window background color. */
void GrabCut3DObjectSegmenter::setWinColor(WinColor _c)
{
    win_color_=_c;
    updateDisplayImage();
}
void ImageProcessSystem::superPixelActionTriggered()
{
	//prepare
	faceDetectingCombined();
	resultImage=srcImage.copy(0,0,srcImage.width(),srcImage.height());
	int faceImgWidth=face.width,faceImgHeight=face.height*1.2;
	faceImgHeight=faceImgHeight>(srcImage.height()-face.y)?(srcImage.height()-face.y):faceImgHeight;
	//symmetry
	double *grayImageData=new double[faceImgWidth*faceImgHeight];
	unsigned char *srcImagePtr=(unsigned char *)srcImage.bits();
	double threeChannelSum;
	for(int i=face.y;i<face.y+faceImgHeight;++i)
		for(int j=face.x;j<face.x+faceImgWidth;++j)
		{
			threeChannelSum=srcImagePtr[4*(i*srcImage.width()+j)+2]+srcImagePtr[4*(i*srcImage.width()+j)+1]+srcImagePtr[4*(i*srcImage.width()+j)];
			grayImageData[(i-face.y)*faceImgWidth+j-face.x]=threeChannelSum/3;
		}
	Engine *ep=MatlabEngineHolder::getEngine();
	mxArray *imgDataMatlab=mxCreateDoubleMatrix(faceImgWidth,faceImgHeight,mxREAL);
	memcpy(mxGetPr(imgDataMatlab),grayImageData,faceImgWidth*faceImgHeight*sizeof(double));
	mxArray *xInMatlab,*yInMatlab,*keyVector;
	engPutVariable(ep,"img",imgDataMatlab);
	engEvalString(ep,"img=img';");
	engEvalString(ep,"cd bin/symmetry;");
	engEvalString(ep,"[keyVector,X,Y]=symmetry(img,'mirror');");
	xInMatlab=engGetVariable(ep,"X");
	yInMatlab=engGetVariable(ep,"Y");
	double *xData=mxGetPr(xInMatlab);
	double *yData=mxGetPr(yInMatlab);
	int n=mxGetN(yInMatlab);
	if(n==0)
		return;
	// we assume the symmetry axis is vertical
	double sum=0;
	for(int i=0;i<n;++i)
		sum+=xData[i];
	symmetryAxisX=(int)(sum/n);
	faceImgWidth=2*(symmetryAxisX+1);
	//here faceImageWidth may exceeds the boundary,we treat it as error
	if(faceImgWidth>=srcImage.width()-face.x)
	{
		symmetryAxisX=0;
		return;
	}
	QPainter p(&srcImage);
	p.drawLine(symmetryAxisX+face.x,face.y,symmetryAxisX+face.x,face.y+faceImgHeight);
	p.end();
	mxDestroyArray(imgDataMatlab);
	mxDestroyArray(xInMatlab);
	mxDestroyArray(yInMatlab);
	//mxDestroyArray(keyVector);
	delete [] grayImageData;
	////
	//vector<int> position(srcMat->rows*srcMat->cols,0);
	//int pixelNumber=0;
	//srcMat.get().copyTo(resultMat.get());
	//for(int i=0;i<faceImgHeight;++i)
	//	for(int j=0;j<=symmetryAxisX;++j)
	//	{
	//		/*if(faceMask.at<uchar>(face.y+i,face.x+j)==FACE_PIXEL_VALUE)*/
	//		if(faceMask->at<uchar>(face.y+i,face.x+j)==FACE_PIXEL_VALUE&&faceMask->at<uchar>(face.y+i,faceImgWidth-1-j+face.x)==FACE_PIXEL_VALUE&&regionMask->at<uchar>(face.y+i,faceImgWidth-1-j+face.x)==PIXEL_NOT_SELECTED_VALUE)
	//		{
	//			resultMat->at<Vec3b>(face.y+i,face.x+j)=resultMat->at<Vec3b>(face.y+i,faceImgWidth-1-j+face.x);
	//		}
	//		else
	//			if(regionMask->at<uchar>(face.y+i,faceImgWidth-1-j+face.x)==PIXEL_SELECTED_VALUE)
	//			{
	//				regionMask->at<uchar>(face.y+i,faceImgWidth-1-j+face.x)=PIXEL_NOT_SELECTED_VALUE;
	//				regionMask->at<uchar>(face.y+i,face.x+j)=PIXEL_SELECTED_VALUE;
	//				position[(face.y+i)*srcMat->cols+face.x+j]=pixelNumber;
	//				pixelNumber++;
	//			}
	//	}
	//Poisson::poissonEditing(srcMat,resultMat,regionMask,position,pixelNumber,FIRST,0.0,255.0);
	//Poisson::poissonEditing(srcMat,resultMat,regionMask,position,pixelNumber,SECOND,0.0,255.0);
	//Poisson::poissonEditing(srcMat,resultMat,regionMask,position,pixelNumber,THIRD,0.0,255.0);
	//BasisOperation::poissonEditing(resultMat->get,resultMat,regionMask,position,pixelNumber,0,0.0,255.0);
	//BasisOperation::poissonEditing(resultMat,resultMat,regionMask,position,pixelNumber,1,0.0,255.0);
	//BasisOperation::poissonEditing(resultMat,resultMat,regionMask,position,pixelNumber,2,0.0,255.0);
	//super pixel
//	QImage faceImage=srcImage.copy(face.x,face.y,faceImgWidth,faceImgHeight);
//	QImage halfFaceImage=srcImage.copy(face.x,face.y,symmetryAxisX+1,faceImgHeight);
//	int *labels=new int[faceImgHeight*faceImgWidth];
//	int *halfLabels=new int[(symmetryAxisX+1)*faceImgHeight];
//	int numberLabels=0;
//	const int m_spcount=40;
//	const double m_compactness=10.0;
//	int gridWidth=(int)(sqrt((double)(halfFaceImage.width()*halfFaceImage.height())/m_spcount));
//	SLIC slic;
//	vector<double> kseedx(0),kseedy(0);
//	slic.PerformSLICO_ForGivenK((unsigned int *)halfFaceImage.bits(),halfFaceImage.width(),halfFaceImage.height(),halfLabels,numberLabels,m_spcount,m_compactness,kseedx,kseedy);
//	for(int i=0;i<faceImgHeight;++i)
//		memcpy(labels+i*faceImgWidth,halfLabels+i*(symmetryAxisX+1),sizeof(int)*(symmetryAxisX+1));
//	for(int i=0;i<faceImgHeight;++i)
//		for(int j=symmetryAxisX+1;j<faceImgWidth;++j)
//		{
//			labels[i*faceImgWidth+j]=2*numberLabels-halfLabels[i*(symmetryAxisX+1)+faceImgWidth-1-j];
//		}
//
//	//region merge
//	int *regionNeedAdjustFlag=new int[m_spcount];
//	if(!regionNeedAdjustFlag)
//		return ;
//	memset(regionNeedAdjustFlag,0,sizeof(int)*m_spcount);
//	srcMat.copyTo(resultMat);
//	int symmetryPointX,symmetryPointY;
//#ifdef  DISPLAY_SUPERPIXEL_AND_SYMMETRY
//	QPainter p(&resultImage);
//	p.setPen(QColor(0xff00ff00));
//	int needAdjustNumber=0;
//	const int initWidth=5,step=0;
//#endif
//	for(int i=0;i<numberLabels;++i)
//	{
//		symmetryPointX=faceImgWidth-1-((int)kseedx[i]);
//		symmetryPointY=(int)kseedy[i];
//		if(BasisOperation::regionNeedAdjust(resultMat,resultMat,(int)kseedx[i],(int)kseedy[i],symmetryPointX,symmetryPointY,gridWidth,face,faceMask,labels,faceImgWidth,faceImgHeight,0.1))
//		{
//			regionNeedAdjustFlag[labels[((int)kseedy[i])*faceImgWidth+((int)kseedx[i])]]=1;
//#ifdef  DISPLAY_SUPERPIXEL_AND_SYMMETRY
//			//p.drawEllipse(kseedx[i]+face.x,kseedy[i]+face.y,initWidth+step*needAdjustNumber,initWidth+step*needAdjustNumber);
//			//p.drawEllipse(face.x+symmetryPointX,face.y+symmetryPointY,initWidth+step*needAdjustNumber,initWidth+step*needAdjustNumber);
//			//needAdjustNumber++;
//#endif
//		}
//	}
//	int regionMergeLabel=-1,queueFrontI,queueFrontJ;
//	queue<QPoint> mergeQueue;
//	uchar *visited=new uchar[faceImgHeight*faceImgWidth];
//	if(!visited)
//		return ;
//	memset(visited,0,sizeof(uchar)*faceImgWidth*faceImgHeight);
//	for(int i=0;i<faceImgHeight;++i)
//		for(int j=0;j<=symmetryAxisX;++j)
//		{
//			if(!visited[i*faceImgWidth+j]&&regionNeedAdjustFlag[labels[i*faceImgWidth+j]])
//			{
//				regionMergeLabel=labels[i*faceImgWidth+j];
//				//for the purpose of find the combined area label
//				regionNeedAdjustFlag[regionMergeLabel]=2;
//				mergeQueue.push(QPoint(j,i));
//				visited[i*faceImgWidth+j]=1;
//				while(!mergeQueue.empty())
//				{
//					queueFrontI=mergeQueue.front().y();
//					queueFrontJ=mergeQueue.front().x();
//					mergeQueue.pop();
//					//up
//					if(queueFrontI>0&&!visited[((queueFrontI-1)*faceImgWidth+queueFrontJ)]&&regionNeedAdjustFlag[labels[(queueFrontI-1)*faceImgWidth+queueFrontJ]])
//					{
//						labels[(queueFrontI-1)*faceImgWidth+queueFrontJ]=regionMergeLabel;
//						labels[(queueFrontI-1)*faceImgWidth+faceImgWidth-1-queueFrontJ]=2*numberLabels-regionMergeLabel;
//						mergeQueue.push(QPoint(queueFrontJ,queueFrontI-1));
//						visited[((queueFrontI-1)*faceImgWidth+queueFrontJ)]=1;
//					}
//					//down
//					if((queueFrontI+1)<faceImgHeight&&!visited[(queueFrontI+1)*faceImgWidth+queueFrontJ]&&regionNeedAdjustFlag[labels[(queueFrontI+1)*faceImgWidth+queueFrontJ]])
//					{
//						labels[(queueFrontI+1)*faceImgWidth+queueFrontJ]=regionMergeLabel;
//						labels[(queueFrontI+1)*faceImgWidth+faceImgWidth-1-queueFrontJ]=2*numberLabels-regionMergeLabel;
//						mergeQueue.push(QPoint(queueFrontJ,queueFrontI+1));
//						visited[(queueFrontI+1)*faceImgWidth+queueFrontJ]=1;
//					}
//					//left
//					if(queueFrontJ>0&&!visited[queueFrontI*faceImgWidth+queueFrontJ-1]&&regionNeedAdjustFlag[labels[queueFrontI*faceImgWidth+queueFrontJ-1]])
//					{
//						labels[queueFrontI*faceImgWidth+queueFrontJ-1]=regionMergeLabel;
//						labels[queueFrontI*faceImgWidth+faceImgWidth-1-(queueFrontJ-1)]=2*numberLabels-regionMergeLabel;
//						mergeQueue.push(QPoint(queueFrontJ-1,queueFrontI));
//						visited[queueFrontI*faceImgWidth+queueFrontJ-1]=1;
//					}
//					//right
//					if((queueFrontJ+1)<=symmetryAxisX&&!visited[queueFrontI*faceImgWidth+queueFrontJ+1]&&regionNeedAdjustFlag[labels[queueFrontI*faceImgWidth+queueFrontJ+1]])
//					{
//						labels[queueFrontI*faceImgWidth+queueFrontJ+1]=regionMergeLabel;
//						labels[queueFrontI*faceImgWidth+faceImgWidth-1-(queueFrontJ+1)]=2*numberLabels-regionMergeLabel;
//						mergeQueue.push(QPoint(queueFrontJ+1,queueFrontI));
//						visited[queueFrontI*faceImgWidth+queueFrontJ+1]=1;
//					}
//				}
//			}
//		}
#ifdef DISPLAY_SUPERPIXEL_AND_SYMMETRY
		slic.DrawContoursAroundSegmentsTwoColors((unsigned int *)faceImage.bits(),labels,faceImgWidth,faceImgHeight);
		unsigned char * resultImagePtr=resultImage.bits();
		unsigned char *faceImagePtr=faceImage.bits();
		for(int i=0;i<faceImgHeight;++i)
		{
			memcpy(resultImagePtr+((face.y+i)*resultImage.width()+face.x)*4,faceImagePtr+4*i*faceImgWidth,4*faceImgWidth);
		}
#endif
	//delete [] visited;
	////color transfer and poisson editing
	//srcMat.copyTo(resultMat);
	////const int bins=100;
	////Mat labMat(srcMat.rows,srcMat.cols,CV_32FC3);
	////ColorSpaceTransition::rgb2Lab(srcMat,labMat);
	//int regionPixelNumber;
	//int *position=new int[srcMat.rows*srcMat.cols];
	//for(int i=0;i<numberLabels;++i)
	//{
	//	if(regionNeedAdjustFlag[i]==2)
	//	{
	//		Mat srcRegionMask=Mat::zeros(srcMat.rows,srcMat.cols,CV_8UC1),tarRegionMask=Mat::zeros(srcMat.rows,srcMat.cols,CV_8UC1);
	//		regionPixelNumber=0;
	//		memset(position,0,sizeof(int)*srcMat.rows*srcMat.cols);
	//		for(int j=0;j<faceImgHeight;++j)
	//			for(int k=0;k<faceImgWidth;++k)
	//			{
	//				if(labels[j*faceImgWidth+k]==i&&faceMask.at<uchar>(j+face.y,k+face.x)==FACE_PIXEL_VALUE&&faceMask.at<uchar>(j+face.y,faceImgWidth-1-k+face.x)==FACE_PIXEL_VALUE&&!BasisOperation::pixelIsBoundary(faceMask,k+face.x,j+face.y))
	//				{
	//				/*	srcRegionMask.at<uchar>(j+face.y,k+face.x)=PIXEL_SELECTED_VALUE;
	//					position[(j+face.y)*srcMat.cols+k+face.x]=regionPixelNumber;
	//					regionPixelNumber++;*/
	//					resultMat.at<Vec3b>(j+face.y,k+face.x)=srcMat.at<Vec3b>(j+face.y,faceImgWidth-1-k+face.x);
	//				}
	//			/*	if(labels[j*faceImgWidth+k]==(2*numberLabels-i)&&faceMask.at<uchar>(j+face.y,k+face.x)==FACE_PIXEL_VALUE&&!BasisOperation::pixelIsBoundary(faceMask,k+face.x,j+face.y))
	//					tarRegionMask.at<uchar>(j+face.y,k+face.x)=PIXEL_SELECTED_VALUE;*/
	//			}
	//	}
	//}
	////ColorSpaceTransition::lab2Rgb(labMat,resultMat);
	////free resource
	//delete [] position;
	//delete [] regionNeedAdjustFlag;
	//if(labels)
	//	delete [] labels;
	//if(halfLabels)
	//	delete [] halfLabels;
	//display result
#ifdef DISPLAY_SUPERPIXEL_AND_SYMMETRY
	ImageLabel->displayImage(resultImage);
#else
	//updateMat();
	//updateToolBar();
	updateDisplayImage();
#endif
}