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

Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle。

minAreaRect方法原型:

RotatedRect minAreaRect( InputArray points ); 

输入参数points是所要求最小外结矩的点集数组或向量;

minEnclosingCircle方法原型:

void minEnclosingCircle( InputArray points,
                   CV_OUT Point2f& center, CV_OUT float& radius ); 

第一个参数points是所要求最小外结圆的点集数组或向量;

第二个参数Point2f类型的center是求得的最小外接圆的中心坐标;

第三个参数float类型的radius是求得的最小外接圆的半径;

使用minAreaRect和minEnclosingCircle方法分别求最小外接矩和圆:

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include "iostream" 

using namespace std;
using namespace cv;  

int main(int argc,char *argv[])
{
  Mat imageSource=imread(argv[1],0);
  imshow("Source Image",imageSource);
  Mat image;
  blur(imageSource,image,Size(3,3));
  threshold(image,image,0,255,CV_THRESH_OTSU);
  imshow("Threshold Image",image); 

  //寻找最外层轮廓
  vector<vector<Point>> contours;
  vector<Vec4i> hierarchy;
  findContours(image,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point()); 

  Mat imageContours=Mat::zeros(image.size(),CV_8UC1); //最小外接矩形画布
  Mat imageContours1=Mat::zeros(image.size(),CV_8UC1); //最小外结圆画布
  for(int i=0;i<contours.size();i++)
  {
    //绘制轮廓
    drawContours(imageContours,contours,i,Scalar(255),1,8,hierarchy);
    drawContours(imageContours1,contours,i,Scalar(255),1,8,hierarchy); 

    //绘制轮廓的最小外结矩形
    RotatedRect rect=minAreaRect(contours[i]);
    Point2f P[4];
    rect.points(P);
    for(int j=0;j<=3;j++)
    {
      line(imageContours,P[j],P[(j+1)%4],Scalar(255),2);
    } 

    //绘制轮廓的最小外结圆
    Point2f center; float radius;
    minEnclosingCircle(contours[i],center,radius);
    circle(imageContours1,center,radius,Scalar(255),2); 

  }
  imshow("MinAreaRect",imageContours);
  imshow("MinAreaCircle",imageContours1);
  waitKey(0);
  return 0; 

作图步骤:

1. 对原始图像均值滤波并二值化;

2. 求图像的最外层轮廓;

3.  使用minAreaRect方法求轮廓的最小外接矩形,转化求得矩形的四个顶点坐标,并绘制矩形;

4.  使用minEnclosingCircle方法求轮廓的最小外接圆,获取圆心和半径信息,并绘制圆;

原始图像:

最小外接矩:

最小外接圆:

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

(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中求点集的最小外结矩使用方法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与事先给定的阈

  • 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(

  • 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

  • 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实现绘制轮廓外接矩形

    目录 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和pillow两个库都具有相应的函数,但是这两个库中的函数仅仅能对与图片平行的矩形进行裁剪操作,如果想要对目标的最小外接矩形进行裁剪该如何操作呢?如下所示: 具体处理该问题的思路如下: 计算最小外接矩形的四个点的坐标,旋转角度 将原图像进行旋转,旋转角度为最小外接矩形的角度 将四个点的坐标进行映射,求出被旋转后图像的四个点的坐标 利用这四个点对图像进行裁剪 图像原图如下: 1 求出该区域的最小外接矩形,并且得到外接矩形的四个点的坐标和旋转角度. rect = cv2

  • OpenCV绘制圆端矩形的示例代码

    目录 功能函数 测试代码 测试效果 本文主要介绍了OpenCV绘制圆端矩形的示例代码,分享给大家,具体如下: 功能函数 // 绘制圆端矩形(药丸状,pill) void DrawPill(cv::Mat mask, const cv::RotatedRect &rotatedrect, const cv::Scalar &color, int thickness, int lineType) { cv::Mat canvas = cv::Mat::zeros(mask.size(), CV

  • 使用c++实现OpenCV绘制图形旋转矩形

    目录 功能函数 // 绘制旋转矩形 void DrawRotatedRect(cv::Mat mask,const cv::RotatedRect &rotatedrect,const cv::Scalar &color,int thickness, int lineType) { // 提取旋转矩形的四个角点 cv::Point2f ps[4]; rotatedrect.points(ps); // 构建轮廓线 std::vector<std::vector<cv::Poin

  • 使用c++实现OpenCV绘制圆端矩形

    功能函数 // 绘制圆端矩形(药丸状,pill) void DrawPill(cv::Mat mask, const cv::RotatedRect &rotatedrect, const cv::Scalar &color, int thickness, int lineType) { cv::Mat canvas = cv::Mat::zeros(mask.size(), CV_8UC1); // 确定短边,短边绘制圆形 cv::RotatedRect rect = rotatedre

随机推荐