OpenCV实现绘制轮廓外接矩形

目录
  • 1.寻找轮廓
  • 2.绘制轮廓外接矩形
  • 3.代码

1.寻找轮廓

api

void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point()

各个参数详解如下:

Image表示输入图像,必须是二值图像,二值图像可以threshold输出、Canny输出、inRange输出、自适应阈值输出等。

Contours获取的轮廓,每个轮廓是一系列的点集合

Hierarchy轮廓的层次信息,每个轮廓有四个相关信息,分别是同层下一个、前一个、第一个子节点、父节点

mode 表示轮廓寻找时候的拓扑结构返回 -RETR_EXTERNAL表示只返回最外层轮廓 -RETR_TREE表示返回轮廓树结构

  • CV_RETR_EXTERNAL:只检测外轮廓。忽略轮廓内部的洞
  • CV_RETR_LIST:检测所有轮廓,但不建立继承(包含)关系
  • CV_RETR_TREE:检测所有轮廓,并且建立所有的继承(包含)关系。也就是说用CV_RETR_EXTERNAL和CV_RETR_LIST方法的时候hierarchy这个变量是没用的,因为前者没有包含关系,找到的都是外轮廓,后者仅仅是找到所哟的轮廓但并不把包含关系区分。用TREE这种检测方法的时候我们的hierarchy这个参数才是有意义的
  • CV_RETR_CCOMP:检测所有轮廓,但是仅仅建立两层包含关系。外轮廓放到顶层,外轮廓包含的第一层内轮廓放到底层,如果内轮廓还包含轮廓,那就把这些内轮廓放到顶层去。

Method表示轮廓点集合取得是基于什么算法,常见的是基于CHAIN_APPROX_SIMPLE链式编码方法

注意,如果图像底色是白色,则检测最外层的轮廓为图像边框

2.绘制轮廓外接矩形

绘制外接矩形包括两种:

绘制最大外接矩形

(Rect cv::boundingRect( InputArray points ))

其中,输入参数points为一系列点的集合(findContours中contours中的一个元素),对轮廓来说就是该轮廓的点集 返回结果是一个矩形,x, y, w, h

绘制最小外接矩形

RotatedRect cv::minAreaRect( InputArray points )

其中,输入参数points为一系列点的集合(findContours中contours中的一个元素) ,对轮廓来说就是该轮廓的点集 返回结果是一个旋转矩形,包含下面的信息: - 矩形中心位置 - 矩形的宽高 - 旋转角度。

3.代码

EdgeDetection.h

#pragma once
#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

class EdgeDetection
{
    cv::Mat m_img;
    cv::Mat m_canny;
public:
    EdgeDetection(cv::Mat iamge);
    bool cannyProcess(unsigned int downThreshold,unsigned int upThreshold);
    bool getContours();

    ~EdgeDetection();
};

EdgeDetection.cpp

#include "EdgeDetection.h"

EdgeDetection::EdgeDetection(cv::Mat image)
{
    m_img = image;
}

bool EdgeDetection::cannyProcess(unsigned int downThreshold, unsigned int upThreshold)
{
    bool ret=true;

    if (m_img.empty())
    {
        ret = false;
    }

    cv::Canny(m_img, m_canny, downThreshold, upThreshold);
    cv::imshow("Canny", m_canny);

    return ret;
}

bool EdgeDetection::getContours()
{
    bool ret = true;
    if (m_canny.empty())
    {
        ret = false;
    }

    cv::Mat k = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3), cv::Point(-1, -1));
    cv::dilate(m_canny, m_canny, k);
    imshow("dilate", m_canny);

    // 轮廓发现与绘制
    vector<vector<cv::Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(m_canny, contours, cv::RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());

    for (size_t i = 0; i < contours.size();++i)
    {
        // 最大外接轮廓
        cv::Rect rect = cv::boundingRect(contours[i]);
        cv::rectangle(m_img,rect,cv::Scalar(0,255,0),2,LINE_8);

        // 最小外接轮廓
        RotatedRect rrt = minAreaRect(contours[i]);
        Point2f pts[4];
        rrt.points(pts);
        // 绘制旋转矩形与中心位置
        for (int i = 0; i < 4; i++) {
            line(m_img, pts[i % 4], pts[(i + 1) % 4], Scalar(0, 0, 255), 2, 8, 0);
        }
        Point2f cpt = rrt.center;
        circle(m_img, cpt, 2, Scalar(255, 0, 0), 2, 8, 0);
    }

    imshow("contours", m_img);
    return ret;
}

EdgeDetection::~EdgeDetection()
{
}

main.cpp

#include"EdgeDetection.h"
using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    Mat src = imread("rect.jpg");
    if (src.empty())
    {
        cout << "image is empty" << endl;
        return -1;
    }

    imshow("input", src);

    EdgeDetection ed(src);

    ed.cannyProcess(80,160);
    ed.getContours();

    waitKey(0);
    return 0;
}

原图

canny

目标图

到此这篇关于OpenCV实现绘制轮廓外接矩形的文章就介绍到这了,更多相关OpenCV轮廓外接矩形内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV实现最小外接正矩形

    本文实例为大家分享了OpenCV实现最小外接正矩形的具体代码,供大家参考,具体内容如下 #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "cxcore.h" #include "math.h" #include <iostream.h> int main(int argc, char* argv[]) { Ipl

  • 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[]) { /

  • python opencv 画外接矩形框的完整代码

    画外接矩形框,可以画成一个最大的,也可以分别画. # -*- coding: utf-8 -*- import cv2 image = cv2.imread('G:/110w2/mask_tif4/00.png') print(image.shape) print(image.shape[0]) # h print(image.shape[1]) # w # 图像转灰度图 img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #cv2.imwrite('G:

  • Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAreaRect( InputArray points ); 输入参数points是所要求最小外结矩的点集数组或向量: minEnclosingCircle方法原型: void minEnclosingCircle( InputArray points, CV_OUT Point2f& center, C

  • Opencv实现最小外接矩形和圆

    本文实例为大家分享了Opencv实现最小外接矩形和圆的具体代码,供大家参考,具体内容如下 步骤:将一幅图像先转灰度,再canny边缘检测得到二值化边缘图像,再寻找轮廓,轮廓是由一系列点构成的,要想获得轮廓的最小外接矩形,首先需要得到轮廓的近似多边形,用道格拉斯-普克抽稀(DP)算法,道格拉斯-普克抽稀算法,是将曲线近似表示为一系列点,并减少点的数量的一种算法. 该算法实现抽稀的过程是: 1)对曲线的首末点虚连一条直线,求曲线上所有点与直线的距离,并找出最大距离值dmax,用dmax与事先给定的阈

  • OpenCV实现绘制轮廓外接矩形

    目录 1.寻找轮廓 2.绘制轮廓外接矩形 3.代码 1.寻找轮廓 api void cv::findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point() 各个参数详解如下: Image表示输入图像,必须是二值图像,二值图像可以threshold输出.Canny输出.inRange输出.自适

  • python opencv minAreaRect 生成最小外接矩形的方法

    使用python opencv返回点集cnt的最小外接矩形,所用函数为 cv2.minAreaRect(cnt) ,cnt是点集数组或向量(里面存放的是点的坐标),并且这个点集不定个数. 举例说明:画一个任意四边形(任意多边形都可以)的最小外接矩形,那么点集 cnt 存放的就是该四边形的4个顶点坐标(点集里面有4个点) cnt = np.array([[x1,y1],[x2,y2],[x3,y3],[x4,y4]]) # 必须是array数组的形式 rect = cv2.minAreaRect(

  • Python实现图片查找轮廓、多边形拟合、最小外接矩形代码

    1.概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用.本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试. 原图为: 2.测试代码: import cv2 import numpy as np img = cv2.imread('/home/yasin/coffe.jpg') img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, contours, hierarchy = cv2.findContours(img_g

  • OpenCV实现轮廓外接多边形

    本文实例为大家分享了OpenCV实现轮廓外接多边形的具体代码,供大家参考,具体内容如下 取轮廓最大外接矩形 Rect boundingRect( InputArray array ); array:输入的灰度图像或者2D点集,数据类型为vector或者Mat. 该函数可以求取包含输入图像中物体轮廓或者2D点集的最大外接矩形,函数只有一个参数,可以是灰度图像或者2D点集,灰度图像的参数类型为Mat,2D点集的参数类型为vector或者Mat.该函数的返回值是一个Rect类型的变量,该变量可以直接用

  • opencv python 图像轮廓/检测轮廓/绘制轮廓的方法

    图像的轮廓检测,如计算多边形外界.形状毕竟.计算感兴趣区域等. Contours : Getting Started 轮廓 简单地解释为连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度. 轮廓是形状分析和物体检测和识别的有用工具 NOTE 为获得更好的准确性,请使用二值图,在找到轮廓之前,应用阈值法或canny边缘检测 从OpenCV 3.2开始,findContours()不再修改源图像,而是将修改后的图像作为三个返回参数中的第一个返回 在OpenCV中,查找轮廓是从黑色背景中查找白色对

  • opencv提取外部轮廓并在外部加矩形框

    这段时间一直在用opencv搞图像处理的问题,发现虽然可调用的函数多,但是直接找相应代码还是很困难,就行寻找连通域,并在连通域外侧加框,对于习惯使用Mat矩形操作的我,真心感觉代码少之又少,为防止以后自己还会用到,特在此记录一下. 要对下面的图像进行字符的边缘检测. 程序中具体的步骤为: (1)灰度化.二值化 (2)图像膨胀 (3)检测膨胀图像的边缘并叫外矩形框 实现代码如下: #include "stdafx.h" #include "stdio.h" #incl

  • python3+openCV 获取图片中文本区域的最小外接矩形实例

    我就废话不多说了,大家还是直接看代码吧! print("thresh =",thresh) coords = np.column_stack(np.where(thresh > 0))//获取thresh二值灰度图片中的白色文字区域的点 print("coords =",coords) min_rect = cv2.minAreaRect(coords)//由点集获取最小矩形(包含中心坐标点.宽和高.偏转角度) print("min_rec =&qu

随机推荐