[Opencv]几种对轮廓的处理方式

boundingRect()

作用:计算点集的右上边框。

形式:boundingRect(InputArray points);

参数:points:输入二维点集,并用std::vector or Mat存储;
points:输入信息,可以为包含点的容器(vector)或是Mat。返回包覆输入信息的最小正矩形。如下图:
RotateRect minAreaRect(InputArray points)作用:生成最小外接矩形
points,输入信息,可以为包含点的容器(vector)或者是Mat

mat input=img.clone()//img图像为预处理后的二值化图像
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;//存储查找到的第i个轮廓的后[i][0]、前[i][1]、父[i][2]、子轮廓[i][3]
findContours(input, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
RotatedRect r= minAreaRect(contours[i]);

minEnclosingCircle()

作用:找到包围二维点集面积最小的圆。

形式:void minEnclosingCircle(InputArray points, Point2f& center, float& radius);

参数:

points:输入二维点集,并用std::vector or Mat存储;

center:输出圆的中心;

radius:输出圆的半径;

approxPolyDP()

作用:以特定精度近似发出多边形曲线。

形式:void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed);

参数:

curve:输入一个在std::vector or Mat中存储的二维点向量;

approxCurve:近似的结果即输出;

epsilon:规定估计精度的参数;

closed:如果是true:估计的曲线是封闭的,如果是false:估计的曲线不是封闭的;

rectangle()

作用:画一个简单、明显或充满的右上角矩形。

形式:void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0);

参数:

img:处理的对象图片;

pt1:矩形的顶点;

pt2:与pt1相对的矩形的顶点;

color:矩形的颜色或亮度;

thickness:矩形的边线的粗细,像CV_FILLED的负值,意味着要画一个填充的矩形;

lineType:矩形的边线的类型;

shift:坐标点的小数位;

circle()

作用:画一个圆。

形式:void circle(Mat& img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8, int shift=0);

参数和rectangle()的设置类似,这里不再赘述。
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);

/// 函数声明
void thresh_callback(int, void* );

/** @主函数 */
int main( int argc, char** argv )
{
  /// 载入原图像, 返回3通道图像
  src = imread( argv[1], 1 );

  /// 转化成灰度图像并进行平滑
  cvtColor( src, src_gray, CV_BGR2GRAY );
  blur( src_gray, src_gray, Size(3,3) );

  /// 创建窗口
  char* source_window = "Source";
  namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  imshow( source_window, src );

  createTrackbar( " Threshold:", "Source", &thresh, max_thresh, thresh_callback );
  thresh_callback( 0, 0 );

  waitKey(0);
  return(0);
}

/** @thresh_callback 函数 */
void thresh_callback(int, void* )
{
  Mat threshold_output;
  vector<vector<Point> > contours;
  vector<Vec4i> hierarchy;

  /// 使用Threshold检测边缘
  threshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY );
  /// 找到轮廓
  findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

  /// 多边形逼近轮廓 + 获取矩形和圆形边界框
  vector<vector<Point> > contours_poly( contours.size() );
  vector<Rect> boundRect( contours.size() );
  vector<Point2f>center( contours.size() );
  vector<float>radius( contours.size() );

  for( int i = 0; i < contours.size(); i++ )
     { approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
       boundRect[i] = boundingRect( Mat(contours_poly[i]) );
       minEnclosingCircle( contours_poly[i], center[i], radius[i] );
     }

  /// 画多边形轮廓 + 包围的矩形框 + 圆形框
  Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
  for( int i = 0; i< contours.size(); i++ )
     {
       Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
       drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
       rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
       circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );
     }

  /// 显示在一个窗口
  namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
  imshow( "Contours", drawing );
}

原文地址:https://www.cnblogs.com/lx17746071609/p/11577372.html

时间: 2024-11-06 12:49:56

[Opencv]几种对轮廓的处理方式的相关文章

(nginx|apache)+tomcat 几种常见的代理实现方式或连接类型(connector type)

简单描述一下nginx两块网卡,eth1外网,eth0内网与tomcat eth0通信,用户请求静态内容由nginx直接响应,动态内容则nginx转发至后端tomcat响应 安装nginx,tomcat不再描述. nginx的配置文件如下:/etc/nginx/nginx.conf [[email protected] ~]# pnginx worker_processes 1; events { worker_connections 1024; } http { include mime.ty

Js之Dom学习-三种获取页面元素的方式、事件、innerText和innerHTML的异同

一.三种获取页面元素的方式: getElementById:通过id来获取 <body> <input type="text" value="请输入一个值:" id="txt"/> <input type="button" value="按钮" id="btn"/> <script> var txt=document.getElementB

10种linux下磁盘快照方式恢复系统

导读 大家都知道windows系统有一个磁盘快照的功能,在windows2003中系统恢复开始依赖于一个叫做硬盘快照服务(Volume Snapshot Service)的服务,他能够自动创建系统快照--包括正在使用的文件--然后将这些文件转换为可恢复的节点文件,在之后的文件系统NTFS这个格式的分区具有系统恢复快照功能快照可以保存,这样在磁盘误操作后就可以完成恢复系统了.linux有没有磁盘快照呢?他的系统误操作怎么进行恢复呢?今天小编带您用10种方式玩转linux磁盘快照的恢复. Linux

KbmMW两种查询结果集通讯方式

KbmMW本身可以用QueryService的方式进行远程数据查询,但是SmpileService同样具有很强的扩展性可以实现数据查询,下面展示两种基于SmpileService的远程数据查询方法,其原理都是利用TkbmMWSimpleService实现流的传输. 直接上代码了: 一.利用KbmMemTable: 服务端: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3

三种呈现错误页面的方式

三种呈现错误页面的方式 由于ASP.NET Core应用是一个同时处理多个请求的服务器应用,所以在处理某个请求过程中抛出的异常并不会导致整个应用的终止.出于安全方面的考量,为了避免敏感信息的外泄,客户端在默认的情况下并不会得到详细的出错信息,这无疑会在开发环境下增加查错纠错的难度.对于生产环境来说,我们也希望最终用户能够根据具体的错误类型得到具有针对性并且友好的错误消息.ASP.NET Core提供了相应的中间件帮助我们将定制化的错误信息呈现出来,这些中间件都定义在"Microsoft.AspN

转: .NET MVC3 几种返回 JSON 对象的方式和注意事项

.NET MVC3 几种返回 JSON 对象的方式和注意事项 转自:http://blog.csdn.net/xxj_jing/article/details/7382589 引言在用 .NET MVC3 给我们做 WEB 项目带来很大灵活性同时,对刚上手的同学来说有些细微的设置导致的问题让我们相当的“纠结”! 这里要讨论的就是:使用JQuery的 Ajax 请求后“返回”的JSON 数据问题. 相信大多数同学都会遇到过,就是在后台已经拼接好了一(拼接方法比较多,我的博客也有提到过!)串标准的J

Android中三种超实用的滑屏方式汇总(转载)

Android中三种超实用的滑屏方式汇总 现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于前段时间项目的需要,所以也对其研究了一下,总的来说滑屏实现有三种方式:(至于其他的实现方式目前后还没碰到...) 1.ViewPager 2.ViewFlipper 3.ViewFlow 一.ViewPager 官方文档介绍:http://developer.android.com/reference/

struts2中两种validation.xml的配置方式_百度文库

在struts中,根据配置的validation.xml文件进行页面输入项目的验证已经众所周知,本文介绍在struts2中两种validation.xml的配置方式.可以根据不同的需要进行不同的配置. 以下以login页面输入firstname,lastname,和age为例进行说明.struts.xml中,成功的话转向成功页面.不成功的话转回到原页面. 首先建立userbean文件.文件名:UserBean.java包:struts2.login.bean文件内容:package struts

javascript一种新的对象创建方式-Object.create()

原文地址:http://www.cnblogs.com/yupeng/p/3478069.html 1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不是一个子函数,可以传一个null,第二个参数是对象的属性描述符,这个参数是可选的. 例如: 1 function Car (desc) { 2 this.desc = desc; 3 this.col