Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

回転を考慮した外接矩形を描画する

図形に対して領域を検出し、回転を考慮した外接矩形を描画します。まず画像を二値化し、cv2.findContours()で領域を検出。検出した領域のうち最も大きいものに対して、cv2.minAreaRect()で外接矩形を描画します。物体の大きさや傾きの検出に応用できます。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名'baguette.jpg'で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
f:id:T_A_T:20190604212212j:plain
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])
実行結果

回転を考慮した外接矩形が描画された画像が保存されます。
f:id:T_A_T:20190604212740j:plain
外接矩形の4点の座標と回転角が表示されます。

外接矩形の座標
[[ 58 227]
[ 31 174]
[335 17]
[363 70]]
回転角:
-27.299571990966797

以下のサイトを参考にさせていただきました

OpenCV-Python Tutorials 1 documentation >> 領域(輪郭)の特徴

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村