Commit 8624d18c authored by Vladislav Vinogradov's avatar Vladislav Vinogradov

new implementation of gpu debayer

* without border extrapolation
* with aligned write
* process 4 pixels per thread in 8u case
parent 5ce896d9
...@@ -1148,6 +1148,9 @@ GPU_PERF_TEST(CvtColor, cv::gpu::DeviceInfo, cv::Size, MatDepth, CvtColorInfo) ...@@ -1148,6 +1148,9 @@ GPU_PERF_TEST(CvtColor, cv::gpu::DeviceInfo, cv::Size, MatDepth, CvtColorInfo)
cv::gpu::GpuMat src(src_host); cv::gpu::GpuMat src(src_host);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
if (info.code >= cv::COLOR_BayerBG2BGR && info.code <= cv::COLOR_BayerGR2BGR)
info.dcn = 4;
cv::gpu::cvtColor(src, dst, info.code, info.dcn); cv::gpu::cvtColor(src, dst, info.code, info.dcn);
TEST_CYCLE() TEST_CYCLE()
......
...@@ -58,8 +58,10 @@ void cv::gpu::gammaCorrection(const GpuMat&, GpuMat&, bool, Stream&) { throw_nog ...@@ -58,8 +58,10 @@ void cv::gpu::gammaCorrection(const GpuMat&, GpuMat&, bool, Stream&) { throw_nog
namespace cv { namespace gpu { namespace cv { namespace gpu {
namespace device namespace device
{ {
template <typename T, int cn> template <int cn>
void Bayer2BGR_gpu(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream); void Bayer2BGR_8u_gpu(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
template <int cn>
void Bayer2BGR_16u_gpu(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
} }
}} }}
...@@ -1337,9 +1339,9 @@ namespace ...@@ -1337,9 +1339,9 @@ namespace
typedef void (*func_t)(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream); typedef void (*func_t)(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
static const func_t funcs[3][4] = static const func_t funcs[3][4] =
{ {
{0,0,Bayer2BGR_gpu<uchar, 3>, Bayer2BGR_gpu<uchar, 4>}, {0,0,Bayer2BGR_8u_gpu<3>, Bayer2BGR_8u_gpu<4>},
{0,0,0,0}, {0,0,0,0},
{0,0,Bayer2BGR_gpu<ushort, 3>, Bayer2BGR_gpu<ushort, 4>} {0,0,Bayer2BGR_16u_gpu<3>, Bayer2BGR_16u_gpu<4>}
}; };
if (dcn <= 0) dcn = 3; if (dcn <= 0) dcn = 3;
......
This diff is collapsed.
...@@ -41,6 +41,8 @@ ...@@ -41,6 +41,8 @@
#include "precomp.hpp" #include "precomp.hpp"
#ifdef HAVE_CUDA
namespace { namespace {
/////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////
...@@ -1746,10 +1748,10 @@ TEST_P(CvtColor, RGBA2mRGBA) ...@@ -1746,10 +1748,10 @@ TEST_P(CvtColor, RGBA2mRGBA)
TEST_P(CvtColor, BayerBG2BGR) TEST_P(CvtColor, BayerBG2BGR)
{ {
if (depth != CV_8U && depth != CV_16U) if ((depth != CV_8U && depth != CV_16U) || useRoi)
return; return;
cv::Mat src = randomMat(size, CV_8UC1); cv::Mat src = randomMat(size, depth);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerBG2BGR); cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerBG2BGR);
...@@ -1757,15 +1759,15 @@ TEST_P(CvtColor, BayerBG2BGR) ...@@ -1757,15 +1759,15 @@ TEST_P(CvtColor, BayerBG2BGR)
cv::Mat dst_gold; cv::Mat dst_gold;
cv::cvtColor(src, dst_gold, cv::COLOR_BayerBG2BGR); cv::cvtColor(src, dst_gold, cv::COLOR_BayerBG2BGR);
EXPECT_MAT_NEAR(dst_gold, dst, 0); EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
} }
TEST_P(CvtColor, BayerBG2BGR4) TEST_P(CvtColor, BayerBG2BGR4)
{ {
if (depth != CV_8U && depth != CV_16U) if ((depth != CV_8U && depth != CV_16U) || useRoi)
return; return;
cv::Mat src = randomMat(size, CV_8UC1); cv::Mat src = randomMat(size, depth);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerBG2BGR, 4); cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerBG2BGR, 4);
...@@ -1779,15 +1781,16 @@ TEST_P(CvtColor, BayerBG2BGR4) ...@@ -1779,15 +1781,16 @@ TEST_P(CvtColor, BayerBG2BGR4)
cv::Mat dst3; cv::Mat dst3;
cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR); cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR);
EXPECT_MAT_NEAR(dst_gold, dst3, 0);
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst3(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
} }
TEST_P(CvtColor, BayerGB2BGR) TEST_P(CvtColor, BayerGB2BGR)
{ {
if (depth != CV_8U && depth != CV_16U) if ((depth != CV_8U && depth != CV_16U) || useRoi)
return; return;
cv::Mat src = randomMat(size, CV_8UC1); cv::Mat src = randomMat(size, depth);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGB2BGR); cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGB2BGR);
...@@ -1795,15 +1798,15 @@ TEST_P(CvtColor, BayerGB2BGR) ...@@ -1795,15 +1798,15 @@ TEST_P(CvtColor, BayerGB2BGR)
cv::Mat dst_gold; cv::Mat dst_gold;
cv::cvtColor(src, dst_gold, cv::COLOR_BayerGB2BGR); cv::cvtColor(src, dst_gold, cv::COLOR_BayerGB2BGR);
EXPECT_MAT_NEAR(dst_gold, dst, 0); EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
} }
TEST_P(CvtColor, BayerGB2BGR4) TEST_P(CvtColor, BayerGB2BGR4)
{ {
if (depth != CV_8U && depth != CV_16U) if ((depth != CV_8U && depth != CV_16U) || useRoi)
return; return;
cv::Mat src = randomMat(size, CV_8UC1); cv::Mat src = randomMat(size, depth);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGB2BGR, 4); cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGB2BGR, 4);
...@@ -1817,15 +1820,15 @@ TEST_P(CvtColor, BayerGB2BGR4) ...@@ -1817,15 +1820,15 @@ TEST_P(CvtColor, BayerGB2BGR4)
cv::Mat dst3; cv::Mat dst3;
cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR); cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR);
EXPECT_MAT_NEAR(dst_gold, dst3, 0); EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst3(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
} }
TEST_P(CvtColor, BayerRG2BGR) TEST_P(CvtColor, BayerRG2BGR)
{ {
if (depth != CV_8U && depth != CV_16U) if ((depth != CV_8U && depth != CV_16U) || useRoi)
return; return;
cv::Mat src = randomMat(size, CV_8UC1); cv::Mat src = randomMat(size, depth);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerRG2BGR); cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerRG2BGR);
...@@ -1833,15 +1836,15 @@ TEST_P(CvtColor, BayerRG2BGR) ...@@ -1833,15 +1836,15 @@ TEST_P(CvtColor, BayerRG2BGR)
cv::Mat dst_gold; cv::Mat dst_gold;
cv::cvtColor(src, dst_gold, cv::COLOR_BayerRG2BGR); cv::cvtColor(src, dst_gold, cv::COLOR_BayerRG2BGR);
EXPECT_MAT_NEAR(dst_gold, dst, 0); EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
} }
TEST_P(CvtColor, BayerRG2BGR4) TEST_P(CvtColor, BayerRG2BGR4)
{ {
if (depth != CV_8U && depth != CV_16U) if ((depth != CV_8U && depth != CV_16U) || useRoi)
return; return;
cv::Mat src = randomMat(size, CV_8UC1); cv::Mat src = randomMat(size, depth);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerRG2BGR, 4); cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerRG2BGR, 4);
...@@ -1855,15 +1858,15 @@ TEST_P(CvtColor, BayerRG2BGR4) ...@@ -1855,15 +1858,15 @@ TEST_P(CvtColor, BayerRG2BGR4)
cv::Mat dst3; cv::Mat dst3;
cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR); cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR);
EXPECT_MAT_NEAR(dst_gold, dst3, 0); EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst3(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
} }
TEST_P(CvtColor, BayerGR2BGR) TEST_P(CvtColor, BayerGR2BGR)
{ {
if (depth != CV_8U && depth != CV_16U) if ((depth != CV_8U && depth != CV_16U) || useRoi)
return; return;
cv::Mat src = randomMat(size, CV_8UC1); cv::Mat src = randomMat(size, depth);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGR2BGR); cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGR2BGR);
...@@ -1871,15 +1874,15 @@ TEST_P(CvtColor, BayerGR2BGR) ...@@ -1871,15 +1874,15 @@ TEST_P(CvtColor, BayerGR2BGR)
cv::Mat dst_gold; cv::Mat dst_gold;
cv::cvtColor(src, dst_gold, cv::COLOR_BayerGR2BGR); cv::cvtColor(src, dst_gold, cv::COLOR_BayerGR2BGR);
EXPECT_MAT_NEAR(dst_gold, dst, 0); EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
} }
TEST_P(CvtColor, BayerGR2BGR4) TEST_P(CvtColor, BayerGR2BGR4)
{ {
if (depth != CV_8U && depth != CV_16U) if ((depth != CV_8U && depth != CV_16U) || useRoi)
return; return;
cv::Mat src = randomMat(size, CV_8UC1); cv::Mat src = randomMat(size, depth);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGR2BGR, 4); cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGR2BGR, 4);
...@@ -1893,7 +1896,7 @@ TEST_P(CvtColor, BayerGR2BGR4) ...@@ -1893,7 +1896,7 @@ TEST_P(CvtColor, BayerGR2BGR4)
cv::Mat dst3; cv::Mat dst3;
cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR); cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR);
EXPECT_MAT_NEAR(dst_gold, dst3, 0); EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst3(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
} }
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, CvtColor, testing::Combine( INSTANTIATE_TEST_CASE_P(GPU_ImgProc, CvtColor, testing::Combine(
...@@ -1943,3 +1946,5 @@ INSTANTIATE_TEST_CASE_P(GPU_ImgProc, SwapChannels, testing::Combine( ...@@ -1943,3 +1946,5 @@ INSTANTIATE_TEST_CASE_P(GPU_ImgProc, SwapChannels, testing::Combine(
WHOLE_SUBMAT)); WHOLE_SUBMAT));
} // namespace } // namespace
#endif // HAVE_CUDA
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment