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

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

(0)

相关推荐

  • OpenCV实现图像轮廓检测以及外接矩形

    前两篇博文分别介绍了图像的边缘检测和轮廓检测,本文接着介绍图像的轮廓检测和轮廓外接矩形: 一.代码部分: // extract_contours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<cv.h> #include<highgui.h> using namespace cv; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { /

  • opencv实现矩形检测

    本文实例为大家分享了opencv实现矩形检测的具体代码,供大家参考,具体内容如下 #include "cv.h" #include "highgui.h" #include <stdio.h> #include <math.h> #include <string.h> ////////////////////////////////////////////////////////////////// //函数功能:用向量来做COS

  • 使用OpenCV检测图像中的矩形

    本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下 前言 1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现. 2.我这里使用的OpenCV版本是3.30. 矩形检测 1.得到原始图像之后,代码处理的步骤是: (1)滤波增强边缘. (2)分离图像通道,并检测边缘. (3) 提取轮廓. (4)使用图像轮廓点进行多边形拟合. (5)计算轮廓面积并得到矩形4个顶点. (6)求轮廓边缘之间角度的最大余弦. (7)画出矩形. 2.代码 //检测矩形 //

  • openCV提取图像中的矩形区域

    改编自详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)原文是c++版,我改成了python版,供大家参考学习. 主要思想:边缘检测->轮廓检测->找出最大的面积的轮廓->找出顶点->投影变换 import numpy as np import cv2 # 这个成功的扣下了ppt白板 srcPic = cv2.imread('2345.jpg') length=srcPic.shape[0] depth=srcPic.shape[1] polyPic = srcPic shr

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

    介绍 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的昆虫图片数据集了,新图片中很多图片很大,但是图片中的昆虫却很小,所以我就想着先处理一下图片,把图片中的昆虫裁剪下来,这样除去大部分无关背景,应该可以提高识别率. 原图片举例(将红色矩形框部分裁剪出来)): step1:加载图片,转成灰度图 image = cv2.imread("353.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) step2:用Sob

  • 详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)

    前言 最近参加了大创项目,题目涉及到计算机视觉,学姐发了个修正图像的博客链接,于是打算用这个题目入门OpenCV. 分析问题 照片中的PPT区域总是沿着x,y,z三个轴都有倾斜(如下图),要想把照片翻转到平行位置,需要进行透视变换,而透视变换需要同一像素点变换前后的坐标.由此可以想到,提取矩形区域四个角的坐标作为变换前的坐标,变换后的坐标可以设为照片的四个角落,经过投影变换,矩形区域将会翻转并充满图像. 因此我们要解决的问题变为:提取矩形的四个角落.进行透视变换. 提取矩形角落坐标 矩形的检测主

  • C#使用OpenCV剪切图像中的圆形和矩形的示例代码

    前言 本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形. 准备工作 首先创建一个Wpf项目--WpfOpenCV,这里版本使用Framework4.7.2. 然后使用Nuget搜索[Emgu.CV],如下图. 这里的Emgu.CV选择4.3.0.3890版本,然后安装Emgu.CV和Emgu.CV.runtime.windows. 使用OPenCV剪切矩形 现在,我们进入项目,进行OPenCV的调用. 首先引入命名空间,如下: using Emgu.CV; using Emgu.CV.Cv

  • OpenCV选择图像中矩形区域并保存

    本文实例为大家分享了OpenCV选择图像中矩形区域并保存的具体代码,供大家参考,具体内容如下 根据<Learning OpenCV>中的example4.1改写: // An example program in which the // user can draw boxes on the screen. // //#include <cv.h> //#include <highgui.h> #include "opencv2/imgproc/imgproc

  • Python OpenCV基于霍夫圈变换算法检测图像中的圆形

    目录 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + opencv 完整检测代码 ① 源代码 ② 运行效果图 第一章:霍夫变换检测圆 ① 实例演示1 这个是设定半径范围 0-50 后的效果. ② 实例演示2 这个是设定半径范围 50-70 后的效果,因为原图稍微大一点,半径也大了一些. ③ 霍夫变换函数解析 cv.HoughCircles() 方法 参数分别为:image.method.dp.minDist.param1.param2.mi

  • OpenCV提取图像中圆线上的数据具体流程

    目录 需求说明 具体流程 功能函数 C++测试代码 测试效果 总结 需求说明 在对图像进行处理时,经常会有这类需求:客户想要提取出图像中某条直线.圆线或者ROI区域内的感兴趣数据,进行重点关注.该需求在图像检测领域尤其常见.ROI区域一般搭配Rect即可完成提取,直线和圆线数据的提取没有现成的函数,需要自行实现. 直线的提取见: OpenCV获取图像中直线上的数据具体流程 而圆线的提取则是本文要将的内容,对圆线而言,将线上某点作为起点,沿顺时针或逆时针方向依次提取感兴趣数据,可放置在容器中.那么

  • Python使用Keras OCR实现从图像中删除文本

    目录 介绍 处理 实现 Keras ocr简介 cv2修复函数 汇总 结尾 介绍 本文将讨论如何快速地从图像中删除文本,作为图像分类器的预处理步骤. 删除文本可能有多种或多种原因,例如,我们可以使用无文本图像进行数据增强. 在本教程中,我们将使用OCR(光学字符识别)检测图像中的文本,并在修复过程中填充照片中丢失的部分以生成完整的图像——以删除我们检测到的文本. 处理 为了从图像中删除文本,我们将执行以下三个步骤: 1.识别图像中的文本,并使用KerasOCR获取每个文本的边界框坐标. 2.对于

  • Python+OpenCV检测灯光亮点的实现方法

    本篇博文分享一篇寻找图像中灯光亮点(图像中最亮点)的教程,例如,检测图像中五个灯光的亮点并标记,项目效果如下所示: 第1步:导入并打开原图像,实现代码如下所示: # import the necessary packages from imutils import contours from skimage import measure import numpy as np import argparse import imutils import cv2 # construct the arg

随机推荐