opencvラーニング17:輪郭発見

輪郭の発見

画像内のターゲットオブジェクトがしきい値セグメンテーションによって抽出された後、エッジ検出によってターゲットオブジェクトの輪郭を抽出する必要があります。2つの方法は、基本的にオブジェクトのエッジまたは前景を決定できます。次に、通常行う必要があるのは、これらのエッジの前景をフィットさせることです。たとえば、最小の外側の長方形、円、凸包、および前景またはエッジピクセルを含むその他の幾何学的形状をフィットさせて、次のような操作の強固な基盤を築きます。それらの面積またはテンプレートマッチングを計算するように。

アウトラインは一連のポイント(ピクセル)を表します。この一連のポイントは順序付けられたポイントのセットを構成するため、アウトラインは順序付けられたポイントのセットとして理解できます。

輪郭の発見は、オブジェクトの輪郭を見つける方法である画像のエッジ抽出に基づいているため、エッジ抽出のしきい値の選択は、最終的な輪郭の発見に影響します。
ここに画像の説明を挿入

輪郭検出API

cv2.findContours()
cv2.drawContours()
は、cv2.findContours()を介して輪郭の位置を検索し、見つかった輪郭をcv2.drawContours()を介して描画します。

等高線、hierarchy = cv2.findContours(image、mode、method)
等高線:等高線
階層:画像トポロジー情報(等高線レベル)(前の等高線、親等高線を保存...)
画像:バイナリ画像
モード:等高線検索方法
方法:等高線概算

ここに画像の説明を挿入ここに画像の説明を挿入

r = cv2.drawContours(image、contours、contourIdx、color [、thickness])
r:ターゲット画像
画像:元の画像
輪郭:すべての入力輪郭エッジ配列
contourIdx:すべて-1として描画される場合、描画されるエッジインデックス。複数のターゲットがある場合は、最初のターゲット0、2番目のターゲット1、および3番目のターゲット2を描画できます。
color:描画する色(BGR形式のSCalar)
厚さ:オプション、描画の密度、つまりアウトラインブラシの厚さ

import cv2 as cv
import numpy as np


def contours_demo(image):
    dst = cv.GaussianBlur(image, (3, 3), 0)
    gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)#cv.THRESH_OTSU自动寻找阈值
    cv.imshow("binary image", binary)

    cloneImage, contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        cv.drawContours(image, contours, i, (0, 0, 255), 2)
        print(i)
    cv.imshow("detect contours", image)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/circle.png")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
contours_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

スクリーンショットを実行します。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44145452/article/details/112789303