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;
}
處理結果: