回転を考慮した外接矩形を描画する
図形に対して領域を検出し、回転を考慮した外接矩形を描画します。まず画像を二値化し、cv2.findContours()で領域を検出。検出した領域のうち最も大きいものに対して、cv2.minAreaRect()で外接矩形を描画します。物体の大きさや傾きの検出に応用できます。
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名'baguette.jpg'で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
baguette.jpg
コード
※cv2.findContoursの戻り値はこのブログで使っているOpenCV 4では2つですが、前バージョンOpenCV 3では3つで書式が異なります
import cv2 # OpenCVのインポート import numpy as np # 画像ファイル名 fname='baguette.jpg' # 二値化閾値 threshold=220 # 画像を読み出しオブジェクトimg_colorに代入 img_color= cv2.imread(fname) # 画像をグレースケールで読み出しオブジェクトimg_grayに代入 img_gray = cv2.imread(fname,cv2.IMREAD_GRAYSCALE) # img_grayを平均化領域9x9で平均化処理しimg_blurに代入 img_blur = cv2.blur(img_gray,(9,9)) # オブジェクトimg_blurを閾値threshold(220)で反転二値化しimg_binaryに代入 ret, img_binary= cv2.threshold(img_blur, threshold, 255, cv2.THRESH_BINARY_INV) # img_binaryを輪郭抽出 contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 最も大きい輪郭に外接矩形を作成し、画像に重ね書き rect = cv2.minAreaRect(contours[0]) box = cv2.boxPoints(rect) box = np.int0(box) img = cv2.drawContours(img_color,[box],0,(0,255,0),2) cv2.imwrite('baguette_mar.jpg',img) # 外接矩形の座標、回転角の表示 print('外接矩形の座標') print(box) print('回転角:') print(rect[2])
実行結果
回転を考慮した外接矩形が描画された画像が保存されます。
外接矩形の4点の座標と回転角が表示されます。
外接矩形の座標
[[ 58 227]
[ 31 174]
[335 17]
[363 70]]
回転角:
-27.299571990966797
以下のサイトを参考にさせていただきました
OpenCV-Python Tutorials 1 documentation >> 領域(輪郭)の特徴