opencv Foundation-07-関心領域 (ROI)

画像処理のプロセスでは、関心領域 (ROI) と呼ばれる画像の特定の領域に注目する場合があります
関心領域 ROI を設定した後、その領域に対して全体的な操作を実行できます。

ここにあるいくつかの

OpenCV ROI アプリケーション シナリオ

の例:

オブジェクトの検出と追跡: コンピューター ビジョンでは、オブジェクトの検出と追跡は一般的なタスクです。ROI 機能を使用すると、対象領域を選択し、特定のオブジェクトの検出および追跡アルゴリズムをその領域に適用できるため、処理速度と精度が向上します。

画像セグメンテーション: ROI は、画像を異なる領域またはオブジェクトに分割する画像セグメンテーション タスクで使用できます。関心領域を選択することで、キー領域に処理を集中させることができ、画像分割の効果を向上させることができます。

オブジェクトの認識と分類: オブジェクトの認識と分類タスクでは、ROI を使用してオブジェクトが位置する領域を選択し、その領域で特徴抽出と分類を実行できます。関心領域を選択することで計算量を削減し、認識・分類の精度を向上させることができます。

画像強調: ROI 機能を使用して、局所的な画像強調を行うことができます。関心領域を選択することにより、コントラスト強調、鮮明化などのさまざまな画像強調技術をその領域に適用して、画像の視覚化を向上させることができます。

ビデオ処理: ビデオ処理では、ROI 機能を使用してビデオ フレーム内の関心領域を選択し、この領域に動き検出や背景モデリングなどのさまざまな処理アルゴリズムを適用できます。これにより、ビデオ処理の効率と精度が向上します。

つまり、OpenCV の ROI 機能はコンピューター ビジョンに幅広い用途があり、ターゲット検出、画像セグメンテーション、オブジェクト認識、画像強調、ビデオ処理などのタスクに使用できます。関心領域を選択することにより、処理効率が向上し、より良い処理結果が得られます。

ROI に精通した簡単な操作例
関心領域 A を変数 B に割り当てた後、この変数 B を別の領域 C に割り当てて、領域 A を領域 C にコピーするという目的を達成できます。

たとえば、図 2-16 では、現在のイメージの名前が img であると仮定すると、図内の数字はそれぞれ行番号と列番号を表します。すると、
画像内の黒い ROI は img[200:400, 200:400] と表すことができます。

ここに画像の説明を挿入
値 [200:400, 200:400] の意味を見てみましょう。

img[200:400, 200:400] は、行インデックス (y 軸) が 200 ~ 400 で列インデックス (x 軸) が 200 ~ 400 である画像 img 内の領域が ROI として選択されることを示します。 。この操作は、指定された領域内の元の画像のピクセル値のみを含む新しい画像を返します。

例: 画像を読み取り、元の画像と roi エリア マップを印刷する

import cv2
import numpy as np
a=cv2.imread("2.png",cv2.IMREAD_UNCHANGED)

face=a[220:400,250:350]
cv2.imshow("original",a)
cv2.imshow("face",face)
cv2.waitKey()
cv2.destroyAllWindows()

実行結果:

ここに画像の説明を挿入
例 2:
あるイメージから別のイメージに ROI をコピーします。

import cv2
import numpy as np


a=cv2.imread("222.jpg",cv2.IMREAD_UNCHANGED)

b=cv2.imread("740.jpg",cv2.IMREAD_UNCHANGED)

print("a.shape=",a.shape)
print("b.shape=",b.shape)

cv2.imshow("people",a)
cv2.imshow("number",b)

#从第一张图片中截取人脸
face=a[220:400,250:350]
#将人脸放到第二张图片中,覆盖掉数字
b[160:340,200:300]=face
#显示结果
cv2.imshow("result",b)

cv2.waitKey()
cv2.destroyAllWindows()

実行結果:

ここに画像の説明を挿入

ターゲット検出タスクで、ROI エリア内のターゲットのみを検出したい場合は、以下の手順に従います。

オブジェクト検出アルゴリズム (YOLO、SSD、Faster R-CNN など) を使用して、画像全体に対してオブジェクト検出を実行します。これにより、境界ボックスと対応するオブジェクト カテゴリが生成されます。

検出された各ターゲットについて、その検出フレームが ROI 領域と重なる (交差する) かどうかを判断します。Intersection over Union (IoU) などの指標を使用して判断できます。

ターゲットの検出フレームが ROI 領域と重なる場合は保持され、重なりがない場合は無視または除外できます。

保持されたターゲットについては、ターゲット追跡、ターゲット分類、ターゲット姿勢推定などの後続の処理と分析を実行できます。

すべてのオブジェクトが確実に検出されるように、上記の手順のオブジェクト検出アルゴリズムを画像全体に対して実行する必要があることに注意してください。次に、ROI 領域との重なりを判断して、ターゲットを維持するかどうかを決定します。この方法は、ROI エリア内のターゲットを効果的に選別し、ターゲット検出の効率を向上させることができます。

以下は、オブジェクト検出に OpenCV を使用し、ROI エリア内のオブジェクトのみを検出する方法を示す簡単なサンプル コードです。

import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 定义ROI区域的坐标范围
roi_x, roi_y, roi_w, roi_h = 200, 200, 200, 200

# 加载目标检测器(这里以Haar级联分类器为例)
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 在整个图像上运行目标检测
objects = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 遍历检测到的目标
for (x, y, w, h) in objects:
    # 判断目标是否在ROI区域内
    if x >= roi_x and y >= roi_y and x + w <= roi_x + roi_w and y + h <= roi_y + roi_h:
        # 在图像中绘制目标框
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 显示带有目标框的图像
cv2.imshow('Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

おすすめ

転載: blog.csdn.net/hai411741962/article/details/131716288