Computer Vision/OpenCv

Scalar와 Vector 비교

BlackWhale 2025. 2. 12. 13:26

Vector와 Scalar 비교

1. Scalar (스칼라)

  • 정의
    - scalar는 OpenCV에서 4개의 값(R, G, B, A)을 저장할 수 있는 고정 크기 데이터 구조
    - 주로 색상이나 고정된 겂을 표현 시 사용
  • 구조
    - 형식 : Scalar(double v0, double v1 = 0, double v2 = 0, double v3 = 0)
    - v0 : 보통 Blue 값 (OpenCV는 기본적으로 BGR 순서를 사용)
    - v1 : Green
    - V2: Red
    - v3 : Alpha (투명도) (옵션)
  • 용도
    1) 색상 지정
         ex) 빨간색 선을 그릴 때 
Cv2.Line(image, pt1, pt2, new Scalar(0, 0, 255));  // BGR: (0, 0, 255) → 빨간색

        2) 이미지 전체를 특정 색으로 채울 때

Mat img = new Mat(new Size(640, 480), MatType.CV_8UC3, new Scalar(255, 0, 0));  // 파란색으로 채움

        3) 픽셀 값 조작
             ex) 특정 픽셀 값을 읽거나 쓸 때 사용

Scalar color = image.At<Vec3b>(y, x);  // (B, G, R) 값 반환
  • 특징
    - 고정 크기(4개 값)로 빠른 처리 가능
  • 주로 색상, 픽셀 값, 상수 값 표현에 사용
  • 단순한 값 저장이나 색상 표현에 최적화 됨

2. Vector (벡터)

  • 정의
    - Vector는 동적 크기의 데이터 구조로, C++의 std::vector와 유사
    - 여러 개의 요소 (예: 점, 선, 이미지 객체 등)를 리스트 형태로 저장할 때 사용
    - C#에서는 List<T>와 같은 역할을 함
  • 구조
    - 형식 : Vector<T> (T는 저장할 데이터 타입)
      예) Vector<Point>는 여러 개의 점(Point)을 저장하는 벡터
  • 용도
    1) 여러 개의 객체 저장
         예를 들어, 윤곽선을 찾을 때 반환되는 값
Vector<Vector<Point>> contours = new Vector<Vector<Point>>();
Cv2.FindContours(image, contours, RetrievalModes.External, ChainApproxMethods.ChainApproxSimple);

          - contours : 이미지에서 찾은 여러 개의 윤곽선을 저장
          - 각 윤곽선은 여러 개의 점(Point)으로 이루어 짐

       2) 다양한 객체 리스트 처리
           - 여러 선분, 점, 원 등을 동적으로 저장하고 사용할 때

       3) 다중 채널 데이터 저장
           - 예를 들어, 히스토그램 데이터를 여러 개 저장하거나, 다차원 배열을 저장할 때 사용

  •  특징
    - 동적 크기로 필요에 따라 데이터 양을 조절할 수 있음
    - 주로 윤곽선 검출, 객체 추적, 다수의 데이터 처리에 사용
    - for 루프 등을 통해 반복 처리하기 용이

3. 비교 정리


4. 실제 예제

1) Scalar 사용 예제 (색상 지정)

Mat img = new Mat(new Size(500, 500), MatType.CV_8UC3, Scalar.All(0));
Cv2.Circle(img, new Point(250, 250), 100, new Scalar(0, 255, 0), -1);  // 초록색 원
Cv2.ImShow("Scalar Example", img);
Cv2.WaitKey(0);

2) Vector 사용 예제 (윤곽선 찾기)

Mat img = Cv2.ImRead("path_to_image.jpg", ImreadModes.Grayscale);
Mat canny = new Mat();
Cv2.Canny(img, canny, 50, 150);

Vector<Vector<Point>> contours = new Vector<Vector<Point>>();
Cv2.FindContours(canny, contours, RetrievalModes.External, ChainApproxMethods.ChainApproxSimple);

// 윤곽선 그리기
Mat result = new Mat(img.Size(), MatType.CV_8UC3, Scalar.All(0));
for (int i = 0; i < contours.Size; i++)
{
    Cv2.DrawContours(result, contours, i, new Scalar(255, 0, 0), 2);  // 파란색 윤곽선
}

Cv2.ImShow("Vector Example", result);
Cv2.WaitKey(0);

5. 결론

  • Scalar는 주로 색상과 단일 픽셀 값에 사용
  • Vector는 여러 데이터(점, 윤곽선, 객체 등)를 동적으로 저장하고 처리할 때 사용

'Computer Vision > OpenCv' 카테고리의 다른 글

OpenCV 이미지 검출 (2)  (0) 2025.02.12
OpenCV 이미지 검출 (1)  (0) 2025.02.12
OpenCV 기초 (1)  (0) 2025.02.12
OpenCV 소개 및 설치  (0) 2025.02.12
머신 비전 기초(2)  (0) 2025.02.12