Added exhaustive perf test for cvtColor instead of several small tests
authorAndrey Kamaev <no@email>
Mon, 23 Jan 2012 07:08:31 +0000 (07:08 +0000)
committerAndrey Kamaev <no@email>
Mon, 23 Jan 2012 07:08:31 +0000 (07:08 +0000)
modules/imgproc/perf/perf_cvt_color.cpp

index 8f2e875..aa4ae2a 100644 (file)
@@ -6,209 +6,257 @@ using namespace perf;
 using std::tr1::make_tuple;\r
 using std::tr1::get;\r
 \r
-CV_ENUM(CvtMode, CV_YUV2BGR, CV_YUV2RGB, //YUV\r
-        CV_YUV420i2BGR, CV_YUV420i2RGB, CV_YUV420sp2BGR, CV_YUV420sp2RGB, //YUV420\r
-        CV_RGB2GRAY, CV_RGBA2GRAY, CV_BGR2GRAY, CV_BGRA2GRAY, //Gray\r
-        CV_GRAY2RGB, CV_GRAY2RGBA, /*CV_GRAY2BGR, CV_GRAY2BGRA*/ //Gray2\r
-        CV_BGR2HSV, CV_RGB2HSV, CV_BGR2HLS, CV_RGB2HLS, //H\r
-        CV_BGR2YCrCb, CV_RGB2YCrCb\r
-        )\r
-\r
-typedef std::tr1::tuple<Size, CvtMode> Size_CvtMode_t;\r
-typedef perf::TestBaseWithParam<Size_CvtMode_t> Size_CvtMode;\r
-\r
-typedef std::tr1::tuple<Size, CvtMode, int> Size_CvtMode_OutChNum_t;\r
-typedef perf::TestBaseWithParam<Size_CvtMode_OutChNum_t> Size_CvtMode_OutChNum;\r
-\r
-PERF_TEST_P(Size_CvtMode_OutChNum, cvtColorYUV,\r
-            testing::Combine(\r
-                testing::Values(TYPICAL_MAT_SIZES),\r
-                testing::Values((int)CV_YUV2BGR, (int)CV_YUV2RGB),\r
-                testing::Values(3, 4)\r
-                )\r
-            )\r
+//extra color conversions supported implicitly\r
+enum\r
 {\r
-    Size sz = get<0>(GetParam());\r
-    int mode = get<1>(GetParam());\r
-    int ch = get<2>(GetParam());\r
-\r
-    Mat src(sz, CV_8UC3);\r
-    Mat dst(sz, CV_8UC(ch));\r
-\r
-    declare.in(src, WARMUP_RNG).out(dst);\r
-    \r
-    TEST_CYCLE() cvtColor(src, dst, mode, ch);\r
-    \r
-    SANITY_CHECK(dst, 1);\r
-}\r
-\r
-\r
-PERF_TEST_P(Size_CvtMode_OutChNum, cvtColorYUV420,\r
-            testing::Combine(\r
-                testing::Values(szVGA, sz720p, sz1080p, Size(130, 60)),\r
-                testing::Values((int)CV_YUV420i2BGR, (int)CV_YUV420i2RGB, (int)CV_YUV420sp2BGR, (int)CV_YUV420sp2RGB),\r
-                testing::Values(3, 4)\r
-                )\r
-            )\r
+       CX_BGRA2HLS      = CV_COLORCVT_MAX + CV_BGR2HLS,\r
+       CX_BGRA2HLS_FULL = CV_COLORCVT_MAX + CV_BGR2HLS_FULL,\r
+       CX_BGRA2HSV      = CV_COLORCVT_MAX + CV_BGR2HSV,\r
+       CX_BGRA2HSV_FULL = CV_COLORCVT_MAX + CV_BGR2HSV_FULL,\r
+       CX_BGRA2Lab      = CV_COLORCVT_MAX + CV_BGR2Lab,\r
+       CX_BGRA2Luv      = CV_COLORCVT_MAX + CV_BGR2Luv,\r
+       CX_BGRA2XYZ      = CV_COLORCVT_MAX + CV_BGR2XYZ,\r
+       CX_BGRA2YCrCb    = CV_COLORCVT_MAX + CV_BGR2YCrCb,\r
+       CX_BGRA2YUV      = CV_COLORCVT_MAX + CV_BGR2YUV,\r
+       CX_HLS2BGRA      = CV_COLORCVT_MAX + CV_HLS2BGR,\r
+       CX_HLS2BGRA_FULL = CV_COLORCVT_MAX + CV_HLS2BGR_FULL,\r
+       CX_HLS2RGBA      = CV_COLORCVT_MAX + CV_HLS2RGB,\r
+       CX_HLS2RGBA_FULL = CV_COLORCVT_MAX + CV_HLS2RGB_FULL,\r
+       CX_HSV2BGRA      = CV_COLORCVT_MAX + CV_HSV2BGR,\r
+       CX_HSV2BGRA_FULL = CV_COLORCVT_MAX + CV_HSV2BGR_FULL,\r
+       CX_HSV2RGBA      = CV_COLORCVT_MAX + CV_HSV2RGB,\r
+       CX_HSV2RGBA_FULL = CV_COLORCVT_MAX + CV_HSV2RGB_FULL,\r
+       CX_Lab2BGRA      = CV_COLORCVT_MAX + CV_Lab2BGR,\r
+       CX_Lab2LBGRA     = CV_COLORCVT_MAX + CV_Lab2LBGR,\r
+       CX_Lab2LRGBA     = CV_COLORCVT_MAX + CV_Lab2LRGB,\r
+       CX_Lab2RGBA      = CV_COLORCVT_MAX + CV_Lab2RGB,\r
+       CX_LBGRA2Lab     = CV_COLORCVT_MAX + CV_LBGR2Lab,\r
+       CX_LBGRA2Luv     = CV_COLORCVT_MAX + CV_LBGR2Luv,\r
+       CX_LRGBA2Lab     = CV_COLORCVT_MAX + CV_LRGB2Lab,\r
+       CX_LRGBA2Luv     = CV_COLORCVT_MAX + CV_LRGB2Luv,\r
+       CX_Luv2BGRA      = CV_COLORCVT_MAX + CV_Luv2BGR,\r
+       CX_Luv2LBGRA     = CV_COLORCVT_MAX + CV_Luv2LBGR,\r
+       CX_Luv2LRGBA     = CV_COLORCVT_MAX + CV_Luv2LRGB,\r
+       CX_Luv2RGBA      = CV_COLORCVT_MAX + CV_Luv2RGB,\r
+       CX_RGBA2HLS      = CV_COLORCVT_MAX + CV_RGB2HLS,\r
+       CX_RGBA2HLS_FULL = CV_COLORCVT_MAX + CV_RGB2HLS_FULL,\r
+       CX_RGBA2HSV      = CV_COLORCVT_MAX + CV_RGB2HSV,\r
+       CX_RGBA2HSV_FULL = CV_COLORCVT_MAX + CV_RGB2HSV_FULL,\r
+       CX_RGBA2Lab      = CV_COLORCVT_MAX + CV_RGB2Lab,\r
+       CX_RGBA2Luv      = CV_COLORCVT_MAX + CV_RGB2Luv,\r
+       CX_RGBA2XYZ      = CV_COLORCVT_MAX + CV_RGB2XYZ,\r
+       CX_RGBA2YCrCb    = CV_COLORCVT_MAX + CV_RGB2YCrCb,\r
+       CX_RGBA2YUV      = CV_COLORCVT_MAX + CV_RGB2YUV,\r
+       CX_XYZ2BGRA      = CV_COLORCVT_MAX + CV_XYZ2BGR,\r
+       CX_XYZ2RGBA      = CV_COLORCVT_MAX + CV_XYZ2RGB,\r
+       CX_YCrCb2BGRA    = CV_COLORCVT_MAX + CV_YCrCb2BGR,\r
+       CX_YCrCb2RGBA    = CV_COLORCVT_MAX + CV_YCrCb2RGB,\r
+       CX_YUV2BGRA      = CV_COLORCVT_MAX + CV_YUV2BGR,\r
+       CX_YUV2RGBA      = CV_COLORCVT_MAX + CV_YUV2RGB\r
+};\r
+\r
+CV_ENUM(CvtMode, \r
+       CV_BayerBG2BGR, CV_BayerBG2BGR_VNG, CV_BayerBG2GRAY,\r
+       CV_BayerGB2BGR, CV_BayerGB2BGR_VNG, CV_BayerGB2GRAY,\r
+       CV_BayerGR2BGR, CV_BayerGR2BGR_VNG, CV_BayerGR2GRAY,\r
+       CV_BayerRG2BGR, CV_BayerRG2BGR_VNG, CV_BayerRG2GRAY,\r
+       \r
+       CV_BGR2BGR555, CV_BGR2BGR565, CV_BGR2BGRA, CV_BGR2GRAY, \r
+       CV_BGR2HLS, CV_BGR2HLS_FULL, CV_BGR2HSV, CV_BGR2HSV_FULL,\r
+       CV_BGR2Lab, CV_BGR2Luv, CV_BGR2RGB, CV_BGR2RGBA, CV_BGR2XYZ,\r
+       CV_BGR2YCrCb, CV_BGR2YUV, CV_BGR5552BGR, CV_BGR5552BGRA,\r
+       \r
+       CV_BGR5552GRAY, CV_BGR5552RGB, CV_BGR5552RGBA, CV_BGR5652BGR,\r
+       CV_BGR5652BGRA, CV_BGR5652GRAY, CV_BGR5652RGB, CV_BGR5652RGBA,\r
+       \r
+       CV_BGRA2BGR, CV_BGRA2BGR555, CV_BGRA2BGR565, CV_BGRA2GRAY, CV_BGRA2RGBA,\r
+       CX_BGRA2HLS, CX_BGRA2HLS_FULL, CX_BGRA2HSV, CX_BGRA2HSV_FULL,\r
+       CX_BGRA2Lab, CX_BGRA2Luv, CX_BGRA2XYZ,\r
+       CX_BGRA2YCrCb, CX_BGRA2YUV,\r
+       \r
+       CV_GRAY2BGR, CV_GRAY2BGR555, CV_GRAY2BGR565, CV_GRAY2BGRA,\r
+\r
+       CV_HLS2BGR, CV_HLS2BGR_FULL, CV_HLS2RGB, CV_HLS2RGB_FULL,\r
+       CX_HLS2BGRA, CX_HLS2BGRA_FULL, CX_HLS2RGBA, CX_HLS2RGBA_FULL,   \r
+       \r
+       CV_HSV2BGR, CV_HSV2BGR_FULL, CV_HSV2RGB, CV_HSV2RGB_FULL,\r
+       CX_HSV2BGRA, CX_HSV2BGRA_FULL, CX_HSV2RGBA,     CX_HSV2RGBA_FULL,\r
+       \r
+       CV_Lab2BGR, CV_Lab2LBGR, CV_Lab2LRGB, CV_Lab2RGB,\r
+       CX_Lab2BGRA, CX_Lab2LBGRA, CX_Lab2LRGBA, CX_Lab2RGBA,\r
+       \r
+       CV_LBGR2Lab, CV_LBGR2Luv, CV_LRGB2Lab, CV_LRGB2Luv,\r
+       CX_LBGRA2Lab, CX_LBGRA2Luv, CX_LRGBA2Lab, CX_LRGBA2Luv,\r
+       \r
+       CV_Luv2BGR, CV_Luv2LBGR, CV_Luv2LRGB, CV_Luv2RGB,\r
+       CX_Luv2BGRA, CX_Luv2LBGRA, CX_Luv2LRGBA, CX_Luv2RGBA,\r
+       \r
+       CV_RGB2BGR555, CV_RGB2BGR565, CV_RGB2GRAY,\r
+       CV_RGB2HLS, CV_RGB2HLS_FULL, CV_RGB2HSV, CV_RGB2HSV_FULL,\r
+       CV_RGB2Lab, CV_RGB2Luv, CV_RGB2XYZ, CV_RGB2YCrCb, CV_RGB2YUV,\r
+       \r
+       CV_RGBA2BGR, CV_RGBA2BGR555, CV_RGBA2BGR565, CV_RGBA2GRAY,\r
+       CX_RGBA2HLS, CX_RGBA2HLS_FULL, CX_RGBA2HSV, CX_RGBA2HSV_FULL,\r
+       CX_RGBA2Lab, CX_RGBA2Luv, CX_RGBA2XYZ,\r
+       CX_RGBA2YCrCb, CX_RGBA2YUV,\r
+       \r
+       CV_XYZ2BGR, CV_XYZ2RGB, CX_XYZ2BGRA, CX_XYZ2RGBA,\r
+       \r
+       CV_YCrCb2BGR, CV_YCrCb2RGB, CX_YCrCb2BGRA, CX_YCrCb2RGBA,\r
+       CV_YUV2BGR, CV_YUV2RGB, CX_YUV2BGRA, CX_YUV2RGBA\r
+       )\r
+\r
+CV_ENUM(CvtMode2, CV_YUV420i2BGR, CV_YUV420i2BGRA, CV_YUV420i2RGB, CV_YUV420i2RGBA, CV_YUV420sp2BGR, CV_YUV420sp2BGRA, CV_YUV420sp2RGB, CV_YUV420sp2RGBA)\r
+       \r
+struct ChPair\r
 {\r
-    Size sz = get<0>(GetParam());\r
-    int mode = get<1>(GetParam());\r
-    int ch = get<2>(GetParam());\r
-\r
-    Mat src(sz.height + sz.height / 2, sz.width, CV_8UC1);\r
-    Mat dst(sz, CV_8UC(ch));\r
-\r
-    declare.in(src, WARMUP_RNG).out(dst);\r
-    \r
-    TEST_CYCLE() cvtColor(src, dst, mode, ch);\r
-    \r
-    SANITY_CHECK(dst, 1);\r
-}\r
-\r
+       ChPair(int _scn, int _dcn): scn(_scn), dcn(_dcn) {}\r
+       int scn, dcn;\r
+};\r
 \r
-PERF_TEST_P(Size_CvtMode, cvtColorGray,\r
-            testing::Combine(\r
-                testing::Values(TYPICAL_MAT_SIZES),\r
-                testing::Values((int)CV_RGB2GRAY, (int)CV_RGBA2GRAY, (int)CV_BGR2GRAY, (int)CV_BGRA2GRAY)\r
-                )\r
-            )\r
+ChPair getConversionInfo(int cvtMode)\r
 {\r
-    Size sz = get<0>(GetParam());\r
-    int mode = get<1>(GetParam());\r
-\r
-    Mat src(sz, CV_8UC((mode==CV_RGBA2GRAY || mode==CV_BGRA2GRAY) ? 4 : 3));\r
-    Mat dst(sz, CV_8UC1);\r
-\r
-    declare.in(src, WARMUP_RNG).out(dst);\r
-    \r
-    TEST_CYCLE() cvtColor(src, dst, mode);\r
-    \r
-    SANITY_CHECK(dst, 1);\r
+       switch(cvtMode)\r
+       {\r
+       case CV_BayerBG2GRAY: case CV_BayerGB2GRAY:\r
+       case CV_BayerGR2GRAY: case CV_BayerRG2GRAY:\r
+               return ChPair(1,1);\r
+       case CV_GRAY2BGR555: case CV_GRAY2BGR565:\r
+               return ChPair(1,2);\r
+       case CV_BayerBG2BGR: case CV_BayerBG2BGR_VNG:\r
+       case CV_BayerGB2BGR: case CV_BayerGB2BGR_VNG:\r
+       case CV_BayerGR2BGR: case CV_BayerGR2BGR_VNG:\r
+       case CV_BayerRG2BGR: case CV_BayerRG2BGR_VNG:\r
+       case CV_GRAY2BGR: case CV_YUV420i2BGR:\r
+       case CV_YUV420i2RGB: case CV_YUV420sp2BGR:\r
+       case CV_YUV420sp2RGB:\r
+               return ChPair(1,3);\r
+       case CV_GRAY2BGRA: case CV_YUV420i2BGRA:\r
+       case CV_YUV420i2RGBA: case CV_YUV420sp2BGRA:\r
+       case CV_YUV420sp2RGBA:\r
+               return ChPair(1,4);\r
+       case CV_BGR5552GRAY: case CV_BGR5652GRAY:\r
+               return ChPair(2,1);\r
+       case CV_BGR5552BGR: case CV_BGR5552RGB:\r
+       case CV_BGR5652BGR: case CV_BGR5652RGB:\r
+               return ChPair(2,3);\r
+       case CV_BGR5552BGRA: case CV_BGR5552RGBA:\r
+       case CV_BGR5652BGRA: case CV_BGR5652RGBA:\r
+               return ChPair(2,4);\r
+       case CV_BGR2GRAY: case CV_RGB2GRAY:\r
+               return ChPair(3,1);\r
+       case CV_BGR2BGR555: case CV_BGR2BGR565:\r
+       case CV_RGB2BGR555: case CV_RGB2BGR565:\r
+               return ChPair(3,2);\r
+       case CV_BGR2HLS: case CV_BGR2HLS_FULL:\r
+       case CV_BGR2HSV: case CV_BGR2HSV_FULL:\r
+       case CV_BGR2Lab: case CV_BGR2Luv:\r
+       case CV_BGR2RGB: case CV_BGR2XYZ:\r
+       case CV_BGR2YCrCb: case CV_BGR2YUV:\r
+       case CV_HLS2BGR: case CV_HLS2BGR_FULL:\r
+       case CV_HLS2RGB: case CV_HLS2RGB_FULL:\r
+       case CV_HSV2BGR: case CV_HSV2BGR_FULL:\r
+       case CV_HSV2RGB: case CV_HSV2RGB_FULL:\r
+       case CV_Lab2BGR: case CV_Lab2LBGR:\r
+       case CV_Lab2LRGB: case CV_Lab2RGB:\r
+       case CV_LBGR2Lab: case CV_LBGR2Luv:\r
+       case CV_LRGB2Lab: case CV_LRGB2Luv:\r
+       case CV_Luv2BGR: case CV_Luv2LBGR:\r
+       case CV_Luv2LRGB: case CV_Luv2RGB:\r
+       case CV_RGB2HLS: case CV_RGB2HLS_FULL:\r
+       case CV_RGB2HSV: case CV_RGB2HSV_FULL:\r
+       case CV_RGB2Lab: case CV_RGB2Luv:\r
+       case CV_RGB2XYZ: case CV_RGB2YCrCb:\r
+       case CV_RGB2YUV: case CV_XYZ2BGR:\r
+       case CV_XYZ2RGB: case CV_YCrCb2BGR:\r
+       case CV_YCrCb2RGB: case CV_YUV2BGR:\r
+       case CV_YUV2RGB:\r
+               return ChPair(3,3);\r
+       case CV_BGR2BGRA: case CV_BGR2RGBA:\r
+       case CX_HLS2BGRA: case CX_HLS2BGRA_FULL:\r
+       case CX_HLS2RGBA: case CX_HLS2RGBA_FULL:\r
+       case CX_HSV2BGRA: case CX_HSV2BGRA_FULL:\r
+       case CX_HSV2RGBA: case CX_HSV2RGBA_FULL:\r
+       case CX_Lab2BGRA: case CX_Lab2LBGRA:\r
+       case CX_Lab2LRGBA: case CX_Lab2RGBA:\r
+       case CX_Luv2BGRA: case CX_Luv2LBGRA:\r
+       case CX_Luv2LRGBA: case CX_Luv2RGBA:\r
+       case CX_XYZ2BGRA: case CX_XYZ2RGBA:\r
+       case CX_YCrCb2BGRA: case CX_YCrCb2RGBA:\r
+       case CX_YUV2BGRA: case CX_YUV2RGBA:\r
+               return ChPair(3,4);\r
+       case CV_BGRA2GRAY: case CV_RGBA2GRAY:\r
+               return ChPair(4,1);\r
+       case CV_BGRA2BGR555: case CV_BGRA2BGR565:\r
+       case CV_RGBA2BGR555: case CV_RGBA2BGR565:\r
+               return ChPair(4,2);\r
+       case CV_BGRA2BGR: case CX_BGRA2HLS:\r
+       case CX_BGRA2HLS_FULL: case CX_BGRA2HSV:\r
+       case CX_BGRA2HSV_FULL: case CX_BGRA2Lab:\r
+       case CX_BGRA2Luv: case CX_BGRA2XYZ:\r
+       case CX_BGRA2YCrCb: case CX_BGRA2YUV:\r
+       case CX_LBGRA2Lab: case CX_LBGRA2Luv:\r
+       case CX_LRGBA2Lab: case CX_LRGBA2Luv:\r
+       case CV_RGBA2BGR: case CX_RGBA2HLS:\r
+       case CX_RGBA2HLS_FULL: case CX_RGBA2HSV:\r
+       case CX_RGBA2HSV_FULL: case CX_RGBA2Lab:\r
+       case CX_RGBA2Luv: case CX_RGBA2XYZ:\r
+       case CX_RGBA2YCrCb: case CX_RGBA2YUV:\r
+               return ChPair(4,3);\r
+       case CV_BGRA2RGBA:\r
+               return ChPair(4,4);\r
+       default:\r
+               ADD_FAILURE() << "Unknown conversion type";\r
+               break;\r
+       };\r
+       return ChPair(0,0);\r
 }\r
 \r
+typedef std::tr1::tuple<Size, CvtMode> Size_CvtMode_t;\r
+typedef perf::TestBaseWithParam<Size_CvtMode_t> Size_CvtMode;\r
 \r
-PERF_TEST_P(Size_CvtMode, cvtColorGray2,\r
+PERF_TEST_P(Size_CvtMode, cvtColor8u,\r
             testing::Combine(\r
                 testing::Values(TYPICAL_MAT_SIZES),\r
-                testing::Values((int)CV_GRAY2RGB, (int)CV_GRAY2RGBA)\r
+                testing::ValuesIn(CvtMode::all())\r
                 )\r
             )\r
 {\r
-    Size sz = get<0>(GetParam());\r
-    int mode = get<1>(GetParam());\r
-\r
-    Mat src(sz, CV_8UC1);\r
-    Mat dst(sz, CV_8UC((mode==CV_GRAY2RGBA || mode==CV_GRAY2BGRA) ? 4 : 3));\r
-\r
-    declare.in(src, WARMUP_RNG).out(dst);\r
+       Size sz = get<0>(GetParam());\r
+       int mode = get<1>(GetParam());\r
+       ChPair ch = getConversionInfo(mode);\r
+       mode %= CV_COLORCVT_MAX;\r
     \r
-    TEST_CYCLE() cvtColor(src, dst, mode);\r
+       Mat src(sz, CV_8UC(ch.scn));\r
+       Mat dst(sz, CV_8UC(ch.dcn));\r
+       \r
+       declare.in(src, WARMUP_RNG).out(dst);\r
     \r
-    SANITY_CHECK(dst);\r
-}\r
-\r
-PERF_TEST_P(Size_CvtMode, cvtColorH,\r
-            testing::Combine(\r
-                testing::Values(TYPICAL_MAT_SIZES),\r
-                testing::Values((int)CV_BGR2HSV, (int)CV_RGB2HSV, (int)CV_BGR2HLS, (int)CV_RGB2HLS)\r
-                )\r
-            )\r
-{\r
-    Size sz = get<0>(GetParam());\r
-    int mode = get<1>(GetParam());\r
-\r
-    Mat src(sz, CV_8UC3);\r
-    Mat dst(sz, CV_8UC3);\r
-\r
-    declare.in(src, WARMUP_RNG).out(dst);\r
-    \r
-    TEST_CYCLE() cvtColor(src, dst, mode);\r
+    TEST_CYCLE() cvtColor(src, dst, mode, ch.dcn);\r
     \r
     SANITY_CHECK(dst, 1);\r
 }\r
 \r
-typedef std::tr1::tuple<Size, CvtMode, int> Size_CvtMode_Ch_t;\r
-typedef perf::TestBaseWithParam<Size_CvtMode_Ch_t> Size_CvtMode_Ch;\r
+typedef std::tr1::tuple<Size, CvtMode2> Size_CvtMode2_t;\r
+typedef perf::TestBaseWithParam<Size_CvtMode2_t> Size_CvtMode2;\r
 \r
-PERF_TEST_P(Size_CvtMode_Ch, cvtColorYCrCb,\r
+PERF_TEST_P(Size_CvtMode2, cvtColorYUV420,\r
             testing::Combine(\r
-                testing::Values(TYPICAL_MAT_SIZES),\r
-                testing::Values((int)CV_BGR2YCrCb, (int)CV_RGB2YCrCb),\r
-                testing::Values(3, 4)\r
+                testing::Values(szVGA, sz720p, sz1080p, Size(130, 60)),\r
+                testing::ValuesIn(CvtMode2::all())\r
                 )\r
             )\r
 {\r
     Size sz = get<0>(GetParam());\r
-    int mode = get<1>(GetParam());\r
-    int ch = get<2>(GetParam());\r
+       int mode = get<1>(GetParam());\r
+       ChPair ch = getConversionInfo(mode);\r
 \r
-    Mat src(sz, CV_8UC(ch));\r
-    Mat dst(sz, CV_8UC3);\r
+    Mat src(sz.height + sz.height / 2, sz.width, CV_8UC(ch.scn));\r
+    Mat dst(sz, CV_8UC(ch.dcn));\r
 \r
     declare.in(src, WARMUP_RNG).out(dst);\r
-\r
-    TEST_CYCLE() cvtColor(src, dst, mode);\r
-\r
-    SANITY_CHECK(dst, 1);\r
-}\r
-\r
-CV_ENUM(CvtInBGR565Type, CV_RGB2BGR565, CV_RGBA2BGR565, CV_BGR2BGR565, CV_BGRA2BGR565)\r
-\r
-typedef std::tr1::tuple<Size, CvtInBGR565Type> Size_CvtInBGR565Type_t;\r
-typedef perf::TestBaseWithParam<Size_CvtInBGR565Type_t> Size_CvtInBGR565Type;\r
-\r
-PERF_TEST_P( Size_CvtInBGR565Type, cvtColor_toBGR565,\r
-             testing::Combine\r
-             (\r
-                 testing::Values(TYPICAL_MAT_SIZES),\r
-                 testing::ValuesIn(CvtInBGR565Type::all())\r
-             )\r
-           )\r
-{\r
-    Size sz = get<0>(GetParam());\r
-    CvtInBGR565Type code = get<1>(GetParam());\r
-\r
-    Mat src;\r
-    if ( code == CV_RGB2BGR565 || code == CV_BGR2BGR565 )\r
-        src.create(sz, CV_8UC3);\r
-    else\r
-        src.create(sz, CV_8UC4);\r
-\r
-    randu(src, 0, 255);\r
-\r
-    Mat dst;\r
     \r
-    TEST_CYCLE() cvtColor( src, dst, code );\r
-\r
-    SANITY_CHECK(dst);\r
-}\r
-\r
-CV_ENUM(CvtMode2, CV_RGB2BGR, CV_RGB2RGBA, CV_RGB2BGRA, CV_RGBA2RGB, CV_RGBA2BGR, CV_RGBA2BGRA)\r
-\r
-typedef std::tr1::tuple<Size, CvtMode2> Size_CvtMode2_t;\r
-typedef perf::TestBaseWithParam<Size_CvtMode2_t> Size_CvtMode2;\r
-\r
-PERF_TEST_P( Size_CvtMode2, cvtColor_C3toC4_and_back,\r
-             testing::Combine\r
-             (\r
-                 testing::Values(TYPICAL_MAT_SIZES),\r
-                 testing::ValuesIn(CvtMode2::all())\r
-             )\r
-           )\r
-{\r
-    Size sz = get<0>(GetParam());\r
-    CvtMode2 code = get<1>(GetParam());\r
-\r
-    Mat src;\r
-    if ( code == CV_RGB2BGR || code == CV_RGB2RGBA || code == CV_RGB2BGRA )\r
-        src.create(sz, CV_8UC3);\r
-    else\r
-        src.create(sz, CV_8UC4);\r
-\r
-    randu(src, 0, 255);\r
-\r
-    Mat dst;\r
-    TEST_CYCLE() cvtColor( src, dst, code );\r
-\r
-    SANITY_CHECK(dst);\r
+    TEST_CYCLE() cvtColor(src, dst, mode, ch.dcn);\r
+    \r
+    SANITY_CHECK(dst, 1);\r
 }
\ No newline at end of file