From f2da701723f89f78e1099bcb5c7c25626a64cfc7 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Tue, 6 Sep 2011 08:35:31 +0000 Subject: [PATCH] cvtColor: dst channels number default is set to 4 for RGBA/BGRA cases; added new codes for yuv420 to RGBA/BGRA. --- .../include/opencv2/imgproc/imgproc.hpp | 5 +++++ .../imgproc/include/opencv2/imgproc/types_c.h | 5 +++++ modules/imgproc/src/color.cpp | 19 ++++++++++--------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp index bb3958c716..5a18fd27d9 100644 --- a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp @@ -905,6 +905,11 @@ enum COLOR_YUV420sp2RGB = 92, COLOR_YUV420sp2BGR = 93, + COLOR_YUV420i2RGBA = 94, + COLOR_YUV420i2BGRA = 95, + COLOR_YUV420sp2RGBA = 96, + COLOR_YUV420sp2BGRA = 97, + COLOR_COLORCVT_MAX =100 }; diff --git a/modules/imgproc/include/opencv2/imgproc/types_c.h b/modules/imgproc/include/opencv2/imgproc/types_c.h index 5a984fd625..0b76918d32 100644 --- a/modules/imgproc/include/opencv2/imgproc/types_c.h +++ b/modules/imgproc/include/opencv2/imgproc/types_c.h @@ -230,6 +230,11 @@ enum CV_YUV420i2BGR = 91, CV_YUV420sp2RGB = 92, CV_YUV420sp2BGR = 93, + + CV_YUV420i2RGBA = 94, + CV_YUV420i2BGRA = 95, + CV_YUV420sp2RGBA = 96, + CV_YUV420sp2BGRA = 97, CV_COLORCVT_MAX =100 }; diff --git a/modules/imgproc/src/color.cpp b/modules/imgproc/src/color.cpp index b7e0360c51..c5b493920c 100644 --- a/modules/imgproc/src/color.cpp +++ b/modules/imgproc/src/color.cpp @@ -2817,7 +2817,7 @@ void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn ) case CV_BGR5652BGR: case CV_BGR5552BGR: case CV_BGR5652RGB: case CV_BGR5552RGB: case CV_BGR5652BGRA: case CV_BGR5552BGRA: case CV_BGR5652RGBA: case CV_BGR5552RGBA: - if(dcn <= 0) dcn = 3; + if(dcn <= 0) dcn = (code==CV_BGR5652BGRA || code==CV_BGR5552BGRA || code==CV_BGR5652RGBA || code==CV_BGR5552RGBA) ? 4 : 3; CV_Assert( (dcn == 3 || dcn == 4) && scn == 2 && depth == CV_8U ); _dst.create(sz, CV_MAKETYPE(depth, dcn)); dst = _dst.getMat(); @@ -2854,7 +2854,7 @@ void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn ) break; case CV_GRAY2BGR: case CV_GRAY2BGRA: - if( dcn <= 0 ) dcn = 3; + if( dcn <= 0 ) dcn = (code==CV_GRAY2BGRA) ? 4 : 3; CV_Assert( scn == 1 && (dcn == 3 || dcn == 4)); _dst.create(sz, CV_MAKETYPE(depth, dcn)); dst = _dst.getMat(); @@ -3112,9 +3112,10 @@ void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn ) Bayer2RGB_VNG_8u(src, dst, code); } break; - case CV_YUV420sp2BGR: case CV_YUV420sp2RGB: case CV_YUV420i2BGR: case CV_YUV420i2RGB: + case CV_YUV420sp2BGR: case CV_YUV420sp2RGB: case CV_YUV420i2BGR: case CV_YUV420i2RGB: + case CV_YUV420sp2BGRA: case CV_YUV420sp2RGBA: case CV_YUV420i2BGRA: case CV_YUV420i2RGBA: { - if(dcn <= 0) dcn = 3; + if(dcn <= 0) dcn = (code==CV_YUV420sp2BGRA || code==CV_YUV420sp2RGBA || code==CV_YUV420i2BGRA || code==CV_YUV420i2RGBA) ? 4 : 3; CV_Assert( dcn == 3 || dcn == 4 ); CV_Assert( sz.width % 2 == 0 && sz.height % 3 == 0 && depth == CV_8U && src.isContinuous() ); @@ -3126,31 +3127,31 @@ void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn ) const uchar* uv = y + dstSz.area(); #ifdef HAVE_TEGRA_OPTIMIZATION - if (!tegra::YUV420i2BGR(y, uv, dst, CV_YUV420sp2RGB == code)) + if (!tegra::YUV420i2BGR(y, uv, dst, CV_YUV420sp2RGB == code || CV_YUV420sp2RGBA == code)) #endif { - if (CV_YUV420sp2RGB == code) + if (CV_YUV420sp2RGB == code || CV_YUV420sp2RGBA == code) { if (dcn == 3) parallel_for(BlockedRange(0, dstSz.height, 2), YUV4202BGR888Invoker<2,0>(dst, dstSz.width, y, uv)); else parallel_for(BlockedRange(0, dstSz.height, 2), YUV4202BGRA8888Invoker<2,0>(dst, dstSz.width, y, uv)); } - else if (CV_YUV420sp2BGR == code) + else if (CV_YUV420sp2BGR == code || CV_YUV420sp2BGRA == code) { if (dcn == 3) parallel_for(BlockedRange(0, dstSz.height, 2), YUV4202BGR888Invoker<0,0>(dst, dstSz.width, y, uv)); else parallel_for(BlockedRange(0, dstSz.height, 2), YUV4202BGRA8888Invoker<0,0>(dst, dstSz.width, y, uv)); } - else if (CV_YUV420i2RGB == code) + else if (CV_YUV420i2RGB == code || CV_YUV420i2RGBA == code) { if (dcn == 3) parallel_for(BlockedRange(0, dstSz.height, 2), YUV4202BGR888Invoker<2,1>(dst, dstSz.width, y, uv)); else parallel_for(BlockedRange(0, dstSz.height, 2), YUV4202BGRA8888Invoker<2,1>(dst, dstSz.width, y, uv)); } - else if (CV_YUV420i2BGR == code) + else if (CV_YUV420i2BGR == code || CV_YUV420i2BGRA == code) { if (dcn == 3) parallel_for(BlockedRange(0, dstSz.height, 2), YUV4202BGR888Invoker<0,1>(dst, dstSz.width, y, uv));