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,®ionMask.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(),®ionMask.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&®ionMask->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]&®ionNeedAdjustFlag[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)]&®ionNeedAdjustFlag[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]&®ionNeedAdjustFlag[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]&®ionNeedAdjustFlag[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]&®ionNeedAdjustFlag[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 }