2010-05-25 45 views
16

Công thức nói:Làm thế nào để đối phó với RGB để YUV chuyển đổi

Y = 0.299 * R + 0.587 * G + 0.114 * B; 

U = -0.14713 * R - 0.28886 * G + 0.436 * B; 

V = 0.615 * R - 0.51499 * G - 0.10001 * B; 

gì nếu, ví dụ, biến U trở nên tiêu cực?

U = -0.14713 * R - 0.28886 * G + 0.436 * B; 

Giả sử giá trị tối đa cho R và G (cái) và B = 0 Vì vậy, tôi quan tâm trong việc thực hiện chức năng này convetion trong OpenCV, Vì vậy, làm thế nào để đối phó với các giá trị tiêu cực? Sử dụng hình ảnh nổi? hãy giải thích cho tôi, có thể tôi không hiểu điều gì đó ..

Trả lời

13

Bạn có thể chuyển đổi RGB < -> YUV trong OpenCV với cvtColor sử dụng codeCV_YCrCb2RGB cho YUV-> RGB và CV_RGBYCrCb cho RGB-> YUV.

void cvCvtColor(const CvArr* src, CvArr* dst, int code) 

Chuyển đổi hình ảnh từ một không gian màu khác.

+0

Cảm ơn bạn !! Tôi đã tìm kiếm một hàm như vậy và tôi nghĩ rằng YCrCb là một cái gì đó khác với YUV ... – maximus

+0

Không sao cả. Lưu ý rằng bạn cũng có thể chuyển đổi hình ảnh 3 kênh. Nếu bạn cần hợp nhất Y, U và Vcomponents, bạn có thể thực hiện điều đó bằng 'merge', lấy một đối tượng' vector '. – Jacob

+3

@maximus - nói đúng là như vậy. YUV dành cho tiêu chuẩn truyền hình analog YCrCb là kỹ thuật số - không gian màu khác nhau. Nhưng chỉ rất ít –

14

Y, U và V đều được phép âm khi được biểu thị bằng số thập phân, theo số YUV color plane.

YUV Color space

2

cho định dạng phẳng OpenCV không phải là công cụ thích hợp cho công việc. Thay vào đó, bạn nên sử dụng ffmpeg. ví dụ

static void rgbToYuv(byte* src, byte* dst, int width,int height) 
{ 

    byte* src_planes[3] = {src,src + width*height, src+ (width*height*3/2)}; 
    int src_stride[3] = {width, width/2, width/2}; 
    byte* dest_planes[3] = {dst,NULL,NULL}; 
    int dest_stride[3] = {width*4,0,0}; 
    struct SwsContext *img_convert_ctx = sws_getContext(
     width,height, 
     PIX_FMT_YUV420P,width,height,PIX_FMT_RGB32,SWS_POINT,NULL,NULL,NULL); 
     sws_scale(img_convert_ctx, src_planes,src_stride,0,height,dest_planes,dest_stride); 
    sws_freeContext(img_convert_ctx); 
} 

sẽ chuyển đổi một hình ảnh YUV420 để RGB32

+0

Cách tiếp cận thú vị :) – maximus

+0

Chủ đề khởi động được hỏi về RGB thành YUV. .. – JavaRunner

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