[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 );
- }
[Opencv]几种对轮廓的处理方式的更多相关文章
- OpenCV函数:提取轮廓相关函数使用方法
opencv中提供findContours()函数来寻找图像中物体的轮廓,并结合drawContours()函数将找到的轮廓绘制出.首先看一下findContours(),opencv中提供了两种定义 ...
- ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式
由于ASP.NET Core应用是一个同时处理多个请求的服务器应用,所以在处理某个请求过程中抛出的异常并不会导致整个应用的终止.出于安全方面的考量,为了避免敏感信息的外泄,客户端在默认的情况下并不会得 ...
- Js之Dom学习-三种获取页面元素的方式、事件、innerText和innerHTML的异同
一.三种获取页面元素的方式: getElementById:通过id来获取 <body> <input type="text" value="请输入一个 ...
- javascript一种新的对象创建方式-Object.create()
1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...
- 转: .NET MVC3 几种返回 JSON 对象的方式和注意事项
.NET MVC3 几种返回 JSON 对象的方式和注意事项 转自:http://blog.csdn.net/xxj_jing/article/details/7382589 引言在用 .NET MV ...
- sql有几种删除表数据的方式
有几种删除表数据的方式? truncate.delete和drop都可以删除数据. TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. TRUNCATE TABLE 与没有 WHE ...
- KbmMW两种查询结果集通讯方式
KbmMW本身可以用QueryService的方式进行远程数据查询,但是SmpileService同样具有很强的扩展性可以实现数据查询,下面展示两种基于SmpileService的远程数据查询方法,其 ...
- Android——另外一种增删查改的方式(ContentProvider常用)
以下介绍另外一种增删查改的方式 package com.njupt.sqllist; import java.util.ArrayList; import java.util.List; import ...
- 四种常用的access连接方式
整理出四种常用的access连接方式,当然,第1种这是最常用的(推荐使用).1. set dbconnection=Server.CreateOBJECT("ADODB.CONNECTION ...
随机推荐
- NuxtJS的AsyncData和Fetch使用详解
asyncData 简介 asyncData 可以用来在客户端加载 Data 数据之前对其做一些处理,也可以在此发起异步请求,提前设置数据,这样在客户端加载页面的时候,就会直接加载提前渲染好并带有数据 ...
- 什么是 IP 地址 – 定义和解释
IP 地址定义 IP 地址是一个唯一地址,用于标识互联网或本地网络上的设备.IP 代表"互联网协议",它是控制通过互联网或本地网络发送的数据格式的一组规则. 本质上,IP 地址是允 ...
- SpringCloud微服务服务间调用之OpenFeign介绍
开发微服务,免不了需要服务间调用.Spring Cloud框架提供了RestTemplate和FeignClient两个方式完成服务间调用,本文简要介绍如何使用OpenFeign完成服务间调用. Op ...
- request获取请求参数通用方式
package com.hopetesting.web.request;import javax.servlet.ServletException;import javax.servlet.annot ...
- 2021 中国.NET开发者峰会近50场热点技术专题揭秘
01 大会介绍 .NET Conf China 2021 是面向开发人员的社区峰会,基于 .NET Conf 2021的活动,庆祝 .NET 6 的发布和回顾过去一年来 .NET 在中国的发展成果展 ...
- Jenkins视图管理
目录 一.简介 二.视图维护 创建视图 将项目加入视图中 三.状态图标变绿 四.看板 一.简介 在现在的编程中,公司往往采用的是模块化的编程方式,也就是说将一个项目拆分成许多模块,每个小项目组往往只负 ...
- 【已解决】关于echarts的splitArea分割区域背景闪烁问题
(x轴)使用时间类型(type: "time"),并且x轴使用splitArea划分后使用color属性设定分割区域颜色. 同时使用dataZoom设置区域缩放,在局 ...
- 采集 base64 编码的图片
问题 爬虫抓取网页的时候,遇到有的图片是 base64 编码的格式,要怎样下载到本地呢? 示例:base64 编码的 img 标签 <!-- 内容太长省略一部分 --> <img s ...
- 一个使用 asyncio 开发的网络爬虫(译文)
原文地址:https://www.aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html 作者简介 A. Jesse Jiryu ...
- LuoguP7059 [NWRRC2015]Lucky Chances 题解
Content 有一个名叫 Lucky chances 的游戏,游戏一开始给出一个 \(r\times c\) 的矩阵,你可以选定矩阵中任意一个元素以及上.下.左.右四个方向中的任意一个方向进行游戏. ...