凸包
凸包概念:在一个多边形边缘或者内部任意两个点的连线都包含在多边形边界或者内部
定义:包含点集合s中所有点的最小凸多边形称为凸包
相关API:
convexHull(
InputArray point,//输入候选点,来自findcontours
OutputArray hull,//凸包
bool clockwise,//default true顺时针方向
bool returnPoint//true表示返回点的个数,如果第二个参数是vector则自动忽略
)
相关步骤
- 首先把图像转为灰度
- 然后再转为二值图像
- 通过发现轮廓得到候选点
- 凸包API调用
- 绘制显示
//OpenCV3凸包
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
const char* file= "qw.jpg";
//加载原图像
Mat original = imread(file);
//转换色彩空间
cvtColor(original, original, CV_BGR2GRAY);
//进行滤波
blur(original, original, Size(3, 3), Point(-1, -1));
//进行阈值二值化操作
threshold(original, original, 200, 255, THRESH_BINARY);
//轮廓发现
vector<vector<Point>>contours;
vector<Vec4i>hierachy;
findContours(original, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
//定义凸包
vector<vector<Point>>convexs(contours.size());
for (size_t i = 0; i < contours.size(); ++i) {
convexHull(contours[i], convexs[i], false, true);
}
//绘制
//重新读取
Mat img = imread(file);
for (size_t i = 0; i < contours.size(); ++i) {
drawContours(img, contours, i, Scalar(0, 0, 255), 2, 8, hierachy, 0, Point(0, 0));
drawContours(img, convexs, i, Scalar(255, 0, 0), 2, 8, Mat(), 0, Point(0, 0));
}
imshow("img", img);
waitKey(0);
return 0;
}