C++ 从实体提取遮罩计算边界框

C++ 从实体提取遮罩计算边界框,c++,opencv,bounding-box,C++,Opencv,Bounding Box,我有一个二进制mat文件,它只包含黑白像素。基本上是一个身体提取遮罩,我想计算边界框。如何从该二值图像中计算最小和最大白度值,以便计算已计算形状的束盒?我的代码: 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; ar

我有一个二进制mat文件,它只包含黑白像素。基本上是一个身体提取遮罩,我想计算边界框。如何从该二值图像中计算最小和最大白度值,以便计算已计算形状的束盒?我的代码:

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;
Mat bodyEx(字符串文件名){
cv::Mat matInput=cv::imread(文件名);
//设置掩码
cv::Mat matMask=cv::Mat::ones(matInput.size(),cv_8U)*cv::GC_BGD;
cv::直肠区;
area.x=int(matInput.cols*0.1);area.y=int(matInput.rows*0.05);
面积宽度=int(matInput.cols-2*area.x);
面积高度=int(matInput.rows-2*area.y);
矩形(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);
面积.width=matInput.cols-2*面积.x;
面积高度=matInput.rows-2*area.y;
矩形(matMask,面积,cv::标量(cv::GC_FGD),-1,8,0);
//分段
cv::Mat bgd,fgd;
cv::grabCut(matInput、matMask、area、bgd、fgd、1,cv::GC_INIT_和_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使用函数查找二值图像上的轮廓,并使用函数查找边界矩形

可在此处找到该用法的示例:

对您的编辑的响应:
尝试
Rect-myRect=boundingRect(等高线[i]);
而不是
Rect-myRect=boundingRect(等高线)

是错误的。< /p>我用FixTrimes计算的是什么?在你的掩蔽图像中,这个人是白色和背景黑色的。考虑有两个白色的物体,都是分开的。使用这个函数,它区分了不同的非连接物体并输出所有物体的边界点。图像中的人物。boundingRect绘制一个连接这些边界点的矩形。矢量轮廓;矢量层次;findContours(matMask,轮廓,层次,CV_RETR_树,CV_CHAIN_近似,点(0,0));Rect myRect=boundingRect(轮廓);Rect myRect=boundingRect(轮廓[i]);好的,我知道了,最后我要找到具有最高宽度和高度的轮廓。
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;
}