原图:(图1)
图1
希望得到的结果图:
图2
找到左右边界框的效果图:(图3)
图3
代码:
void findX(Mat&outputXImage,int*min,int*max)//找到左右边界框
{
introwNumber=outputXImage.rows;//行数
intcolNumber=outputXImage.cols;//列数
for(inti = 0; i < colNumber; i++)//列循环
{
for(intj = 0; j <rowNumber; j++)
{
uchar* data=outputXImage.ptr<uchar>(j);//获取第j行的首地址
if(data[i]==0)
{
*min=i;
i=colNumber;
break;
}
}
}
for(inti = colNumber-1; i>=0; --i)//列循环
{
for(intj = 0; j <rowNumber; j++)
{
uchar* data=outputXImage.ptr<uchar>(j);//获取第j行的首地址
if(data[i]==0)
{
*max=i;
i=-1;
break;
}
}
}
}
void findY(Mat&outputYImage,int*min1,int*max1)//找到上下边界框
{
introwNumber=outputYImage.rows;//行数
intcolNumber=outputYImage.cols;//列数
for(inti = 0; i < rowNumber ; i++)//行循环
{
uchar* data=outputYImage.ptr<uchar>(i);//获取第i行的首地址
for(intj = 0; j <colNumber; j++)
{
if(data[j]==0)
{
*min1=i;
i=rowNumber;
break;
}
}
}
for(inti =rowNumber-1; i >=0 ; i--)//行循环
{
uchar* data=outputYImage.ptr<uchar>(i);//获取第i行的首地址
for(intj = 0; j <colNumber ;j++)//列循环
{
if(data[j]==0)
{
*max1=i;
i=-1;
break;
}
}
}
}
void preprocess::findBB()//找到bounding Box
{MatoutputImage=binImage.clone();//复制实参到临时变量
intminX=0,maxX=0,minY=0,maxY=0;
findX(outputImage,&minX,&maxX);//找到左右边界框
Mat imageROIX=outputImage(Rect(minX,0,maxX-minX,outputImage.rows));
findY(imageROIX,&minY,&maxY);//找到上下边界框
Mat imageROIY=imageROIX(Rect(0,minY,imageROIX.cols,maxY-minY));
}
代码运行环境:VS2012+openCV2.4.9