前言

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.运行结果

使用OpenCV检测图像中的矩形相关推荐

  1. opencv 识别长方形_使用OpenCV检测图像中的矩形

    本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下 前言 1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现. 2.我这里使用的OpenCV版本是3 ...

  2. 使用Python和OpenCV检测图像中的条形码

    使用Python和OpenCV检测图像中的条形码 1. 效果图 2. 算法的步骤 3. 源码 参考 这篇博客将介绍使用计算机视觉和图像处理技术进行条形码检测的必要步骤,并演示使用Python编程语言和 ...

  3. 利用OpenCV检测图像中的多个水果

    OpenCV检测图像中的多个水果 最近面试碰到一个图像算法题,要求: (1)检测一副图像中的多个苹果并标识出来. (2)标识时需要将图像中苹果按照从大到小给定序号,显示出来. 基于以上两点,准备利用C ...

  4. 用 OpenCV 检测图像中各物体大小

    我们需要定义一个比值,它测量每个给定指标的像素个数. 我将其称为「像素/度量」比率,在下一节中我将更正式地定义它. 1.「像素/度量」比率 为了确定图像中物体的大小,我们首先需要使用一个参考物体进行「 ...

  5. 教你如何使用 OpenCV检测图像中的轮廓

    @Author:Runsen 轮廓是连接所有具有某种颜色或强度的连续点的闭合曲线,它们代表图像中发现的对象的形状.轮廓检测是一种用于形状分析和物体检测和识别的有用技术. 轮廓检测并不是图像分割的唯一算 ...

  6. python检测屏幕亮点_使用Python和OpenCV检测图像中的多个亮点

    点击上方"蓝色小字"关注我呀 本文来自光头哥哥的博客[Detecting multiple bright spots in an image with Python and Ope ...

  7. 用python和opencv检测图像中的条形码

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在学习中发现快乐,在应用找到价值.这是我第五期分享图像技术应用的文 ...

  8. 使用Python和OpenCV检测图像中的物体并将物体裁剪下来

    原文:http://blog.csdn.net/liqiancao/article/details/55670749 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的昆虫图片数据 ...

  9. python图像检测_如何用Python检测图像中的矩形项

    我发现了很多关于使用openCV等人在图像中找到"东西"的问题.在 Python中,但到目前为止,我一直无法将它们拼凑在一起,以便为我的问题提供可靠的解决方案. 我正在尝试使用计算 ...

最新文章

  1. e class connect.php,剖析帝国CMS核心文件e/class/connect.php中的常用函数
  2. 前端用crypto.js进行加密和解密
  3. 如何使用 ABAP 手动解析 multipart/form-data 格式的数据
  4. 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
  5. 对于初学者,如何轻松学习JavaScript?
  6. 浅谈 标准的代号和编号
  7. 中考 计算机录取 步骤,中考录取时间及录取流程详解
  8. hmcl手机版_hmcl启动器手机版下载-hmcl启动器安卓版下载mod附教程_易玩网
  9. 华东理工大学本科毕业论文答辩和论文选题PPT模板
  10. 华为耗资100亿元的研发基地着火了?
  11. 美团java面试题_美团java面试题分享,一面
  12. 注意力模型(Attention Model)理解和实现
  13. Airtest连接夜神模拟器
  14. Wrashall算法,自反性,对称性的实现
  15. 保险智能理赔-医疗票据OCR识别解决方案
  16. hdfs大概流程和命令操作
  17. 【Docker学习笔记 五】深入理解Docker容器数据卷机制
  18. 802.11n 技术简结
  19. 标题党 数据抓取与管理
  20. 如何在Qt中使用数据库Sqlite保存和提取图片

热门文章

  1. python中的gui界面编程_python应用系列教程——python的GUI界面编程Tkinter全解
  2. 一篇超级详细的jsp+servlet+jdbc+mysql检验登录操作(IntelliJ IDEA)
  3. 机器人II(sdutoj2585)-JAVA
  4. Vs2010 MFC 简单制作过程中的问题
  5. git tag 介绍
  6. Java 内存模型及GC原理
  7. Hadoop的调度器总结
  8. 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
  9. MIT自然语言处理第二讲:单词计数(第三、四部分)
  10. 取消gVim自动生成备份文件~文件