opencv求解区域的内接矩形求解区域的内接矩形
主要为大家详细介绍了opencv求解区域的内接矩形,文中示例代码介绍的非常详细,具有一定的参考价值,感
兴趣的小伙伴们可以参考一下
实验室项目中,希望求取一个近似圆形区域的质心,原本使用最小外接圆的质心来等效为该区域质心。但是由于部分区域的形
状过于不规则导致发生质心偏移现象。如下图:
蓝色为实际要求质心。红色为等效圆质心
为获取较为准确的质心,拟用最大内接矩形的中心作为该区域质心。
采用改进的中心扩散法求内接矩形:先以最小外接矩的中心作为算法的起点进行中心扩散。得到一个内解矩形,在对最小外接
矩的中心进行8邻域的遍历,应用中心扩散法分别求取内接矩,以面积最大的内接矩作为最大内接矩。
使用Opencv关键代码如下:
/**
* @brief 求取连通区域内接矩
* @param img:输入图像,单通道二值图,深度为8
* @param center:最小外接矩的中心
* @return 最大内接矩形
* 基于中心扩展算法
*/
cv::Rect InSquare(Mat &img,const Point center)
{
// --[1]参数检测
if(img.empty()||
img.channels()>1
||img.depth()>8)
return Rect();
//[1]
// --[2] 初始化变量
int edge[4];
edge[0]=center.y+1;//top
edge[1]=center.x+1;//right
edge[2]=center.y-1;//bottom
edge[3]=center.x-1;//left
//[2]
// --[3]边界扩展(中心扩散法)
bool EXPAND[4]={1,1,1,1};//扩展标记位
int n=0;
while (EXPAND[0]||EXPAND[1]||EXPAND[2]||EXPAND[3])
{
int edgeID=n%4;
EXPAND[edgeID]=expandEdge(img,edge,edgeID);
n++;
}
//[3]
qDebug()<<edge[0]<<edge[1]<<edge[2]<<edge[3];
Point tl=Point(edge[3],edge[0]);
Point br=Point(edge[1],edge[2]);
return Rect(tl,br);
}
/**
* @brief expandEdge 扩展边界函数
* @param img:输入图像,单通道二值图,深度为8
* @param edge 边界数组,存放4条边界值
* @param edgeID 当前边界号
* @return 布尔值 确定当前边界是否可以扩展
*/
bool expandEdge(const Mat & img, int edge[], const int edgeID)
{
//[1] --初始化参数
int nc=img.cols;
int nr=img.rows;