fc2ブログ

OpenCV(Python)で輪郭処理を行う

 4年半ぐらい前のブログでOpenCV(C++)でfindContours関数を使って画像中のオブジェクトの輪郭抽出処理を行ったことがありました。最近、OpenCVのコードはPythonで書くことが多いため、同じ内容をPythonで書き直してみました。
 作成したPythonコードは以下の通りです。
# Labelling.py
import cv2
import numpy as np

# 画像読み込み
img = cv2.imread('test.png', 0)

# 二値化
ret, bin_img = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY_INV)

# 輪郭検出
contours, hierarchy = cv2.findContours(bin_img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)
print('Obj No = %d'% (len(contours))) # 検出数

# 輪郭描画
size = np.array([img.shape[0], img.shape[1], 3])
res_img = np.full(size, (255, 255, 255), dtype=np.uint8)
color = np.array([0., 0., 255.])
cv2.drawContours(res_img, contours, -1, color=(0, 0, 255), thickness=1)

for i in range(0, len(contours)):
box = cv2.minAreaRect(contours[i]) # 最小矩形(回転を考慮)算出
box1 = cv2.fitEllipse(contours[i]) # 楕円フィッティング

# 検出オブジェクト情報
obj_center_x = int(box[0][0])
obj_center_y = int(box[0][1])
obj_width = int(box[1][0])
obj_height = int(box[1][1])
obj_area = cv2.contourArea(contours[i])
obj_angle = box1[2]
print('%d: Cx = %3d, Cy = %3d, Width = %3d, Height = %3d, Area = %.1f, Angle = %.1f' %(i, obj_center_x, obj_center_y, obj_width, obj_height, obj_area, obj_angle))

# 検出オブジェクトの囲み
boxpoint = cv2.boxPoints(box)
boxpoint = np.int0(boxpoint)
res_img = cv2.drawContours(res_img,[boxpoint],0,(0,255,0), 1)

# 中心座標(十字マーク)描画
cv2.line(res_img, (obj_center_x, obj_center_y - 2), (obj_center_x, obj_center_y + 2), (255, 255, 0), 1, 8, 0)
cv2.line(res_img, (obj_center_x- 2, obj_center_y), (obj_center_x + 2, obj_center_y), (255, 255, 0), 1, 8, 0)

# オブジェクト番号描画
cv2.putText(res_img, str(i), (obj_center_x + 5, obj_center_y + 5), cv2.FONT_HERSHEY_COMPLEX, 0.7, (255, 255, 0), 1, 8);

# 結果出力
cv2.imwrite('test_res.png', res_img)
35〜37行目の検出オブジェクトの囲みの部分がC++のコードよりもシンプルになったように感じます。

検証に用いたテスト画像(test.png)はtest_210307.pngで、結果は以下の通りでした。result_210307.pngtest_res_210307.png C++のコードをPythonに簡単に移植できました。Pythonコードの方が手軽感、デバッグも楽にできて、いい感じです。
スポンサーサイト



ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: