Я хочу получить все соседние пиксели начальной точки, которые помечены как GC_PR_FGD или GC_FGD в маске после вызова grabcut в OpenCV.Я думал об использовании алгоритма поиска примерно так:
vector<Point> pixels_in_component;
vector<Point> neighbours;
Point starting_point;
void GCApplication::reducedPixels(){
neighbours.push_back(starting_point);
while(!neighbours.empty()){
Point p = neighbours.back();
neighbours.pop_back();
pixels_in_component.push_back(p);
double x = p.x;
double y = p.y;
if(x > 0) //Left
{
uchar left_val = mask.at<uchar>(y,x-1);
if(left_val == GC_FGD || left_val == GC_PR_FGD)
neighbours.push_back(Point(y,x-1));
}
if(y>0 && x>0) //upLeft
{
uchar upLeft_val = mask.at<uchar>(y-1,x-1);
if(upLeft_val == GC_FGD || upLeft_val == GC_PR_FGD)
neighbours.push_back(Point(y-1,x-1));
}
if(y>0) //up
{
uchar up_val = mask.at<uchar>(y-1,x);
if(up_val == GC_FGD || up_val == GC_PR_FGD)
neighbours.push_back(Point(y-1,x));
}
if(y>0 && x<mask.cols-1) //upright
{
uchar upRight_val = mask.at<uchar>(y-1,x+1);
if(upRight_val == GC_FGD || upRight_val == GC_PR_FGD)
neighbours.push_back(Point(y-1,x+1));
}
}
CV_Assert( !mask.empty() );
mask.setTo( GC_BGD );
for(vector<Point>::iterator it = pixels_in_component.begin(); it != pixels_in_component.end(); it++){
mask.at<uchar>(it->y,it->x) = GC_FGD;
}
}
Но проблема в том, что он не обнаруживает все соседние пиксели.Фактически это обнаруживает очень немногие из этого.Я использую grabCut из здесь .