2014-11-28 19 views
19

Tôi đã rất ngạc nhiên khi tôi không thể tìm thấy bất cứ điều gì trong tài liệu OpenCV mô tả - với các từ - những loại khác nhau phù hợp, và Googling cũng không giúp được gì nhiều. Tôi biết rằng CV_8UC1 có thang màu xám, nhưng CV_8UC3 là gì? Có phải RGB không? Hoặc YUV?CV_8UC3 và các loại khác có trong OpenCV là gì?

Ngoài ra, còn các định nghĩa khác từ types_c.h (chúng cũng thiếu nhận xét). Có một mô hình cho quy ước đặt tên là gì không? Tôi có thể diễn giải từ tên của họ thành các tính năng của họ, như màu sắc, v.v. không?

#define CV_8UC1 CV_MAKETYPE(CV_8U,1) 
#define CV_8UC2 CV_MAKETYPE(CV_8U,2) 
#define CV_8UC3 CV_MAKETYPE(CV_8U,3) 
#define CV_8UC4 CV_MAKETYPE(CV_8U,4) 
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) 

#define CV_8SC1 CV_MAKETYPE(CV_8S,1) 
#define CV_8SC2 CV_MAKETYPE(CV_8S,2) 
#define CV_8SC3 CV_MAKETYPE(CV_8S,3) 
#define CV_8SC4 CV_MAKETYPE(CV_8S,4) 
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) 

#define CV_16UC1 CV_MAKETYPE(CV_16U,1) 
#define CV_16UC2 CV_MAKETYPE(CV_16U,2) 
#define CV_16UC3 CV_MAKETYPE(CV_16U,3) 
#define CV_16UC4 CV_MAKETYPE(CV_16U,4) 
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) 

#define CV_16SC1 CV_MAKETYPE(CV_16S,1) 
#define CV_16SC2 CV_MAKETYPE(CV_16S,2) 
#define CV_16SC3 CV_MAKETYPE(CV_16S,3) 
#define CV_16SC4 CV_MAKETYPE(CV_16S,4) 
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) 

#define CV_32SC1 CV_MAKETYPE(CV_32S,1) 
#define CV_32SC2 CV_MAKETYPE(CV_32S,2) 
#define CV_32SC3 CV_MAKETYPE(CV_32S,3) 
#define CV_32SC4 CV_MAKETYPE(CV_32S,4) 
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) 

#define CV_32FC1 CV_MAKETYPE(CV_32F,1) 
#define CV_32FC2 CV_MAKETYPE(CV_32F,2) 
#define CV_32FC3 CV_MAKETYPE(CV_32F,3) 
#define CV_32FC4 CV_MAKETYPE(CV_32F,4) 
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) 

#define CV_64FC1 CV_MAKETYPE(CV_64F,1) 
#define CV_64FC2 CV_MAKETYPE(CV_64F,2) 
#define CV_64FC3 CV_MAKETYPE(CV_64F,3) 
#define CV_64FC4 CV_MAKETYPE(CV_64F,4) 
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n)) 

Trả lời

34

Như đã nêu trong the documentation

Bất kỳ loại nguyên thủy từ danh sách có thể được xác định bởi một định danh trong dạng CV_<bit-depth>{U|S|F}C(<number_of_channels>)

nơi U là kiểu dữ liệu integer unsigned, S được ký kết kiểu số nguyên, và F là kiểu float.

vì vậy CV_8UC3 là ma trận/hình ảnh số nguyên không dấu 8 bit có 3 kênh. Mặc dù nó là phổ biến nhất mà điều này có nghĩa là một RGB (hoặc thực sự BGR) hình ảnh, nó không bắt buộc nó. Điều này đơn giản có nghĩa là có ba kênh và cách bạn sử dụng chúng tùy thuộc vào bạn và ứng dụng của bạn.

+0

"nó không bắt buộc nó" - nhưng tôi cho rằng các hàm như 'cv :: imread' sẽ điền chúng với giá trị RGB? – sashoalm

+0

Điều đó tùy thuộc vào các cờ được chuyển đến 'imread'. Nhưng nếu bạn vượt qua 'CV_LOAD_IMAGE_COLOR' thì đầu ra luôn là BGR, là định dạng màu mà OpenCV thường sử dụng. –

+2

Những gì tôi có nghĩa là trong bài viết của tôi là chỉ vì một ma trận/hình ảnh có loại 'CV_8UC3' không nhất thiết có nghĩa là nó là BGR. Nó cũng có thể là HSV, hoặc cái gì đó không phải là thông tin màu sắc. –

9

Mẫu đặt tên mô tả cách dữ liệu thực sự được trình bày trong bộ nhớ máy tính và không liên quan trực tiếp đến loại hình ảnh. Trên thực tế, bố cục dữ liệu và loại hình ảnh được tách riêng.

Có thể bạn đã tìm hiểu ý nghĩa của mẫu CV_XX (ví dụ: bố cục dữ liệu).

Đối với các kiểu dữ liệu chụp ảnh, nếu bạn hỏi OpenCV để tải một hình ảnh như một hình ảnh màu, nó sẽ tải nó như là một BGR ảnh và bố trí dữ liệu của nó như CV_8UC3. Một số điều cần phải nhận thức được:

  • vâng, thứ tự kênh mặc định là BGR và không RGB. Đây là một đơn đặt hàng kế thừa vì nguồn cấp dữ liệu video kỹ thuật số từ webcam dường như tuân theo thứ tự này khi OpenCV 1.xx đang được phát triển;
  • bạn có thể sử dụng chức năng chuyển đổi loại từ mô-đun imgproc, cụ thể là cv::cvtColor(). Tuy nhiên, tất cả bố cục dữ liệu và loại hình ảnh không tương thích, hãy kiểm tra doc;
  • kênh alpha thường bị bỏ qua. Bằng cách bỏ qua, tôi có nghĩa là cv::imwrite() sẽ viết một hình ảnh 3 kênh không có alpha chẳng hạn. Hầu hết các chức năng xử lý sẽ được cụ thể cho các hình ảnh kênh đơn hoặc áp dụng cùng một quy trình cho tất cả các kênh như nhau;
  • khi hàm chấp nhận mặt nạ (alpha-), nó thường là tham số tùy chọn loại CV_8UC1 mặc định là ma trận trống.
+0

Tôi cho rằng CV_8UC4 sẽ có kênh alpha? – sashoalm

+0

Có, kênh alpha sẽ được lưu trữ trong kênh thứ 4. Tôi khá chắc chắn rằng 'cv :: imwrite()' sẽ ** bỏ qua ** nó mặc dù, và nó cần phải được kiểm tra cho 'cv :: imwrite()'. Các chức năng khác thường sẽ chỉ hoạt động với các hình ảnh kênh đơn hoặc sẽ áp dụng cùng một quy trình cho tất cả các kênh bằng nhau. – sansuiso

+0

Ok, tôi đã kiểm tra, 'cv :: imread()' có thể tải kênh alpha (tùy chọn: 'as_is') hoặc thả nó (tùy chọn:' load_colour'). Ví dụ tại đây: http://docs.opencv.org/doc/tutorials/introduction/display_image/display_image.html – sansuiso

0

8UC3 giúp bạn truy cập dữ liệu RGB. Và nó không chỉ giới hạn ở hình ảnh. Bạn có thể sử dụng nó để truy cập dữ liệu RGB trong Clouds điểm. Nếu bạn chuyển giá trị RGB dưới dạng Ma trận loại 8UC3, thì bạn có thể hiển thị giá trị này dưới dạng màu trong mô-đun viz và hiển thị RGB Pointcloud.

Các vấn đề liên quan