BGR to yuv NV21

int cv2yuvNv21(const cv::Mat& cv_bgr, unsigned char *pbuf){
    int W = cv_bgr.cols;
    int H = cv_bgr.rows;

    int stride = W;//align_size(W, 32);

    cv::Mat cv_yuv;
    cv::cvtColor(cv_bgr, cv_yuv, cv::COLOR_BGR2YUV_I420);

    for(int i = 0; i < H; i++){
        uint8_t * src_Y = cv_yuv.ptr(i);
        uint8_t * dst_Y = (uint8_t*)pbuf + i * stride;
        memcpy(dst_Y, src_Y, W * sizeof(uint8_t));
    }

    bool next_U = false;
    uint8_t * UV = (uint8_t*)pbuf + stride*H;
    uint8_t * u = cv_yuv.ptr() + H * W;
    uint8_t * v = u + H * W / 4;
    for(int i = 0; i < H/2; i++){
        uint8_t * uv = UV + i * stride; 

        for(int j = 0; j < W; j++){
            if(next_U){
                *uv++ = *u++;
            }
            else{
                *uv++ = *v++;
            }
            next_U = !next_U;
        }
    }

    return 0;
}

 

你可能感兴趣的:(计算机视觉)