OpenCVでミャクミャク作ってみた

<!-- wp:paragraph -->
<p>「大阪万博まで500日を切りました」というようなニュースをちらほら聞いたりして、万博のロゴマークやマスコットキャラクターが話題になっているのを思い出しました。なんだか気持ち悪いだとかなんだとか。</p>
<!-- /wp:paragraph -->

<figure class="wp-block-image aligncenter size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/logo_expo2025.png" alt="" class="wp-image-538" width=50% /></figure>

<!-- wp:paragraph -->
<p>「円とか楕円とかで組み合わせれば出来そうな形だなぁ」と思い、実際に作るとしたらどうなるのか、やってみました。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>真剣なものを期待されていたら申し訳ありません。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">実装環境</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>（そんな人はいないとは思うのですが）万が一「作りたい」という人がいてもいいように、とても気軽なGoogleColaboratoryを利用しています。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">作業工程</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">円を検出したい</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>画像はロゴだけになるように編集しました。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre class="wp-block-code"><code>img = cv2.imread("logo.png")

plt.figure(figsize=(10, 10))
img2 = img&#91;:,:,::-1]
plt.xticks(&#91;]), plt.yticks(&#91;]) 
plt.imshow(img2)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":540,"width":"253px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/logo.png" alt="" class="wp-image-540" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>まずロゴに特別な手を加えないでOpenCVにかけて図形を検出するかどうか試してみます。図形の輪郭を抽出するのに、画像自体をグレースケール化する必要があります。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>import cv2
import numpy as np

# ファイルを読み込み グレースケール化
img = cv2.imread("logo.png", cv2.IMREAD_GRAYSCALE)

# しきい値指定によるフィルタリング
_, threshold = cv2.threshold(img, 240, 255, cv2.THRESH_BINARY)

# 輪郭を抽出
contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# フォントの指定（おまけ）
font = cv2.FONT_HERSHEY_DUPLEX

### 図形の数の変数
circle = 0

for cnt in contours:
    approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt, True), True)
    cv2.drawContours(img, &#91;approx], 0, (0), 2)
    x = approx.ravel()&#91;0]
    y = approx.ravel()&#91;1]

    if len(approx) &gt; 10:
        ### 図形を数える
        circle +=1
        cv2.putText(img, "circle{}".format(circle), (x, y), font, 0.8, (0))      

# 結果の画像作成
cv2.imwrite('output_logo.png',img)
        
### 図形の数の結果
print('Number of circle = ' , circle)</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre class="wp-block-code"><code>img = cv2.imread("output_logo.png")

plt.figure(figsize=(10, 10))
img2 = img&#91;:,:,::-1]
plt.xticks(&#91;]), plt.yticks(&#91;]) 
plt.imshow(img2)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":541,"width":"276px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/download.png" alt="" class="wp-image-541" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>私の想定では白い円と青い円をそれぞれ検出してくれるかなと予想していましたが、目玉の白い部分だけを綺麗に読み取っていました。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>いったん青色を白色に変えて、白色の円を綺麗に検出していこうと思います。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>画像内のカラーピックは<a href="https://www.peko-step.com/">PEKO STEP</a>でやってみた結果、BGRで青(161,81,10)、赤(1,0,255)、白(255,255,255)でした。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>青い部分を白くして白い部分を読み取ろうとしました。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>import cv2

# 画像の読み込み
img2 = cv2.imread('logo.png')

# 指定色
target_color = np.array(&#91;161,81,10])

# 変更後の色
new_color = np.array(&#91;255, 255, 255])

# 各ピクセルを順に処理
rows, cols, _ = img2.shape
for i in range(rows):
    for j in range(cols):
        # 各ピクセルのBGR値を取得
        pixel = img2&#91;i, j]

        # 特定の色かどうかを比較
        if np.array_equal(pixel, target_color):
            # 特定の色ならば新しい色に変更
            img2&#91;i, j] = new_color
</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre class="wp-block-code"><code>plt.figure(figsize=(10, 10))
img2 = img2&#91;:,:,::-1]
plt.xticks(&#91;]), plt.yticks(&#91;]) 
plt.imshow(img2)

# 変更後の画像を保存
cv2.imwrite('output.png', img2)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":551,"width":"310px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/output.png" alt="" class="wp-image-551" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>うわ、なんか怖くなってしまった…調べてみたところ、青色と白色の境目のところで多くの種類の色が混じっているようで、これらをすべて検出して、変更するのは正直手間だったので別の手立てで変更していくことにしました。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>白い部分も青い部分も全部塗りつぶすのはこのサイトでやっちゃいました。人によっては画像編集ソフトなどで出来るとは思いますが、このサイトで目玉部分を塗りつぶしました。<a href="https://www.bannerkoubou.com/">BANNER KOUBOU</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">青色の円を検出</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>青色でないところ以外すべて白色にして、青色の縁部分をハッキリ検出できるようにしていく。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code># 画像の読み込み
img2 = cv2.imread('logo.png')

# 指定色
target_color = np.array(&#91;161,81,10])

# 変更後の色
new_color = np.array(&#91;255, 255, 255])

# 各ピクセルを順に処理
rows, cols, _ = img2.shape
for i in range(rows):
    for j in range(cols):
        # 各ピクセルのBGR値を取得
        pixel = img2&#91;i, j]

        # 特定の色かどうかを比較
        if not np.array_equal(pixel, target_color):
            # 特定の色でないならば新しい色に変更
            img2&#91;i, j] = new_color


# 結果の画像作成
cv2.imwrite('copy_blue.png',img2)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":552,"width":"234px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/copy_blue.png" alt="" class="wp-image-552" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>この画像で円を検出していきます。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code># ファイルを読み込み グレースケール化
img = cv2.imread("copy_blue.png", cv2.IMREAD_GRAYSCALE)

# しきい値指定によるフィルタリング
ret, threshold = cv2.threshold(img, 240, 255, cv2.THRESH_BINARY)

# 輪郭を抽出
contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

font = cv2.FONT_HERSHEY_DUPLEX

### 図形の数の変数
circle = 0

for cnt in contours:
    approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt, True), True)
    cv2.drawContours(img, &#91;approx], 0, (0), 2)
    x = approx.ravel()&#91;0]
    y = approx.ravel()&#91;1]

    if len(approx) &gt; 10:
        ### 図形を数える
        circle +=1
        cv2.putText(img, "circle{}".format(circle), (x, y), font, 0.8, (0))

# 結果の画像作成
cv2.imwrite('output_blue.png',img)

### 図形の数の結果
print('Number of circle = ' , circle)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":553,"width":"276px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/output_blue.png" alt="" class="wp-image-553" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>円が３つしか検出できなかったと言われました。恐らくサイズが小さいこともあって頂点？と言える部分が10個も見つからなかったかもしれません。「if len(approx) > 10:」の設定を8に変更。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":554,"width":"312px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/output_blue-1.png" alt="" class="wp-image-554" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>ちゃんと検出できました。ここから、それぞれの円の中心を見つけていきたいので、検出できたものを確認します。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>for i in range(len(contours)):
    print(len(contours&#91;i]))

# 出力結果
# 3166
# 88
# 155
# 125
# 122
# 141</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>何故か６種類。円５以外に何が…と思いましたが、外枠を大きな四角形と認識したらしいです。最初のcontour以外は円なので、それらの中心と半径を求めるcv2.minEnclosingCircleを使います。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>blue_circle_center = &#91;]
blue_circle_radius = &#91;]
for i in range(1,len(contours)):
    # 外接円を求める
    center, radius = cv2.minEnclosingCircle(contours&#91;i])

    # 半径と直径を表示
    print(f"circle{i}")
    print(center)
    print("半径:", radius)
    print("直径:", 2 * radius)
    blue_circle_center.append(center)
    blue_circle_radius.append(radius)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":557,"width":"277px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/スクリーンショット-2023-12-18-164924.png" alt="" class="wp-image-557" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>それぞれの(x座標、y座標)、半径と直径すべて算出できた。一応ちゃんと中心に行くかどうか確認。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>img = cv2.imread("output_blue.png")

# cv2.circleは整数の座標でしか描画できないので、座標の小数部分を四捨五入する。
for center in blue_circle_center:
    cv2.circle(img, (round(center&#91;0]), round(center&#91;1])), 3, (255, 255, 255),thickness=3, lineType=cv2.LINE_AA)

plt.figure(figsize=(10, 10))
img2 = img&#91;:,:,::-1]
plt.xticks(&#91;]), plt.yticks(&#91;])
plt.imshow(img2)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":556,"width":"298px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/download_blue_center.png" alt="" class="wp-image-556" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>青色は比較的綺麗な円が多いので、中心になっているかどうかも分かりやすいですね。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">白色の円を検出</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>次は白色の円・楕円部分を検出していきます。事前に編集ソフトなどで青色部分を白色に塗りつぶします。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":543,"width":"278px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/download3.png" alt="" class="wp-image-543" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>おお、こわいこわい。さっきとほぼ同じようにやっていく。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code># ファイルを読み込み グレースケール化
img = cv2.imread("logo_white.png", cv2.IMREAD_GRAYSCALE)

# しきい値指定によるフィルタリング
ret, threshold = cv2.threshold(img, 240, 255, cv2.THRESH_BINARY)

# 輪郭を抽出
contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

font = cv2.FONT_HERSHEY_DUPLEX

### 図形の数の変数
circle = 0

for cnt in contours:
    approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt, True), True)
    cv2.drawContours(img, &#91;approx], 0, (0), 2)
    x = approx.ravel()&#91;0]
    y = approx.ravel()&#91;1]

    if len(approx) &gt; 10:
        ### 図形を数える
        circle +=1
        cv2.putText(img, "circle{}".format(circle), (x, y), font, 0.8, (0))      
        
# 結果の画像作成
cv2.imwrite('output_white_gray.png',img)
</code></pre>
<!-- /wp:code -->

<!-- wp:code -->
<pre class="wp-block-code"><code>img = cv2.imread("output_white_gray.png")

plt.figure(figsize=(10, 10))
img2 = img&#91;:,:,::-1]
plt.xticks(&#91;]), plt.yticks(&#91;]) 
plt.imshow(img2)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":544,"width":"234px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/download2.png" alt="" class="wp-image-544" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>circle3が楕円気味なので、すべて楕円として以降は処理していきます。もっと簡単な書き方もあるとは思います。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>white_circle_center = &#91;]
white_circle_width = &#91;]
white_circle_height = &#91;]
white_circle_angle = &#91;]


for i in range(len(contours)):
    # 外接円を求める
    center, (width, height), angle = cv2.fitEllipse(contours&#91;i])

    # 半径と直径を表示
    print(f"circle{1+i}")
    print(center)
    print("幅:", width)
    print("高さ:", height)
    print(angle)

    white_circle_center.append(center)
    white_circle_width.append(width)
    white_circle_height.append(height)
    white_circle_angle.append(angle)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":559,"width":"316px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/スクリーンショット-2023-12-18-173422.png" alt="" class="wp-image-559" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>算出できたので、当てはめてどうなるか確認します。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>img = cv2.imread("output_white_gray.png")

# cv2.circleは整数の座標でしか描画できないので、座標の小数部分を四捨五入する。
for center in white_circle_center:
    cv2.circle(img, (round(center&#91;0]), round(center&#91;1])), 3, (0, 0, 0),thickness=3, lineType=cv2.LINE_AA)

plt.figure(figsize=(10, 10))
img2 = img&#91;:,:,::-1]
plt.xticks(&#91;]), plt.yticks(&#91;])
plt.imshow(img2)</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":561,"width":"288px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/download-1.png" alt="" class="wp-image-561" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>ちょっと怖い目玉ができましたね。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>これで青、白ができたので、赤い部分を検出していきます。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">赤色の楕円を検出</h3>
<!-- /wp:heading -->

<!-- wp:image {"id":545,"width":"244px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/logo_sub.png" alt="" class="wp-image-545" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>この赤い輪が12個の円・楕円で組み合わさっていると見ることで、検出できるようにしていきます。このままだと円として検出できないので、白い円をちょうど重ねるようにして検出できるようにしました。正直に言ってしまうと、ここで多少の誤差が生まれてしまうとは思うのですが、「透過させてピッタリにする」みたいな方法が思いつかなかったのでかなりゴリ押しです。Google 図形描画で頑張りました。</p>
<!-- /wp:paragraph -->

<!-- wp:columns -->
<div class="wp-block-columns"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:image {"id":562,"width":"146px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/copy1.png" alt="" class="wp-image-562" width=30% /></figure>
<!-- /wp:image --></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:image {"id":563,"width":"133px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/copy2.png" alt="" class="wp-image-563" width=30% /></figure>
<!-- /wp:image --></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:image {"id":564,"width":"131px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/copy3.png" alt="" class="wp-image-564" width=30% /></figure>
<!-- /wp:image --></div>
<!-- /wp:column --></div>
<!-- /wp:columns -->

<!-- wp:paragraph -->
<p>それぞれの画像ごとに白色の円を検出していきます。と行きたかったのですが、cv2.fitEllipseは５つ以上検出しないと毎回エラーが発生する＋３枚目の左側の白い円が何度やっても検出できないため、使う画像を３枚目だけ変更しました。</p>
<!-- /wp:paragraph -->

<!-- wp:columns -->
<div class="wp-block-columns"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:image {"id":562,"width":"159px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/copy1.png" alt="" class="wp-image-562" width=30% /></figure>
<!-- /wp:image --></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:image {"id":563,"width":"147px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/copy2.png" alt="" class="wp-image-563" width=30% /></figure>
<!-- /wp:image --></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:image {"id":571,"width":"151px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/copy3-7.png" alt="" class="wp-image-571" width=30% /></figure>
<!-- /wp:image --></div>
<!-- /wp:column --></div>
<!-- /wp:columns -->

<!-- wp:paragraph -->
<p>背景が白色だと何が何だか分からないと思いますが、検出する図形を１枚目・２枚目と同じ個所のものを増やしました。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>やることは白色の円・楕円でやったことと変わりありませんので、ここは省略しちゃいます。うまく12種類の赤色の円・楕円の情報がわかったら作成していきます。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">実装</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>import numpy as np
import cv2


# 土台
img = np.full((830, 755, 3), 255, dtype=np.uint8)

for i in range(12):
    cv2.ellipse(img, ((round(red_circle_center&#91;i]&#91;0]), round(red_circle_center&#91;i]&#91;1])), ((round(red_circle_width&#91;i]), round(red_circle_height&#91;i]))), red_circle_angle&#91;i]), (1, 0, 255), thickness=-1)

for i in range(5):
    cv2.ellipse(img, ((round(white_circle_center&#91;i]&#91;0]), round(white_circle_center&#91;i]&#91;1])), ((round(white_circle_width&#91;i]), round(white_circle_height&#91;i]))), white_circle_angle&#91;i]), (255, 255, 255), thickness=-1)

for i in range(5):
    cv2.circle(img, (round(blue_circle_center&#91;i]&#91;0]), round(blue_circle_center&#91;i]&#91;1])), round(blue_circle_radius&#91;i]), (161, 81, 10),thickness=-1)

cv2.imwrite("myaku.png", img)
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>それまでに検出した値などをまとめて描画していきます。赤→白→青の順に描画していくことで、上書きされていきます。やってみましょう。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":568,"width":"236px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="https://ku-engineer.com/wp-content/uploads/2023/12/raw.png" alt="" class="wp-image-568" width=50% /></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>出来たぁ～～～～。結構大変でした…OpenCVでどんなことができるのかを知るいいきっかけになりました。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">終わりに</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>今回は正直言ってしょうもないことに利用しましたが、本当は特定の物体を検知するのに使えたりするはずです。少しでも興味を持っていただけたら嬉しいです。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">参考</h2>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li><a href="https://data-analysis-stats.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/opencv-python%E3%81%A7%E3%81%AE%E5%9B%B3%E5%BD%A2%E6%A4%9C%E5%87%BA%E3%80%81%E5%9B%B3%E5%BD%A2%E6%95%B0%E3%81%88%E3%82%8B/">OpenCV-Pythonでの図形検出、図形数える</a></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><a href="https://tanalib.com/opencv-change-color/">【opencv】画像の特定の色を別の色に変更する方法</a></li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->