본문 바로가기
카테고리 없음

OpenCV를 활용한 C#, C++, Python에서 이미지 ROI 내 Crop 방법

by tasiklee 2025. 2. 25.

이미지 처리에서 관심 영역(ROI, Region of Interest)을 지정하고 해당 부분만 크롭(Crop)하는 것은 매우 중요한 영상처리에 있어서 가장 많이 사용하고, 그만큼 중요한데요. OpenCV는 다양한 프로그래밍 언어(C++, Python, C#)에서 지원되고 있습니다. 이본 포스트에서는 OpenCV를 활용한 C++, Python, C#에서의 이미지 ROI Crop 방법을 자세히 설명하겠습니다.


1. ROI (Region of Interest)란?

ROI(Region of Interest)는 이미지에서 특정 관심 영역을 지정하여 처리하는 기술입니다. 예를 들어, 다음과 같은 경우에 활용할 수 있습니다.

  • 얼굴 검출 후 특정 부분만 추출
  • 자동차 번호판 인식에서 번호판 영역만 크롭
  • 이미지 내 특정 객체의 색상 분석
  • 배경을 제거하고 객체만 추출

ROI를 설정한 후 해당 영역을 크롭하면 원하는 부분만 빠르게 처리할 수 있으며, 불필요한 연산을 줄여 성능을 향상할 수 있습니다.

 


2. Python에서 OpenCV를 이용한 ROI 크롭

Python에서는 OpenCV의 NumPy 배열 슬라이싱 기능을 활용하여 간단하게 ROI를 설정하고 크롭할 수 있습니다.

예제 코드:

import cv2
# 이미지 로드
image = cv2.imread("sample.jpg")

# ROI 지정 (y_start:y_end, x_start:x_end)
x, y, w, h = 100, 50, 200, 150  # x, y는 좌측 상단 좌표, w, h는 너비와 높이
roi = image[y:y+h, x:x+w]  # NumPy 배열 슬라이싱을 이용한 ROI 추출

# 크롭된 이미지 저장 및 출력
cv2.imwrite("cropped.jpg", roi)
cv2.imshow("ROI Image", roi)
cv2.waitKey(0)
cv2.destroyAllWindows()

CODE 설명:

  1. cv2.imread("sample.jpg")를 통해 이미지를 불러옵니다.
  2. x, y, w, h 값을 설정하여 관심 영역을 지정합니다.
  3. image[y:y+h, x:x+w]를 사용하여 NumPy 배열 슬라이싱을 수행합니다.
  4. cv2.imwrite("cropped.jpg", roi)로 크롭된 이미지를 저장합니다.
  5. cv2.imshow()를 사용하여 크롭된 이미지를 확인합니다.

3. C++에서 OpenCV를 이용한 ROI 크롭

C++에서는 cv::Rect 클래스를 사용하여 ROI를 설정할 수 있습니다.

예제 코드:

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 이미지 로드
    cv::Mat image = cv::imread("sample.jpg");

    if (image.empty()) {
        std::cout << "이미지를 불러올 수 없습니다." << std::endl;
        return -1;
    }

    // ROI 설정 (x, y, width, height)
    int x = 100, y = 50, width = 200, height = 150;
    cv::Rect roi(x, y, width, height);

    // ROI를 이용하여 이미지 크롭
    cv::Mat cropped = image(roi).clone();  // clone()을 사용하여 원본 이미지에서 독립된 복사본 생성

    // 크롭된 이미지 저장 및 출력
    cv::imwrite("cropped.jpg", cropped);
    cv::imshow("Cropped Image", cropped);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

CODE 설명:

  1. cv::imread("sample.jpg")를 통해 이미지를 불러옵니다.
  2. cv::Rect(x, y, width, height)를 사용하여 ROI를 지정합니다.
  3. image(roi).clone()을 사용하여 크롭된 이미지의 복사본을 생성합니다.
  4. cv::imwrite("cropped.jpg", cropped)를 사용하여 크롭된 이미지를 저장합니다.
  5. cv::imshow()를 사용하여 결과를 확인합니다.

4. C#에서 OpenCV를 이용한 ROI 크롭

C#에서는 EmguCV 라이브러리를 사용하여 OpenCV 기능을 활용할 수 있습니다.

예제 코드:

using System;
using Emgu.CV;
using Emgu.CV.Structure;
using System.Drawing;

class Program
{
    static void Main()
    {
        // 이미지 로드
        Mat image = CvInvoke.Imread("sample.jpg");

        if (image.IsEmpty)
        {
            Console.WriteLine("이미지를 불러올 수 없습니다.");
            return;
        }

        // ROI 설정 (x, y, width, height)
        int x = 100, y = 50, width = 200, height = 150;
        Rectangle roi = new Rectangle(x, y, width, height);

        // ROI를 이용하여 이미지 크롭
        Mat cropped = new Mat(image, roi);

        // 크롭된 이미지 저장 및 출력
        CvInvoke.Imwrite("cropped.jpg", cropped);
        CvInvoke.Imshow("Cropped Image", cropped);
        CvInvoke.WaitKey(0);
    }
}

설명:

  1. CvInvoke.Imread("sample.jpg")를 통해 이미지를 불러옵니다.
  2. Rectangle(x, y, width, height)를 사용하여 ROI를 설정합니다.
  3. new Mat(image, roi)을 이용하여 ROI 영역을 크롭합니다.
  4. CvInvoke.Imwrite("cropped.jpg", cropped)를 사용하여 크롭된 이미지를 저장합니다.
  5. CvInvoke.Imshow("Cropped Image", cropped)를 이용해 화면에 출력합니다.

5. 정리

기능PythonC++C# (EmguCV)

라이브러리 OpenCV, NumPy OpenCV EmguCV
ROI 설정 NumPy 슬라이싱 cv::Rect Rectangle
크롭 방식 image[y:y+h, x:x+w] image(roi).clone() new Mat(image, roi)
이미지 저장 cv2.imwrite() cv::imwrite() CvInvoke.Imwrite()
이미지 출력 cv2.imshow() cv::imshow() CvInvoke.Imshow()

Python에서는 NumPy 배열 슬라이싱을 사용하여 간단하게 크롭할 수 있으며, C++과 C#에서는 cv::Rect 및 Rectangle을 활용하여 ROI를 지정한 후 크롭된 이미지를 저장하고 출력할 수 있습니다.

ROI를 활용하면 이미지에서 불필요한 부분을 제거하고 관심 영역만 분석할 수 있어 효율적인 이미지 처리가 가능합니다. OpenCV의 다양한 기능과 함께 적용하여 더욱 정교한 이미지 분석 및 처리를 해보시길 바랍니다!


추가 질문이 있다면 댓글로 남겨주세요! 😊