2014-02-20 3 views
0

У меня есть файл двоичного мата, который содержит только черно-белый пиксель. В основном это маска для извлечения тела, и я хочу рассчитать ограничивающий прямоугольник. Как я могу рассчитать минимальное и максимальное значение белого из этого двоичного изображения, чтобы рассчитать вычисленный боудинг? Мой код:Вычислить ограничительную рамку из маски выделения тела

Mat bodyEx(string filename){ 

cv::Mat matInput=cv::imread(filename); 

//Set mask 
cv::Mat matMask = cv::Mat::ones(matInput.size(), CV_8U) * cv::GC_BGD; 
cv::Rect area; 
area.x=int(matInput.cols*0.1); area.y=int(matInput.rows*0.05); 
area.width=int(matInput.cols-2*area.x); 
area.height=int(matInput.rows-2*area.y); 
rectangle(matMask, area , cv::Scalar(cv::GC_PR_FGD),-1,8,0); 
area.x=int(matInput.cols*0.35); area.y=int(matInput.rows*0.25); 
area.width=matInput.cols-2*area.x; 
area.height=matInput.rows-2*area.y; 
rectangle(matMask, area , cv::Scalar(cv::GC_FGD),-1,8,0); 

//Segmentation 
cv::Mat bgd,fgd; 
cv::grabCut(matInput, matMask, area, bgd, fgd, 1, cv::GC_INIT_WITH_MASK); 
matMask= matMask&1; 
cv::compare(matMask,cv::GC_FGD,matMask,cv::CMP_EQ); 
cv::Mat matSegmented=cv::Mat::zeros(matInput.size(),CV_8UC3); 
matInput.copyTo(matSegmented,matMask); 


int lowestWhite_x; int lowestWhite_y; 
cout << "Rows " << matMask.rows << " and cols: "<< matMask.cols << endl; 
for (int row=0;row<matMask.rows;row++) 
    { 
     for (int col=0;col<matMask.cols;col++) 
     { 
      if(matMask.at<uchar>(row,col) != 0){lowestWhite_x = row; lowestWhite_y = col;} 
     } 
    } 

cout << "Rows " << lowestWhite_x << " and cols: "<< lowestWhite_y << endl; 
//Display 
/*cv::imshow("InputImage",matInput); 
cv::imshow("mask",matMask); 
cv::imshow("Segmented",matSegmented); 
cvWaitKey();*/ 

return matSegmented; 

}

EDIT:

Rect faceRect, brect; 
std::vector<std::vector<cv::Point> > contours; 
std::vector<cv::Vec4i> hierarchy; 
cv::findContours(matMask, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_TC89_KCOS); 
for (size_t i=0; i<contours.size(); ++i) 
{ 
    cv::drawContours(matInput, contours, i, Scalar(0,255,0), 1, 8, hierarchy, 0, Point()); 
    cv::Rect brect = cv::boundingRect(contours[i]); 
    cv::rectangle(matInput, brect, Scalar(0,255,0)); 
    cout << brect.size() << endl; 
} 

Он вычисляет все контуры. Наконец, я хочу сохранить bb. 4 указывает не все контуры изображения. Как я могу это сделать?

ответ

1

Найти контуры на двоичном изображении с помощью функции findContours и найти ограничивающий прямоугольник с помощью функции boundingRect.

Пример использования можно найти здесь: How to draw a rectangle around the contours?

Ответ на ваши изменения: Попробуйте Rect myRect = boundingRect(contours[i]); вместо Rect myRect = boundingRect(contours); неправильно.

+0

Что именно я рассчитываю с помощью findContours? –

+0

В вашем замаскированном изображении лицо будет белым и черным. Рассмотрим два объекта белого цвета, оба разделенных. Используя эту функцию, она различает разные объекты, не связанные с соединением, и выводит ограничивающие точки всех объектов. Таким образом, вы получаете ограничительную точку лица в образе. boundingRect рисует прямоугольник, соединяющий эти ограничивающие точки. –

+0

вектор <контур>> контуры; vector иерархия; findContours (matMask, контуры, иерархия, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point (0, 0)); Rect myRect = boundingRect (контуры); –

Смежные вопросы