이 글은 Java 환경을 기반으로 OpenCV 4.6.0v에서 Mat 객체 생성 시 전달되는 CvType 매개변수를 소개합니다.
CvType.CV_8UCX, CvType.CV_8SCX, CvType.CV_16UCX, CvType.CV_16SCX 등과 같은 매개변수의 역할과 의미를 잘 이해하지 못한다면
.
그래서 이 글은 OpenCV Mat에서 채널의 역할을 이해하는 데 도움이 될 것입니다.
다음 내용은 OpenCV SDK 4.6.0v
이 유형은 주로 Mat에서 데이터 유형을 정의하는 데 사용됩니다. 일반적인 사용 시나리오는 Mat를 생성할 때 정의하는 것입니다.
그렇다면 CvType 유형은 어떤 매개변수를 정의할까요? 매우 간단하게는 Mat의 이미지 데이터에 대한 두 가지 기본 표시기를 결정합니다:
채널의 개념에 대해서는 이전 글 https://zinyan.com/?p=493에서 소개한 적이 있습니다. 채널 개념에 대해 잘 모르신다면 이전 글을 읽어보시면 됩니다.
CvType 소스 코드에서 OpenCV가 8개의 깊이 매개변수를 정의한 것을 볼 수 있습니다:
public static final int CV_8U = 0, CV_8S = 1, CV_16U = 2, CV_16S = 3, CV_32S = 4, CV_32F = 5, CV_64F = 6, CV_16F = 7;
8U, 8S, 16U, 16S, 32S, 64F 위 이름에서 , 16F 등. 앞에 있는 숫자는 비트 수(
), 즉 8bite, 16bite, 32bite, 64bite를 나타냅니다. 값 범위를 정의하는 데 사용되는 다음 문자 U, S, F는 기호와 정밀도를 나타냅니다.
따라서 다음 정의에 따라 이해할 수 있습니다.
PS: 부동 소수점의 정밀도 및 범위 문제에 관하여 번호로 검색하시면 더 자세한 내용을 보실 수 있습니다. 위의 매개변수 범위는 네트워크 요약을 통해 얻습니다.
OpenCV 정의에서 채널의 최대 개수는 4개, 최소 개수는 1개입니다. 이는 CvType 클래스에 정의된 C1, C2, C3, C4 코드에 반영됩니다.
OpenCV에서 픽셀의 색상 값은 duble[] 이중 정밀도 부동 소수점 배열을 사용합니다. 저장.
채널은 이 double[] 배열의 길이를 정의합니다.
예를 들어, 사진이 RGB 형식의 컬러 사진인 경우 특정 색상을 결정하려면 사진의 픽셀에 R, G, B 값의 혼합이 필요합니다.
픽셀 아래에 R, G, B 값을 기록하려면 double[3] 배열이 필요합니다.
그래서 이 사진은 C3 3채널을 사용하고 있습니다.
그리고 RGB는 일반적으로 0~255 범위의 정수입니다.
OpenCV는 위에서 소개한 깊이를 사용하여 색상 값의 범위를 나타냅니다.
둘의 조합은 다음과 같습니다.
CvType.CV_8UC3: 각 채널의 매개변수 값 범위는 8비트 양의 정수, 즉 0~255
마지막으로 결합했습니다. Mat 생성 매개변수를 이해하려면 다음과 같습니다.
//zinyan:创建了一个4*4尺寸的图片。每个像素点存储了一个double[1]的数组,该数组中值的范围为0~255 Mat mat = new Mat(4, 4, CvType.CV_8UC1); //通常用来表示灰度图或黑白图 //zinyan:创建了一个5*5尺寸的图片。每个像素点存储了一个double[3]的数组,该数组中值的范围为0~255 Mat mat1 = new Mat(5, 5, CvType.CV_8UC3); //通常用来表示彩色图 //zinyan:创建了一个6*6尺寸的图片。每个像素点存储了一个double[3]的数组,该数组中值的范围为0~65535 Mat mat1 = new Mat(6, 6, CvType.CV_16UC3); //通常用来表示彩色图,颜色值范围更广。
요약하면 CvType은 Mat의 데이터 저장 유형을 정의합니다.
Mat가 저장하는 픽셀 값 수와 각 픽셀 값의 범위를 정의합니다.
Mat의 다양한 알고리즘이 각 픽셀의 값을 처리하기 때문입니다. 수치값을 처리하고 계산을 수행하려면 각 수치값의 값 범위가 무엇인지 알고리즘에 알려주어야 합니다.
매트가 외부에서 들어온 경우. Mat 채널 수와 각 값의 값 범위를 어떻게 결정합니까?
CvType은 유형 유형을 통해 해당 유형 값으로 변환할 수 있는 관련 쿼리 메소드를 제공합니다.
예제는 다음과 같습니다.
Mat mat = new Mat(4, 4, CvType.CV_8UC3); int depth = CvType.depth(mat.type()); //输出结果值为 0 == CvType.CV_8U Mat mat1 = new Mat(4, 4, CvType.CV_16SC1); depth = CvType.depth(mat1.type()); //输出结果值为 3 == CvType.CV_16S
또한 채널 수를 쿼리할 수도 있습니다.
Mat mat1 = new Mat(4, 4, CvType.CV_16SC1); int channels = CvType.channels(mat1.type());//该值为1
CvType.CV_USRTYPE1의 값은 이미 CV_16F와 동일합니다. 따라서 이 매개변수에는 @deprecated 주석도 표시됩니다. 버려졌다는 뜻입니다
사용하지 않는 것이 좋습니다.
CvType의 다른 메소드는 비교적 이해하기 쉽습니다. 마지막으로 public static final int ELEM_SIZE(int 유형) 메서드가 있습니다
이 메서드는 유형 값을 전달합니다. 이것이 소위 CvType.CV_8UC1 및 기타 매개변수 값입니다.
그러면 반환되는 것은 int 변수입니다.
이 메소드가 반환하는 변수는 각 채널의 매개변수 바이트 수를 나타냅니다. 1바이트는 8비트를 의미하므로 8비트입니다.
그래서 CV_8U, CV_8S라면 채널번호를 직접 반환해주시면 됩니다.
16비트 데이터인 경우 2*채널, 32비트에는 4*채널, 64비트에는 8*채널을 반환해야 합니다.
이것으로 OpenCV의 CvType에 대한 소개를 마칩니다.
사용 중 CvType 관련 오류가 발생하는 경우. 따라서 대부분의 경우 CvType에 대한 익숙하지 않기 때문에 발생합니다.
또는 채널과 깊이에 대한 요구 사항이 있는 알고리즘을 사용하여 오류가 발생합니다.
위 내용은 OpenCV에서 CvType의 다양한 매개변수의 의미와 관련 방법을 이해합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!