当前位置: 首页 > 编程笔记 >

使用OpenCV检测图像中的矩形

卢志行
2023-03-14
本文向大家介绍使用OpenCV检测图像中的矩形,包括了使用OpenCV检测图像中的矩形的使用技巧和注意事项,需要的朋友参考一下

本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下

前言

1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现。
2.我这里使用的OpenCV版本是3.30.

矩形检测

1.得到原始图像之后,代码处理的步骤是:

(1)滤波增强边缘。
(2)分离图像通道,并检测边缘。
(3) 提取轮廓。
(4)使用图像轮廓点进行多边形拟合。
(5)计算轮廓面积并得到矩形4个顶点。
(6)求轮廓边缘之间角度的最大余弦。
(7)画出矩形。

2.代码

//检测矩形
//第一个参数是传入的原始图像,第二是输出的图像。
void findSquares(const Mat& image,Mat &out)
{
 int thresh = 50, N = 5;
 vector<vector<Point> > squares;
 squares.clear();

 Mat src,dst, gray_one, gray;

 src = image.clone();
 out = image.clone();
 gray_one = Mat(src.size(), CV_8U);
 //滤波增强边缘检测
 medianBlur(src, dst, 9);
 //bilateralFilter(src, dst, 25, 25 * 2, 35);

 vector<vector<Point> > contours;
 vector<Vec4i> hierarchy;

 //在图像的每个颜色通道中查找矩形
 for (int c = 0; c < image.channels(); c++)
 {
 int ch[] = { c, 0 };

 //通道分离
 mixChannels(&dst, 1, &gray_one, 1, ch, 1);

 // 尝试几个阈值
 for (int l = 0; l < N; l++)
 {
  // 用canny()提取边缘
  if (l == 0)
  {
  //检测边缘
  Canny(gray_one, gray, 5, thresh, 5);
  //膨脹
  dilate(gray, gray, Mat(), Point(-1, -1));
  imshow("dilate", gray);
  }
  else
  {
  gray = gray_one >= (l + 1) * 255 / N;
  }

  // 轮廓查找
  //findContours(gray, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
  findContours(gray, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);

  vector<Point> approx;
  
  // 检测所找到的轮廓
  for (size_t i = 0; i < contours.size(); i++)
  {
  //使用图像轮廓点进行多边形拟合
  approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);

  //计算轮廓面积后,得到矩形4个顶点
  if (approx.size() == 4 &&fabs(contourArea(Mat(approx))) > 1000 &&isContourConvex(Mat(approx)))
  {
   double maxCosine = 0;

   for (int j = 2; j < 5; j++)
   {
   // 求轮廓边缘之间角度的最大余弦
   double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]));
   maxCosine = MAX(maxCosine, cosine);
   }

   if (maxCosine < 0.3)
   {
   squares.push_back(approx);
   }
  }
  }
 }
 }

 
 for (size_t i = 0; i < squares.size(); i++)
 {
 const Point* p = &squares[i][0];

 int n = (int)squares[i].size();
 if (p->x > 3 && p->y > 3)
 {
  polylines(out, &p, &n, 1, true, Scalar(0, 255, 0), 3, LINE_AA);
 }
 }
 imshow("dst",out);
}

static double angle(Point pt1, Point pt2, Point pt0)
{
 double dx1 = pt1.x - pt0.x;
 double dy1 = pt1.y - pt0.y;
 double dx2 = pt2.x - pt0.x;
 double dy2 = pt2.y - pt0.y;
 return (dx1*dx2 + dy1*dy2) / sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}

3.运行结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 我已经了解了如何使用PIL检测图像中的边缘(图像大部分是白色背景和黑色绘图标记)。如何检测包含这些边的矩形,以便裁剪图像。 例如,我想裁剪如下内容: 成: 或者这个: 成: 我熟悉PIL中的裁剪,但不知道如何围绕对象自动居中。 我已通过执行以下操作来检测边缘: 如何得到包含所有这些边的矩形?

  • 我想知道如何使用OpenCV在我的摄像机上检测图像。该图像可以是500个图像中的一个。 我此刻正在做的事: 我想要检测的图像是2-5KB小的。很少有人在上面发短信,但其他的只是一些迹象。这里有一个例子: 你们知道我怎么做吗?

  • 本文向大家介绍opencv实现矩形检测,包括了opencv实现矩形检测的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了opencv实现矩形检测的具体代码,供大家参考,具体内容如下 效果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我的任务是使用OpenCV检测给定图像中的对象(我不关心它是Python还是C++实现)。下面的三个示例中显示的对象是一个黑色矩形,其中包含五个白色矩形。所有维度都是已知的。 但是,图像的旋转、比例、距离、透视、光照条件、相机对焦/镜头、背景都是未知的。黑色矩形的边缘不能保证是完全可见的,但是在五个白色矩形前面不会有任何东西--它们总是完全可见的。最终目标是能够在图像中检测到该对象的存在,并旋转、

  • 本文向大家介绍openCV提取图像中的矩形区域,包括了openCV提取图像中的矩形区域的使用技巧和注意事项,需要的朋友参考一下 改编自详解利用OpenCV提取图像中的矩形区域(PPT屏幕等) 原文是c++版,我改成了python版,供大家参考学习。 主要思想:边缘检测—》轮廓检测—》找出最大的面积的轮廓—》找出顶点—》投影变换 运行效果 用到的图片 以上就是本文的全部内容,希望对大家的学习有所帮助

  • 我有一个盒子的图像。我试图检测角点并从圆圈中标记这些角点。我正在为此使用以下代码: