ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 타입과 연산 (1) #5
    OpenCV (C#) 2024. 8. 2. 15:53

    벡터(Vec) 구조체

     C#에서는 구조체와 제네릭을 활용하는데, 제네릭의 경우 산술 연산자를 호출 할 수 없고, 사용자 정의 연산자는 호출할 수 있다. 예를 들면 new calc(x1 + x2) 와 같은 형태는 불가하고,  new add(x1, x2)와 같은 형태는 가능한것이다.

     

     벡터 구조체는 Vec<요소의 개수><데이터 타입> 형태로 제공 된다.

    요소의 개수로는 2, 3, 4, 6개가 있고, 데이터 타입을 나타내는 기호로 b, w, s, i, f, d가 있다.

     

    백터 구조체 타입

      C1 C2 C3 C4 C6
    CV_8U uchar Vec2b Vec3b Vec4b  
    CV_8S char -      
    CV_16U ushort -      
    CV_16S short Vec2s Vec3s Vec4s  
    CV_32S int Vec2i Vec3i Vec4i  
    CV_32F float Vec2f Vec3f Vec4f Vec6f
    CV_64F double Vec2d Vec3d Vec4d Vec6d

     

    벡터 구조체 사용 예시

    Vec4d vector1 = new Vec4d(1.0, 2.0, 3.0, 4.0);
    Vec4d vector2 = new Vec4d(1.0, 2.0, 3.0, 4.0);
    
    Console.WriteLine(vector1.Item0);
    Console.WriteLine(vector1[1]);
    Console.WriteLine(vector1.Equals(vector2));

     

    결과:

     

    포인트(Point) 구조체

     포인트 구조체와 벡터 구조체는 상호 캐스팅 할 수 있다.

    포인트 구조체는 Point<요소의 개수><데이터 타입> 형식으로 벡터 구조체와 형식이 동일하며, 2개 또는 3개 요소만 저장한다.

    Scalar Type 2D Point Structure 3D Point Structure
    int Point2 Point3
    float Point2f Point3f
    double Point2d Point3d

     

     포인트 구조체와 벡터 구조체의 주된 차이점은 포인트 구조체로는 좌표값의 벡터 계산을 쉽게 수행 할 수 있다. 또한 벡터간의 거리계산이나 내적, 외적 산술 연산자(+, -, *) 를 사용해서 연산을 빠르게 할 수 있다.

     

    ※ 포인트 구조체와 벡터 구조체의 상호 캐스팅

    Vec3d vector = new Vec3d(1.0, 2.0, 3.0);
    Point3d pt1 = new Vec3d(1.0, 2.0, 4.0);
    Point3d pt2 = vector;
    
    Console.WriteLine(pt1);
    Console.WriteLine(pt2);
    Console.WriteLine(pt1.X);

     

    결과:

     

      포인트 구조체 벡터 연산

    Point pt1 = new Point(1, 2);
    Point pt2 = new Point(3, 2);
    
    Console.WriteLine(pt1.DistanceTo(pt2));
    Console.WriteLine(pt1.DotProduct(pt2));
    Console.WriteLine(pt1.CrossProduct(pt2));
    Console.WriteLine(pt1 + pt2);
    Console.WriteLine(pt1 - pt2);
    Console.WriteLine(pt1 == pt2);
    Console.WriteLine(pt1 * 0.5);

     

    결과:

     

     2차원 포인트 구조체에 대해서만 벡터 연산을 수행 할 수 있으며, 3차원 포인트 구조체는 산술연산자(+,-,*)와 비교 연산자(==, !=)만 지원 한다.

     

    스칼라 구조체

     스칼라 구조체도 벡터 구조체에서 파생된 4개의 요소를 갖는 제네릭 구조이다. 배정밀도 부동 소수점 형식을 멤버로 사용한다.

     

    • 단정밀도 (Single Precision):
      • 보통 32비트로 표현됩니다.
      • 부호 비트: 1비트
      • 지수 비트: 8비트
      • 가수(소수부) 비트: 23비트
    • 배정밀도 (Double Precision):
      • 보통 64비트로 표현됩니다.
      • 부호 비트: 1비트
      • 지수 비트: 11비트
      • 가수(소수부) 비트: 52비트

    벡터에서 파생된 구조지만 상호 캐스팅 연산을 할 수 없다. 주로 픽셀값을 전달하는데 주로 사용 된다.

     

    스칼라 구조체 사용하기

    Scalar s1 = new Scalar(255, 127);
    Scalar s2 = Scalar.Yellow;
    Scalar s3 = Scalar.All(99);
    
    Console.WriteLine(s1);
    Console.WriteLine(s2);
    Console.WriteLine(s3);​

    결과:

     

    스칼라 구조체에서 지원하는 연산

    함수이름 간단한 설명 반환값 예시
    Scalar.all(val) 모든 채널을 동일한 값으로 초기화한 스칼라 객체를 생성합니다. Scalar::all(1) -> Scalar(1, 1, 1, 1)
    Scalar.dot(s) 두 스칼라 벡터의 내적을 계산합니다. Scalar(1, 2, 3).dot(Scalar(4, 5, 6)) -> 32
    Scalar.mul(s) 각 요소를 다른 스칼라의 요소와 곱하여 새로운 스칼라를 반환합니다. Scalar(1, 2, 3).mul(Scalar(4, 5, 6)) -> Scalar(4, 10, 18)
    Scalar.conj() 복소수 스칼라의 켤레 복소수를 반환합니다. Scalar(1, -2, 3).conj() -> Scalar(1, 2, 3)
    Scalar.isReal() 스칼라가 실수인지 여부를 반환합니다. Scalar(1, 0, 0).isReal() -> true
    Scalar.val[] 스칼라 객체의 요소에 접근합니다. Scalar(255, 128, 64).val[0] -> 255
    Scalar.setTo(s) 스칼라 객체의 모든 요소를 주어진 값으로 설정합니다. Scalar(0, 0, 0).setTo(255) -> Scalar(255, 255, 255)
    Scalar.fromRGB(rgb) RGB 값을 받아 스칼라 객체로 변환합니다. Scalar.fromRGB((255, 0, 0)) -> Scalar(255, 0, 0, 0)
    Scalar.randomColor() 무작위 색상 스칼라를 생성합니다. Scalar.randomColor() -> 예: Scalar(102, 205, 170, 0)
    Scalar.toVec3d() 스칼라 객체를 Vec3d 객체로 변환합니다. Scalar(1, 2, 3).toVec3d() -> Vec3d(1, 2, 3)

     

    사이즈 구조체

     이미지 크기를 나타낸다. 포인트 클래스와 상호 캐스팅이 불가능하다. 하지만 Mat 클래스에서 사이즈 구조체를 메서드처럼 사용해 동일한 크기를 바로 사용 할 수 있다. Size이외에 float 형식을 처리하는 Size2f와 double을 처리하는 Size2d가 있다.

     

    ※ 사이즈 구조체 사용하기

    Size size = new Size(640, 480);
    Mat img = new Mat(size, MatType.CV_8UC3);
    Mat img2 = new Mat(img.Size(), MatType.CV_8UC3);
    
    Console.WriteLine($"{size.Width}, {size.Height}");
    Console.WriteLine(img.Size());
    Console.WriteLine($"{img.Size().Width}, {img.Size().Height}");
    Console.WriteLine($"{img.Width}, {img.Height}");

     

    결과:

     

     

    'OpenCV (C#)' 카테고리의 다른 글

    Mat 데이터 #7  (0) 2024.08.05
    데이터 타입과 연산 (2) #6  (0) 2024.08.05
    히스토그램 #4  (0) 2024.08.02
    관심영역 (ROI), 관심 채널 (COI) #3  (0) 2024.08.02
    Open CV 정밀도 표현법 #2  (0) 2024.08.02
Designed by Tistory.