Opencv 轮廓 逼近多边形曲线 正外接矩形 外接最小矩形
2017-09-27 19:20
651 查看
环境 win7 + vs2015 + Opencv2.4.13
对图像轮廓点进行多边形拟合void approxPolyDP( InputArray curve,
OutputArray approxCurve,
double epsilon, bool closed );
InputArray curve:输入曲线,数据类型可以为vector<Point>。OutputArray approxCurve:输出折线,数据类型可以为vector<Point>。
double epsilon:判断点到相对应的line segment 的距离的阈值。(距离大于此阈值则舍弃,小于此阈值则保留,epsilon越小,折线的形状越“接近”曲线。)
bool closed:曲线是否闭合的标志位。
计算轮廓的垂直边界最小矩形
Rect boundingRect( InputArray points );
计算轮廓的外接最小矩形
RotatedRect minAreaRect( InputArray points );
代码:
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include<iostream>
using namespace cv;
using namespace std;
RNG g_rng(12345);
Mat src; //原图
Mat hui; //灰度图
Mat erzhi; //二值图
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
Mat out; //输出
int main(int argc, char** argv) {
src = imread("1.jpg");
if (!src.data) {
cout << "No data" << endl;
return -1;
}
namedWindow("原图");
namedWindow("输出");
imshow("原图", src);
Mat res = src.clone();
//转化灰度图
cvtColor(src, hui, CV_RGB2GRAY);
//高斯模糊
GaussianBlur(hui, hui, Size(3, 3), 3, 3);
//腐蚀
erode(hui, hui, element, Point(-1, -1), 1);
//膨胀
dilate(hui, hui, element, Point(-1, -1), 1);
vector<vector<Point>>cont;
//二值化
threshold(hui, hui, 100, 255, THRESH_OTSU);
//查找轮廓
findContours(hui, cont, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
vector<vector<Point>>contours_poly(cont.size());
vector<Rect>boundRect(cont.size());
vector<RotatedRect> minRect(cont.size());
for (int i = 0; i < cont.size(); i++) {
approxPolyDP(Mat(cont[i]), contours_poly[i], 3, true);//用指定精度逼近多边形曲线
boundRect[i] = boundingRect(Mat(contours_poly[i])); //外接矩形
minRect[i] = minAreaRect(Mat(cont[i])); //最小外接矩形
}
for (int i = 0; i<cont.size(); i++) {
Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));
//drawContours(res, contours_poly, i, color);
drawContours(res, cont, i, color);
rectangle(res, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0);
Point2f rect_points[4];
minRect[i].points(rect_points);
for (int j = 0; j < 4; j++) {
line(res, rect_points[j], rect_points[(j + 1) % 4], color, 1, 8);
} //画出矩形
}
imshow("输出", res);
waitKey(0);
return 0;
}
相关文章推荐
- OpenCV环境下绘制轮廓的外接多边形、最小立式矩形、最小外接圆
- opencv(23)---轮廓特征属性及应用之最小外接矩形
- OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试
- OpenCV轮廓、多边形逼近、关键点、周长和面积、边界框、矩、轮廓树、凹凸包、几何直方图、匹配
- 使用OpenCv的cvMinAreaRect2函数获取轮廓的可倾斜最小矩形区域
- OpenCV2 轮廓处理 多边形逼近
- Opencv寻找轮廓的最小外接矩形,并获取矩形的中心点,旋转角度
- opencv 轮廓的长度,面积,外接矩形(平行坐标轴),处接最小矩形,处接圆 , 椭圆
- opencv3逼近多边形曲线-approxPolyDP函数在图像中的应用
- 【opencv学习之三十四】轮廓特征应用:最小外接矩形和圆
- opencv3逼近多边形曲线-在图像中的应用-滚动条
- 【OpenCV3图像处理】提取轮廓的凸包、外包矩形、最小外包矩形、最小外包圆
- opencv 轮廓的长度,面积,外接矩形(平行坐标轴),处接最小矩形,处接圆 , 椭圆
- OpenCV轮廓、边界框、最小矩形、最小闭圆检测
- opencv之轮廓最小外接矩形和最小外接圆
- OpenCV轮廓---多边形逼近
- opencv3逼近多边形曲线-approxPolyDP函数在图像中的应用
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) .
- opencv: 绘制矩形轮廓框,并记录轮廓框坐标