Рассчитать ограничивающий прямоугольник из маски извлечения тела

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

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;

}

РЕДАКТИРОВАТЬ:

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 балла не по всем контурам изображения. Как я могу это сделать?

0

Решение

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

Пример использования можно найти здесь: Как нарисовать прямоугольник вокруг контуров?

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]