OpenCV中判断点在矩形中的方法 您所在的位置:网站首页 cv怎么接剧 OpenCV中判断点在矩形中的方法

OpenCV中判断点在矩形中的方法

2023-05-18 00:00| 来源: 网络整理| 查看: 265

目录

1.问题

2.思路

3.实现

4.资料

1.问题

如图1.1所示,有红色和蓝色两个点,如何判断点相对于矩形的位置呢?

2.思路

首先,我们知道OpenCV中有一个函数:pointPolygonTest()。它的作用是判断一个点是否在轮廓中,基本用法如下:

C++: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist);            当measureDist设置为true时,若返回值为正,表示点在轮廓内部,返回值为负,表示在轮廓外部,返回值为0,表示在轮廓上。             当measureDist设置为false时,若返回值为+1,表示点在轮廓内部,返回值为-1,表示在轮廓外部,返回值为0,表示在轮廓上。

这也就是说,如果我们能够把RotateRect类的对象表示成轮廓,就可以直接调用pointPolygonTest()来进行分析了点的相对位置了。

在这里,我对RotatedRect的成员进行简单的梳理:

RotatedRect ():

构造函数:

1.利用浮点参数进行构造:形心、长宽、旋转角度(x轴逆时针旋转的方向)

RotatedRect (const Point2f ¢er, const Size2f &size, float angle)

2.利用矩形的任意三个角点进行构造(浮点数据)

RotatedRect (const Point2f &point1, const Point2f &point2, const Point2f &point3)

成员函数:

1.返回最小外接矩形

Rect cv::RotatedRect::boundingRect() const

           Rect_ cv::RotatedRect::boundingRect2f() const

2.存储矩形的四个角点

void cv::RotatedRect::points(Point2f pts[]) const

3.返回角度、中心点、尺寸

float angle

Point2f center

Size2f size

最后的问题是:给定点的数组,如何将点的数组转化为向量vector?

方法:

//给定点的数组 Point2f corners[4]; //转化为矢量 Point2f* lastItemPointer = (corners + sizeof corners / sizeof corners[0]); vector contour(corners, lastItemPointer); 3.代码实现

编写判断函数如下:

bool DoesRectangleContainPoint(RotatedRect rectangle, Point2f point) { //转化为轮廓 Point2f corners[4]; rectangle.points(corners); Point2f *lastItemPointer = (corners+sizeof corners/sizeof corners[0]); vector contour(corners,lastItemPointer); //判断 double indicator = pointPolygonTest(contour,point,true); if (indicator >= 0) return true; else return false; }

全部的实验代码如下:

#include #include using namespace cv; using namespace std; bool DoesRectangleContainPoint(RotatedRect rectangle, Point2f point) { //转化为轮廓 Point2f corners[4]; rectangle.points(corners); Point2f *lastItemPointer = (corners+sizeof corners/sizeof corners[0]); vector contour(corners,lastItemPointer); //判断 double indicator = pointPolygonTest(contour,point,true); if (indicator >= 0) return true; else return false; } int main() { //准备数据 Mat img(200,200,CV_8UC3,Scalar(0)); RotatedRect rRect = RotatedRect(Point2f(100,100),Size(100,50),30); Point2f rpoints[4]; rRect.points(rpoints); for (int i = 0; i < 4; i++) line(img, rpoints[i], rpoints[(i + 1) % 4], Scalar(0, 255, 0)); circle(img, Point(100,100),2,Scalar(255,0,0),-1); circle(img, Point(165, 130), 2, Scalar(0, 0, 255), -1); //判断 bool result1 = DoesRectangleContainPoint(rRect, Point(100, 100)); bool result2 = DoesRectangleContainPoint(rRect, Point(165, 130)); //绘制结果(符合条件的用绿色标注) if(result1) circle(img, Point(100, 100), 2, Scalar(0, 255, 0), -1); if (result2) circle(img, Point(165, 130), 2, Scalar(0, 255, 0), -1); return 0; }

实验结果:

 

4.资料

1.RotatedRect类的基本属性:

https://docs.opencv.org/3.4.0/db/dd6/classcv_1_1RotatedRect.html

2.数组转化为向量的简单方法:

https://stackoverflow.com/questions/8777603/what-is-the-simplest-way-to-convert-array-to-vector/8777619#8777619



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有