在目标识别中我们首先要把感兴趣的目标提取出来,而一般常见的步骤都是通过颜色或纹理提取出目标的前景图(一幅黑白图像,目标以白色显示在图像中),接下来我们要对前景图进行分析进一步地把目标提取出来,而这里常常用到的就是提取目标的轮廓。OpenCV 里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像,输出的是每一个连通区域的轮廓点的集合:vector<vector<Point>>。外层vector的size代表了图像中轮廓的个数,里面vector的 size代表了轮廓上点的个数。下面我们通过实例来看函数的用法。提取到轮廓后,其实我们更关心的是如果把这些轮廓转换为可以利用的特征,也就是涉及到轮廓的描述问题,这时就有多种方法可以选择,比如矢量化为多边形、矩形、椭圆等。OpenCV里提供了一些这样的函数。
1、获取包围对象的垂直矩阵cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));
cv::rectangle(result,r0,cv::Scalar(0),2);
Calculates the up-right bounding rectangle of a point set.
-
C++: Rect boundingRect(InputArray points)
-
Python: cv2.boundingRect(points) → retval
-
C: CvRect cvBoundingRect(CvArr* points, int update=0 )
-
Parameters:
The function calculates and returns the minimal up-right bounding rectangle for the specified point set.
输入参数points是所要求最小外结矩的点集数组或向量.
cv::Rect r0= cv::boundingRect(cv::Mat(contours[0]));
cv::rectangle(result,r0,cv::Scalar(0),2);
- // 轮廓表示为一个矩形
- Rect r = boundingRect(Mat(contours[0])); //矩形
- rectangle(result, r, Scalar(255), 2);
- Mat srcImage(Size(500,500), CV_8UC3, Scalar(0));
- vector <Point> points ;
- Rect rect=boudingRect(points); //随机生成点集
- rectangle(srcImage,rect,Scalar(0,255,0),2); 选择区域Rect
1)构造函数 Rect(x,y,width,height),x, y 为左上角坐标, width, height 则为长和宽。
2)方法 contain(Point) 可返回改点是否在矩形内。
3)方法 inside(Rect) 可返回该矩形是否在矩形内。
4)交集 Rect=Rect1&Rect2
5) 并集 Rect=Rect1|Rect2
6) 平移 RectShift=Rect+Point
7) 缩放 RectScale=Rect+Size
8) 利用对角线两点来画矩形:
void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)
9) 传入矩形参数来画矩形:
void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )