当前位置:   article > 正文

OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合_外接矩阵 opencv

外接矩阵 opencv

目录

1.轮廓外接最大矩形boundingRect()

2.轮廓外接最小矩形minAreaRect()

3.轮廓外接多边形approxPolyDP()


1.轮廓外接最大矩形boundingRect()

Rect cv::boundingRect ( InputArray array )

  • array:输入的灰度图像或者2D点集,数据类型为vector<Point>或者Mat。

示例代码:

  1. //轮廓最大外接矩阵
  2. void Contour_external_maxmatrix(Mat image) {
  3. Mat gray,binary;
  4. cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
  5. GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
  6. threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
  7. //轮廓检测
  8. vector<vector<Point>> contours;//轮廓
  9. vector<Vec4i> hierarchy;//存放轮廓结构变量
  10. findContours(binary,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
  11. //寻找轮廓的外接矩阵
  12. for(int n=0;n<contours.size();n++) {
  13. //最大外接矩阵
  14. Rect rect = boundingRect(contours[n]);
  15. rectangle(image, rect, Scalar(7, 67, 255), 2, 8, 0);
  16. }
  17. imwrite("/sdcard/DCIM/max.png",image);
  18. }

 轮廓外接最大矩形的结果:

2.轮廓外接最小矩形minAreaRect()

RotatedRect cv::minAreaRect ( InputArray points )

  • array:输入的灰度图像或者2D点集,数据类型为vector<Point>或者Mat。

示例代码:

  1. //轮廓最小外接矩阵
  2. void Contour_external_minmatrix(Mat image){
  3. Mat gray,binary;
  4. cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
  5. GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
  6. threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
  7. //轮廓检测
  8. vector<vector<Point>> contours;//轮廓
  9. vector<Vec4i> hierarchy;//存放轮廓结构变量
  10. findContours(binary,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
  11. //寻找轮廓的外接矩阵
  12. for(int n=0;n<contours.size();n++) {
  13. //最小外接矩阵
  14. RotatedRect rrect= minAreaRect(contours[n]);
  15. Point2f points[4];
  16. rrect.points(points);//读取最小外接矩阵的四个顶点
  17. Point2f cpt=rrect.center;//最小外接矩阵的中心
  18. //绘制旋转矩阵与中心位置
  19. for(int i=0;i<4;i++){
  20. if(i==3){
  21. line(image,points[i],points[0],Scalar(0,0,255,255),2,8,0);
  22. break;
  23. }
  24. line(image,points[i],points[i+1],Scalar(0,0,255,255),2,8,0);
  25. }
  26. //绘制矩阵中心
  27. circle(image,cpt,4,Scalar(0,0,255,255),-1,8,0);
  28. }
  29. imwrite("/sdcard/DCIM/min.png",image);
  30. }

 轮廓外接最小矩形的结果:

 

3.轮廓外接多边形approxPolyDP()

void cv::approxPolyDP (InputArray curve,

OutputArray approxCurve,

double    epsilon,

bool      closed

  • curve:输入轮廓像素点。
  • approxCurve:多边形逼近结果,以多边形顶点坐标的形式给出
  • epsilon:逼近的精度,即原始曲线和逼近曲线之间的最大距离。
  • closed:逼近曲线是否为封闭曲线的标志, true表示曲线封闭,即最后一个顶点与第一个顶点相连

示例代码:

  1. void drawapp(Mat result,Mat img2){
  2. for(int i=0;i<result.rows;i++){
  3. //最后一个坐标点与第一个坐标点连接
  4. if(i==result.rows-1){
  5. Vec2i point1=result.at<Vec2i>(i);
  6. Vec2i point2=result.at<Vec2i>(0);
  7. line(img2,point1,point2,Scalar(0,0,255,255),4,8,0);
  8. break;
  9. }
  10. Vec2i point1=result.at<Vec2i>(i);
  11. Vec2i point2=result.at<Vec2i>(i+1);
  12. line(img2,point1,point2,Scalar(0,0,255,255),4,8,0);
  13. }
  14. }
  15. //轮廓多边形拟合
  16. void Contour_external_matrix(Mat image){
  17. Mat gray,binary;
  18. cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
  19. // GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
  20. // threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
  21. //轮廓的发现与绘制
  22. vector<vector<Point>> contours;//轮廓
  23. vector<Vec4i> hierarchy;//存放轮廓结构变量
  24. findContours(gray,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
  25. //绘制多边形
  26. for(int n=0;n<contours.size();n++) {
  27. //用最小外接矩阵求取轮廓中心
  28. RotatedRect rrect= minAreaRect(contours[n]);
  29. Point2f center=rrect.center;//最小外接矩阵的中心
  30. circle(image,center,2,Scalar(0,0,255,255),2,8,0);
  31. Mat result;
  32. approxPolyDP(contours[n],result,4,true);//多边形拟合
  33. drawapp(result,image);
  34. }
  35. imwrite("/sdcard/DCIM/matrix.png",image);
  36. }

多边形拟合的结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/205169
推荐阅读
相关标签
  

闽ICP备14008679号