void getGrabCutSeg(Mat& inIm, Mat& mask_fgnd, Rect ROI) { Mat mask_out; Rect rect = ROI; Mat fgnd, bgnd; grabCut(inIm, mask_out, rect, bgnd, fgnd, 5, GC_INIT_WITH_RECT); bitwise_and(mask_out, GC_FGD, mask_fgnd); }
void initModify::myGrabCut(Mat & backgroundImage, Mat & mask) { Rect aoi; aoi.x = 0; aoi.y = 0; aoi.width = mask.cols; aoi.height = mask.cols; Mat bgdModel, fgdModel; grabCut(backgroundImage, mask, aoi, bgdModel, fgdModel, 2, GC_INIT_WITH_MASK); }
void GrabCutMF::runGrabCutOpenCV(CStr &wkDir) { CStr imgDir = wkDir + "Imgs/", salDir = wkDir + "Sal/"; vecS namesNE; int imgNum = CmFile::GetNamesNE(imgDir + "*.jpg", namesNE); CmFile::MkDir(salDir); // Number of labels CmTimer tm("Time"); tm.Start(); for (int i = 0; i < imgNum; i++){ printf("Processing %d/%d: %s.jpg%20s\r\n", i, imgNum, _S(namesNE[i]), ""); CmFile::Copy(imgDir + namesNE[i] + ".jpg", salDir + namesNE[i] + ".jpg"); CmFile::Copy(imgDir + namesNE[i] + ".png", salDir + namesNE[i] + "_GT.png"); Mat imMat3u = imread(imgDir + namesNE[i] + ".jpg"); Mat gt1u = imread(imgDir + namesNE[i] + ".png", CV_LOAD_IMAGE_GRAYSCALE); //imwrite(imgDir + namesNE[i] + ".bmp", gt1u); blur(gt1u, gt1u, Size(3,3)); Rect wkRect = CmCv::GetMaskRange(gt1u, 1, 128); // Prepare data for OneCut //Mat rectImg = Mat::ones(gt1u.size(), CV_8U)*255; //rectImg(wkRect) = 0; //imwrite(salDir + namesNE[i] + ".bmp", imMat3u); //imwrite(salDir + namesNE[i] + "_t.bmp", rectImg); Mat res1u, bgModel, fgModel; grabCut(imMat3u, res1u, wkRect, bgModel, fgModel, 1, GC_INIT_WITH_RECT); grabCut(imMat3u, res1u, wkRect, bgModel, fgModel, 5); compare(res1u, GC_PR_FGD, res1u, CMP_EQ); imwrite(salDir + namesNE[i] + "_GC.png", res1u); } tm.Stop(); double avgTime = tm.TimeInSeconds()/imgNum; printf("Speed: %gs, %gfps\t\t\n", avgTime, 1/avgTime); CmEvaluation::EvalueMask(imgDir + "*.png", salDir, "GC", ""); }
int GCApplication::nextIter() { if (isInitialized) grabCut(*image, mask, rect, bgdModel, fgdModel, 1); else { if (rectState != SET) return iterCount; if (lblsState == SET || prLblsState == SET) grabCut(*image, mask, rect, bgdModel, fgdModel, 1, GC_INIT_WITH_MASK); else grabCut(*image, mask, rect, bgdModel, fgdModel, 1, GC_INIT_WITH_RECT); isInitialized = true; } iterCount++; bgdPxls.clear(); fgdPxls.clear(); prBgdPxls.clear(); prFgdPxls.clear(); return iterCount; }
int GrabCutSegmentor::nextIter() { if( isInitialized ) grabCut( m_Img, m_Mask, rect, m_BgdModel, m_FgdModel, 1 ); else { if( rectState != SET ) return iterCount; if( lblsState == SET || prLblsState == SET ) grabCut( m_Img, m_Mask, rect, m_BgdModel, m_FgdModel, 1, GC_INIT_WITH_MASK ); else grabCut( m_Img, m_Mask, rect, m_BgdModel, m_FgdModel, 1 , GC_INIT_WITH_RECT ); isInitialized = true; } iterCount++; bgdPxls.clear(); fgdPxls.clear(); prBgdPxls.clear(); prFgdPxls.clear(); return iterCount; }
int main() { cv::Mat image = cv::imread("dog.jpg"); // Define ROI(region of interest) cv::Rect fg_r(cv::Point(150, 0), cv::Point(720, 524)); cv::Mat result; cv::Mat bgModel, fgModel; grabCut(image, result, fg_r, bgModel, fgModel, 5, cv::GC_INIT_WITH_RECT); // Get the pixels marked as likely foreground cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ); // Generate output image cv::Mat foreground(image.size(), CV_8UC3, cv::Scalar(255, 255, 255)); image.copyTo(foreground, result); // bg pixels not copied imshow("Dog image", image); imshow("Foreground", foreground); cv::waitKey(0); return 0; }