Opencv实现最小外接矩形和圆

本文实例为大家分享了Opencv实现最小外接矩形和圆的具体代码,供大家参考,具体内容如下

步骤:将一幅图像先转灰度,再canny边缘检测得到二值化边缘图像,再寻找轮廓,轮廓是由一系列点构成的,要想获得轮廓的最小外接矩形,首先需要得到轮廓的近似多边形,用道格拉斯-普克抽稀(DP)算法,道格拉斯-普克抽稀算法,是将曲线近似表示为一系列点,并减少点的数量的一种算法。

该算法实现抽稀的过程是:

1)对曲线的首末点虚连一条直线,求曲线上所有点与直线的距离,并找出最大距离值dmax,用dmax与事先给定的阈值D相比: 
2)若dmax<D,则将这条曲线上的中间点全部舍去;则该直线段作为曲线的近似,该段曲线处理完毕。

若dmax≥D,保留dmax对应的坐标点,并以该点为界,把曲线分为两部分,对这两部分重复使用该方法,即重复1),2)步,直到所有dmax均<D,即完成对曲线的抽稀。

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int value = 60;
RNG rng(1);
Mat src,gray_img,canny_img,dst;
void callback(int, void*);
int main(int arc, char** argv){
 src = imread("2.jpg");
 namedWindow("input",CV_WINDOW_AUTOSIZE);
 imshow("input", src);
 cvtColor(src, gray_img, CV_BGR2GRAY);
 namedWindow("output", CV_WINDOW_AUTOSIZE);
 createTrackbar("threshold", "output", &value, 255, callback);
 callback(0, 0);
 waitKey(0);
 return 0;
}
void callback(int, void*) {
 Canny(gray_img, canny_img, value, 2 * value);

 vector<vector<Point>>contours;
 vector<Vec4i> hierarchy;
 findContours(canny_img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));

 vector<vector<Point>> contours_poly(contours.size());
 vector<Rect>poly_rects(contours.size());
 vector<Point2f>ccs(contours.size());
 vector<float>radius(contours.size());

 vector<RotatedRect> minRects(contours.size());
 vector<RotatedRect> myellipse(contours.size());

 for (int i = 0; i < contours.size(); i++) {
 approxPolyDP(contours[i], contours_poly[i], 20, true);//获得点数比较少的近似多边形
 poly_rects[i] = boundingRect(contours_poly[i]);//从近似多边形获得最小外接矩形
 minEnclosingCircle(contours_poly[i], ccs[i], radius[i]);//从近似多边形获得最小外接圆
 //多边形点数大于5才能绘制带方向的最小矩形和椭圆
 if (contours_poly[i].size() > 5) {
 minRects[i] = minAreaRect(contours_poly[i]);//从近似多边形获得带方向的最小外接矩形
 myellipse[i] = fitEllipse(contours_poly[i]);//从近似多边形获得带方向的最小外接椭圆
 }
 }

 //绘制
 src.copyTo(dst);
 Point2f pts[4];
 for (int j = 0; j < contours.size(); j++) {
 Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
 rectangle(dst, poly_rects[j], color, 2,8);
 circle(dst, ccs[j], (int)radius[j], color, 2,8);

 //绘制带方向的最小外接矩形和椭圆
 if (contours_poly[j].size() > 5) {
 ellipse(dst, myellipse[j], color, 2);
 minRects[j].points(pts);
 for (int k = 0; k < 4; k++) {
 line(dst, pts[k], pts[(k + 1)%4], color, 2);
 }
 }
 }
 imshow("output", dst);

}

运行结果如下:

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

(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

  • 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

  • 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

  • python四个坐标点对图片区域最小外接矩形进行裁剪

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

  • 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输出.自适

  • OpenCV实现轮廓外接多边形

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

  • OpenCV 轮廓周围绘制矩形框和圆形框的方法

    轮廓周围绘制介绍 没什么概念,就是给得出来的轮廓绘制周围图形,例如下图给左侧得出的轮廓去绘图得到右侧图像: 相关API 减少多边形轮廓点数:approxPolyDP 函数作用:基于RDP算法实现,目的是减少多边形轮廓点数 函数原型: //减少多边形轮廓点数 approxPolyDP( InputArray curve, // 一般是由图像的轮廓点组成的点集 Mat(vector) OutputArray approxCurve, // 表示输出的多边形点集 double epsilon, //

随机推荐