
點選上方藍字關注我們
微信公衆号:OpenCV學堂
關注擷取更多計算機視覺與深度學習知識
輪廓屬性
二值圖像分析最常見的一個主要方式就是輪廓發現與輪廓分析,其中輪廓發現的目的是為輪廓分析做準備,經過輪廓分析我們可以得到輪廓各種有用的屬性資訊、常見的如下:
- 輪廓面積
- 輪廓周長
- 輪廓幾何矩
- 輪廓的最小外接矩形
- 輪廓的最大外接矩形
- 輪廓的最小外接圓
- 輪廓的最小外接三角形
- 輪廓拟合(支援拟合直線、橢圓、圓)
- 輪廓的凸包
- 輪廓層次資訊提取
- 多邊形逼近
- 計算歐拉數
函數介紹
OpenCV中提供大量輪廓分析函數,通過這些函數我們可以友善快捷的得到輪廓的各種有用屬性資訊、高效完成各種二值圖像分析需求,下面是我總結的一些常用的函數清單與說明。
OpenCV中輪廓發現函數如下:
參數解釋如下:
image: 輸入圖像、八位單通道的,背景為黑色
contours: 得到的輪廓圖像
hierarchy: 層次圖像,根據需要提取輪廓層次資訊
mode: 決定提取到層次資訊内容,是多層還是單層
method: 每個輪廓的編碼資訊
offset: 表示輪廓偏移,預設為0
輪廓分析相關的常用函數
// 計算輪廓面積
double cv::contourArea(
InputArray contour,
bool oriented = false
)
// 計算輪廓周長
double cv::arcLength(
InputArray curve,
bool closed
)
// 計算幾何矩與中心距
Moments cv::moments(
InputArray array,
bool binaryImage = false
)
// 計算最小外接矩形
RotatedRect cv::minAreaRect(
InputArray points
)
// 計算最大外接矩形
Rect cv::boundingRect(
InputArray array
)
// 計算最小外接圓/拟合圓
void cv::minEnclosingCircle(
InputArray points,
Point2f & center,
float & radius
)
// 計算最小外接三角形/拟合三角形
double cv::minEnclosingTriangle(
InputArray points,
OutputArray triangle
)
// 拟合直線
void cv::fitLine(
InputArray points,
OutputArray line,
int distType,
double param,
double reps,
double aeps
)
// 拟合橢圓
RotatedRect cv::fitEllipse(
InputArray points
)
// 計算凸包
void cv::convexHull(
InputArray points,
OutputArray hull,
bool clockwise = false,
bool returnPoints = true
)
// 多邊形逼近-逼近真實形狀
void cv::approxPolyDP(
InputArray curve,
OutputArray approxCurve,
double epsilon,
bool closed
)
靈活使用上述輪廓屬性資訊,可以實作對二值圖像的幾何形狀判别、測量、面積過濾、擷取每個對象的幾何屬性包括面積、周長、編碼點、形狀、層次/位置資訊、歐拉數、中心位置、傾斜角度。
綜合運用代碼示範
2020年 以前我分享過一些綜合使用的例子,清單如下(都看過你就赢了):
二值圖像分析案例精選
OpenCV二值圖像案例分析精選 | 第二期
OpenCV輪廓層次分析實作歐拉數計算
OpenCV尋找複雜背景下物體的輪廓
如何識别出輪廓準确的長和寬
OpenCV中幾何形狀識别與測量
OpenCV中BLOB特征提取與幾何形狀分類
OpenCV直線拟合檢測
OpenCV中實作曲線與圓拟合
這裡再分享一個硬币計數的例子!
原圖如下:
代碼如下:
// 加載圖像
Mat img = imread("D:/CoinsB.png");
imshow("Original Image", img);
// 門檻值化操作
Mat gray, binary;
cvtColor(img, gray, COLOR_BGR2GRAY);
float t = threshold(gray, binary, 0, 255, THRESH_BINARY|THRESH_OTSU);
imshow("binary", binary);
imwrite("D:/binary1.png", binary);
// 形态學操作
Mat se = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(binary, binary, MORPH_OPEN, se, Point(-1, -1));
// 輪廓發現
vector hireachy;vector<vector> contours;
bitwise_not(binary, binary);
findContours(binary, contours, hireachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
Mat result = img.clone();
Point2f center;float radius;// 輪廓分析for (size_t t = 0; t double area = contourArea(contours[t]);if (area 1000) {continue;
}
RotatedRect rrt = fitEllipse(contours[t]);
radius = min(rrt.size.width, rrt.size.height)/2.0;
circle(result, rrt.center, radius, Scalar(0, 0, 255), 4, 8, 0);
Moments mm = moments(contours[t]);double cx = mm.m10 / mm.m00;double cy = mm.m01 / mm.m00;
circle(result, Point(cx, cy), 2, Scalar(255, 0, 0), 2, 8, 0);
}// 顯示結果
imshow("result", result);
imwrite("D:/drawing.png", result);
waitKey(0);
最終效果如下:
2020年少寫廢話,覺得不是廢話就點贊,做好自己該做的事情就是對自己最好的交待!
讀書欲精不欲博
用心欲專不欲雜
推薦閱讀
OpenCV4系統化學習路線圖-視訊版本!
OpenCV單應性矩陣發現參數估算方法詳解
單應性矩陣應用-基于特征的圖像拼接
OpenCV圖像拼接改進算法之完美拼接