Python實現圖片查詢輪廓、多邊形擬合、最小外接矩形程式碼
阿新 • • 發佈:2020-07-15
1、概述
經常用到輪廓查詢和多邊形擬合等opencv操作,因此記錄以備後續使用。本文程式碼中的閾值條件對圖片沒有實際意義,僅僅是為了測試。
原圖為:
2、測試程式碼:
import cv2 import numpy as np img = cv2.imread('/home/yasin/coffe.jpg') img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) _,contours,hierarchy = cv2.findContours(img_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img,-1,(255,255),1) cv2.namedWindow('Result of drawContours',0) cv2.imshow('Result of drawContours',img) cv2.waitKey() cnt = 0 for i in range(len(contours)): arclen = cv2.arcLength(contours[i],True) epsilon = max(3,int(arclen * 0.02)) # 擬合出的多邊形與原輪廓最大距離,可以自己設定,這裡根據輪廓周長動態設定 approx = cv2.approxPolyDP(contours[i],epsilon,False) # 輪廓的多邊形擬合 area = cv2.contourArea(contours[i]) # 計算面積 rect = cv2.minAreaRect(contours[i]) box = np.int0(cv2.boxPoints(rect)) # 計算最小外接矩形頂點 h = int(rect[1][0]) w = int(rect[1][1]) if min(h,w) == 0: ration = 0 else: ration = max(h,w) /min(h,w) # 長寬比 # 對長寬比,輪廓面積,擬合出的多邊形頂點數做篩選 if ration < 10 and area > 20 and area < 4000 and approx.shape[0] > 3 : # 對滿足條件的輪廓畫出輪廓的擬合多邊形 cv2.polylines(img,[approx],True,(0,255,0),1) cv2.namedWindow('Result of filtered',0) cv2.imshow('Result of filtered',img) cv2.waitKey()
畫出的所有輪廓:
在原輪廓基礎上畫出篩選後的輪廓(綠色部分,沒有實際意義):
補充知識:OpenCV python 輪廓(連通域)最小外接圓形
原圖:[cc.jpg]
import cv2 import numpy as np def main(): # 1.匯入圖片 img_src = cv2.imread("cc.jpg") # 2.灰度化,二值化 img_gray = cv2.cvtColor(img_src,cv2.COLOR_BGR2GRAY) ret,img_bin = cv2.threshold(img_gray,127,cv2.THRESH_BINARY) # 3.連通域分析 img_bin,hierarchy = cv2.findContours(img_bin,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) # 4.獲取最小外接圓 圓心 半徑 center,radius = cv2.minEnclosingCircle(contours[0]) center = np.int0(center) # 5.繪製最小外接圓 img_result = img_src.copy() cv2.circle(img_result,tuple(center),int(radius),2) # 6.顯示結果圖片 cv2.imshow("img_src",img_src) cv2.imshow("img_result",img_result) cv2.waitKey() cv2.destroyAllWindows() if __name__ == '__main__': main()
處理結果:[img_sult.jpg]
以上這篇Python實現圖片查詢輪廓、多邊形擬合、最小外接矩形程式碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。