10-8FindContours.py

000: import cv2
001: import numpy as np
002:
003: def __main():
004: img = cv2.imread(‘IMG_1610.JPG’)
005:
006: dst = getResize(img)
007: dst = getFindContours(dst)
008:
009: cv2.imshow(“Final result”, dst)
010: cv2.waitKey(0)
011: cv2.destroyAllWindows()
012:
013: def getResize(src):
014:
015: basePixSize = 1280 # 縦横で大きい辺の変更したいサイズ
016: height = src.shape[0]
017: width = src.shape[1]
018:
019: largeSize = max(height, width) # 大きい方の辺のサイズ
020: resizeRate = basePixSize / largeSize # 変更比率を計算
021: # shotSize = min(height, width) * resizeRate
022: dst = cv2.resize(src, (int(width * resizeRate), int(height * resizeRate)))
023:
024: return dst
025:
026: def getFindContours(src):
027:
028: gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) # グレースケールに変換する
029: # ガウシアンフィルタ
030: ksize = (25, 25) # 正の奇数で指定する(ここの数字を変えると効果が変更できる)
031: # フィルターの実行
032: gray = cv2.GaussianBlur(gray, ksize=ksize, sigmaX=0, sigmaY=0)
033: ret, c1img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # グレースケールを二値化する
034: # ここで処理を実行
035: # cv2.imshow(‘c1img’, c1img)
036: contours, _ = cv2.findContours(image=c1img, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE) # 輪郭の検出
037: result = cv2.drawContours(image=src, contours=contours, contourIdx=0, color=(0, 0, 255), thickness=2, lineType=cv2.LINE_AA) # 輪郭の描画
038: cv2.imshow(‘Result’, result)
039:
040: for i, cont in enumerate(contours):
041: # area = cv2.contourArea(cont)
042: rect = cv2.minAreaRect(cont) # 四角く括れるエリアを探す//角度のついた長方形の値が戻る
043: box = cv2.boxPoints(rect) # 上記エリアを長方形座標に変換する
044: box = np.int0(box)
045: dst = cv2.drawContours(src,[box], -1, (255, 255, 0), 2, cv2.LINE_AA) # 長方形を描画する
046: cv2.ellipse(dst, rect, (0, 255, 255), 2) # 楕円を描画する
047:
048: return dst
049:
050: if __name__ == ‘__main__’:
051: print(cv2.__version__)
052:
053: __main()