Вы можете имитировать активные контуры, используя cv::grabCut
как предложено. Вы выбираете радиус притяжения (насколько далеко от исходного положения может развиться кривая), и используя расширенные и эродированные изображения, вы определяете неизвестную область вокруг контура.
// cv::Mat img, mask; // contour on mask as filled polygon
if (mask.size()!=img.size())
CV_Error(CV_StsError,"ERROR");
int R = 32; // radius of attraction
cv::Mat strel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2*R+1,2*R+1));
cv::Mat gc(mask.size(), CV_8UC1, cv::Scalar(cv::GC_BGD));
cv::Mat t;
cv::dilate(mask, t, strel);
gc.setTo(cv::GC_PR_BGD, t);
gc.setTo(cv::GC_PR_FGD, mask); // 3
cv::erode(mask, t, strel);
gc.setTo(cv::GC_FGD, t); // 1
cv::grabCut(img, gc, cv::Rect(), cv::Mat(), cv::Mat(), 2);
gc &= 0x1; // either foreground or probably foreground
gc *= 255; // so that you see it
Что вы можете потерять, является топологией контура. Требуется некоторая обработка. Кроме того, вы не можете контролировать кривизну или гладкость контура, и это не означает эволюцию контура в смысле.
Только если вы заинтересованы, ИТК геодезический активный контур может быть то, что вы ищете http://www.itk.org/Doxygen/html/classitk_1_1GeodesicActiveContourLevelSetImageFilter.html
Я не думаю, что OpenCV есть готовое решение, но активные модели змеи, как правило, работают хорошо для этого: HTTPS : //en.wikipedia.org/wiki/Active_contour_model –
Несколько изображений могут помочь. Интеллектуальные ножницы используют активные контуры, змеи и т. П. [OpenCV grabcut] (http://docs.opencv.org/master/d8/d83/tutorial_py_grabcut.html#gsc.tab=0) должен работать хорошо. Вы можете попытаться обеспечить как-то переднего плана_ ваш контур. – Miki