您的位置:首页 > 运维架构

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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐