步驟:將一幅影象先轉灰度,再canny邊緣檢測得到二值化邊緣影象,再尋找輪廓,輪廓是由一系列點構成的,要想獲得輪廓的最小外接矩形,首先需要得到輪廓的近似多邊形,用道格拉斯-普克抽稀(dp)演算法,道格拉斯-普克抽稀演算法,是將曲線近似表示為一系列點,並減少點的數量的一種演算法。
該演算法實現抽稀的過程是:
1)對曲線的首末點虛連一條直線,求曲線上所有點與直線的距離,並找出最大距離值dmax,用dmax與事先給定的閾值d相比:
2)若dmax
若dmax≥d,保留dmax對應的座標點,並以該點為界,把曲線分為兩部分,對這兩部分重複使用該方法,即重複1),2)步,直到所有dmax均
poly_rects[i] = boundingrect(contours_poly[i]);//從近似多邊形獲得最小外接矩形
minenclosingcircle(contours_poly[i], ccs[i], radius[i]);//從近似多邊形獲得最小外接圓
//多邊形點數大於5才能繪製帶方向的最小矩形和橢圓
if (contours_poly[i].size() > 5) {
minrects[i] = minarearect(contours_poly[i]);//從近似多邊形獲得帶方向的最小外接矩形
myellipse[i] = fitellipse(contours_poly[i]);//從近似多邊形獲得帶方向的最小外接橢圓
//繪製
src.copyto(dst);
point2f pts[4];
for (int j = 0; j < contours.size(); j++) {
scalar color = scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
rectangle(dst, poly_rects[j], color, 2,8);
circle(dst, ccs[j], (int)radius[j], color, 2,8);
//繪製帶方向的最小外接矩形和橢圓
if (contours_poly[j].size() > 5) {
ellipse(dst, myellipse[j], color, 2);
minrects[j].points(pts);
for (int k = 0; k < 4; k++) {
line(dst, pts[k], pts[(k + 1)%4], color, 2);
imshow("output", dst);
執行結果如下:
Opencv實現最小外接矩形和圓
步驟 將一幅影象先轉灰度,再canny邊緣檢測得到二值化邊緣影象,再尋找輪廓,輪廓是由一系列點構成的,要想獲得輪廓的最小外接矩形,首先需要得到輪廓的近似多邊形,用程式設計客棧道格拉斯 普克抽稀 dp 演算法,道格拉斯 普克抽稀演算法,是將曲線近似表示為一系列點,並減少點的數量的一種演算法。該演算法實...
OpenCV輪廓 邊界框 最小矩形 最小閉圓檢測
import cv2 import numpy as np 函式cv2.pyrdown 是降低影象解析度,變為原來一半 將轉化為灰度,再進行二值化 ret,thresh cv2.threshold cv2.cvtcolor img.copy cv2.color bgr2gray 127,255,cv...
OpenCV 圓與矩形識別
最近乙個專案用到了影象識別,之前從未接觸過opencv,經過各種找教程,終於是搞懂了一些。整個具體流程大概是獲取影象 影象二值化,灰度圖 cvtcolor 影象降噪 gaussianblur 輪廓識別 cvfindcontours 形狀判斷。大多數教程很專業,各種引數分析看不懂,經過各種搜尋終於是搞...