这里以CV_BGR2YUV_I420来讲
core.cpp
void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn ) { ... case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12: case COLOR_RGB2YUV_IYUV: case COLOR_BGR2YUV_IYUV: case COLOR_RGBA2YUV_IYUV: case COLOR_BGRA2YUV_IYUV: if (dcn <= 0) dcn = 1; uidx = (code == COLOR_BGR2YUV_IYUV || code == COLOR_BGRA2YUV_IYUV || code == COLOR_RGB2YUV_IYUV || code == COLOR_RGBA2YUV_IYUV) ? 1 : 2; CV_Assert( (scn == 3 || scn == 4) && depth == CV_8U ); CV_Assert( dcn == 1 ); CV_Assert( sz.width % 2 == 0 && sz.height % 2 == 0 ); _dst.create(Size(sz.width, sz.height / 2 * 3), CV_MAKETYPE(depth, dcn)); dst = _dst.getMat(); hal::cvtBGRtoThreePlaneYUV(src.data, src.step, dst.data, dst.step, src.cols, src.rows, scn, swapBlue(code), uidx); break; ... }
color.cpp
void cvtBGRtoThreePlaneYUV(const uchar * src_data, size_t src_step, uchar * dst_data