【OPENCV】点与RotatedRect矩形的包含关系

【背景】

Opencv中Rect:

bool  contains (const Point_< _Tp > &pt) const
  checks whether the rectangle contains the point
Rect(正矩形)有函数contains判断一个点是否在矩形内,任意角度矩形怎么判断(RotateRect)?

【误区】

RotateRect中boundingRect是最小外接正矩形,而不是任意矩形

【解决方案】

//坐标点
Point2f ptf;
//任意角度矩形
RotatedRect rrect;
Point2f ptf[4];
rrect.points(ptf4);
注:ptf4矩形四个点,ptf坐标点,fAngle矩形的旋转角度。
bool isPointInRect(Point2f *ptf4,Point2f ptf,float fAngle)
{
	Point2f ptf4Vector[4];
	int nQuadrant[4]={0};
	fAngle *=CV_PI/180.0*(-1); 

	for (int idx=0;idx<4;idx++)
	{
		float fDifx = float(ptf.x - ptf4[idx].x);
		float fDify = float(ptf.y - ptf4[idx].y);
		int nDifx =fDifx*cos(fAngle)-fDify*sin(fAngle);
		int nDify =fDifx*sin(fAngle)+fDify*cos(fAngle);

		//第一象限
		if(nDifx >=0 &&nDify >=0)
			nQuadrant[0]++;
		//第二象限
		if(nDifx <0 &&nDify >=0)
			nQuadrant[1]++;
		//第三象限
		if(nDifx <0 &&nDify <0)
			nQuadrant[2]++;
		//第四象限
		if(nDifx >0 &&nDify <0)
			nQuadrant[3]++;
	}
	//判断四个向量是否在相邻的两个象限
	int firstIdx =-1;
	int secIdx =-1;
	int countNum =0;
	for (int idx=0;idx<4;idx++)
	{
		if(nQuadrant[idx] !=0)
		{
			if(firstIdx ==-1)
				firstIdx =idx;
			else if(secIdx ==-1 &&firstIdx != -1)
				secIdx =idx;
			
			countNum++;
		}
	}

	if(countNum<=2)
		if(abs(firstIdx -secIdx) ==1 || abs(firstIdx -secIdx) ==3 ||(countNum==1&&(firstIdx ==-1||secIdx==-1)))
			return false;
	return true;
}



   

你可能感兴趣的:(OPENCV积累)