Opencv C++ 连通域逼近三角形
处理图片:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
void get_approx(Mat binImg, vector<Point> contour, double length_p = 0.1)
{
//计算连通域 周长;
double dLenth = arcLength(contour, true);
//计算逼近三角形长度;
double dEpsilon = length_p * dLenth;
//计算逼近三角形 获取点数组;
vector<Point> contour_poly;
approxPolyDP(contour, contour_poly, dEpsilon, true);
//显示用图;
Mat drawImage = Mat::zeros(binImg.size(), CV_8UC3);
//绘制线条颜色;
Scalar color = Scalar(0, 0, 255);
//点数组点 转换成 连通域数组
vector<vector<Point>> contours;
contours.push_back(contour_poly);
//显示连通域图片
drawContours(drawImage, contours, 0, color, 2, 8, vector<Vec4i>(), 0, Point());
imshow("逼近三角形", drawImage);
}
int main()
{
//1.读取图片;
Mat srcImg = imread("cc.jpg");
imshow("原始图片", srcImg);
//2.图片灰度化;
Mat grayImg;
cvtColor(srcImg, grayImg, COLOR_BGR2GRAY);
//imshow("灰度图片", grayImg);
//3.图片二值化;
Mat dstImg;
threshold(grayImg, dstImg, 127, 255, THRESH_BINARY);
//imshow("二值图片", dstImg);
//4.连通域查找;
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(dstImg, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
//5.连通域逼近三角形处理;
get_approx(dstImg, contours[0], 0.002);
waitKey(0);
return 0;
}
处理结果: