[OpenCV4の学習]輪郭の検索と描画の概要

この記事で共有されている内容は、「Learning OpenCV 4:Python-basedAlgorithmCombat」という本からのものです。この本の内容は次のとおりです。

1章 OpenCV快速入门;
第2章 图像读写模块imgcodecs;
第3章 核心库模块core;
第4章 图像处理模块imgproc(一);
第5章 图像处理模块imgproc(二);
第6章 可视化模块highgui;
第7章 视频处理模块videoio;
第8章 视频分析模块video;
第9章 照片处理模块photo;
第102D特征模块features2d;
第11章 相机标定与三维重建模块calib3d;
第12章 传统目标检测模块objdetect;
第13章 机器学习模块ml;
第14章 深度神经网络模块dnn

「DeepLearningComputerVisionCombat」と「LearningOpenCV4:Python-basedAlgorithmCombat」の本へようこそ。
ここに画像の説明を挿入

キャニーエッジ検出アルゴリズムは、オブジェクトのエッジを非常によく検出できますが、これらのエッジは全体として処理されません。輪郭は、一連の連続した点で構成される曲線であり、オブジェクトの基本的な形状を表現し、ターゲットの認識に重要な役割を果たします。

ケース65:輪郭の発見

輪郭検索関数findContoursはOpenCVで提供されます。この関数によって処理される画像は、キャニーエッジ検出の結果またはしきい値処理によって取得された画像である可能性があります。関数の定義は次のとおりです。

contours, hierarchy = findContours(image, mode, method, contours=None, hierarchy=None, offset=None)

パラメータの説明は次のとおりです
。画像、入力画像、バイナリ画像を渡す必要があります
。モード、輪郭検索モード、RetrievalModesで定義(セクション4.1を参照)
。メソッド、輪郭近似モード、ContourExplicitimationModesで定義(セクション4.1を参照)。 );
輪郭、検出された輪郭の座標点(戻り値);
階層、輪郭レベル(戻り値);
オフセット、移動する各輪郭点のオフセット。
この例で使用されているソース画像を図5.39に示します。
ここに画像の説明を挿入

図5.39
輪郭検索のケースコードは次のとおりです。

import cv2
import numpy as np

#读取图像,转为灰度图像
img = cv2.imread('contour_src.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#阈值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 寻找二值图像的轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#打印轮廓数量
print("Contour Numbers:", len(contours))
#打印层次关系
print("hierarchy\n", hierarchy)

実行後の印刷情報は次のとおりです。

Contour Numbers: 4
hierarchy
 [[[-1 -1  1 -1]
  [-1 -1  2  0]
  [-1 -1  3  1]
  [-1 -1 -1  2]]]

輪郭の数は4で、五角形、円、四辺形、および画像全体の最も外側の輪郭を含みます。
階層は輪郭の階層関係です。各輪郭の4つの要素の意味は、次のように対応します。[次の輪郭インデックス、前の輪郭インデックス、最初の子輪郭インデックス、親輪郭インデックス]、対応する関係が存在しない場合、値対応する位置の-1です。階層はパラメータモードに関連しており、異なるモードに対応する階層は異なります。

ケース66:外形図

見つかった輪郭については、OpenCVで提供されている輪郭描画関数drawContoursを使用して描画できます。この関数は、次のように定義されています。

image = drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)

パラメータの説明は次のとおりです
。画像、入力画像、画像に輪郭を描画(戻り値);
輪郭、輪郭を検索;
contourIdx、輪郭番号を描画、すべて描画された場合、数値は負になります;
色、色を描画します;
太さ、描画線の太さ;
lineType、LineTypesで定義された描画線の線種(セクション4.1を参照);
階層、輪郭を描画するレベル;
maxLevel、描画輪郭のレベル;
オフセット、図面の輪郭のオフセット。
輪郭検索と輪郭描画の完全なケースコードは次のとおりです。

import cv2
import numpy as np

#读取图像,转为灰度图像
img = cv2.imread('contour_src.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#阈值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 寻找二值图像的轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#打印轮廓数量
print("Contour Numbers:", len(contours))
#打印层次关系
print("hierarchy\n", hierarchy)
#创建白底图像
contours_img = np.zeros(img.shape[:], dtype=np.uint8)
contours_img[:] = 255
#绘制轮廓
cv2.drawContours(contours_img, contours, -1, (0, 0, 255), 2)
cv2.imshow('contours_result', contours_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

この場合、すべての等高線が描画され、描画結果が図5.40に示されます。
ここに画像の説明を挿入

図5.40
特定の輪郭を描画する場合は、対応する輪郭番号を渡すことができます。この場合、4つの輪郭が含まれます。外側から内側への輪郭番号は、0、1、2、3であり、輪郭2Asの描画結果です。図5.41に示します。
ここに画像の説明を挿入

図5.41
等高線面積計算関数contourAreaはOpenCVで提供されています。この関数は次のように定義されています。

retval = contourArea(contour, oriented=None)

パラメータは次のように説明されます
。contour、計算される領域の輪郭。
方向性のあるエリアサイン。trueの場合、関数は輪郭の方向(時計回りまたは反時計回り)に基づいて符号付きの領域値を返すため、領域の符号を取得することで輪郭の方向を決定できます。デフォルトでは、パラメータはfalseです。これは、面積の絶対値を返すことを意味します
。retval、計算された面積の結果。
外形図のケースコードに基づいて、面積を計算するためのケースコードは次のとおりです。

area = cv2.contourArea(contours_list[1])
print("Contour 1 Area is: ", area)

計算結果の出力は次のとおりです。

Contour 1 Area is:  219110.0

おすすめ

転載: blog.csdn.net/lxiao428/article/details/123434330