Skip to content

Commit 3f65c12

Browse files
committed
Merge pull request opencv#17982 from nglee:dev_cudaGpuMatConvertToInplaceFix
2 parents 336627a + 11ac26b commit 3f65c12

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

modules/core/src/cuda/gpu_mat.cu

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ void cv::cuda::GpuMat::convertTo(OutputArray _dst, int rtype, Stream& stream) co
561561
{convertToNoScale<double, uchar>, convertToNoScale<double, schar>, convertToNoScale<double, ushort>, convertToNoScale<double, short>, convertToNoScale<double, int>, convertToNoScale<double, float>, 0}
562562
};
563563

564-
funcs[sdepth][ddepth](reshape(1), dst.reshape(1), stream);
564+
funcs[sdepth][ddepth](src.reshape(1), dst.reshape(1), stream);
565565
}
566566

567567
void cv::cuda::GpuMat::convertTo(OutputArray _dst, int rtype, double alpha, double beta, Stream& stream) const
@@ -591,7 +591,7 @@ void cv::cuda::GpuMat::convertTo(OutputArray _dst, int rtype, double alpha, doub
591591
{convertToScale<double, uchar>, convertToScale<double, schar>, convertToScale<double, ushort>, convertToScale<double, short>, convertToScale<double, int>, convertToScale<double, float>, convertToScale<double, double>}
592592
};
593593

594-
funcs[sdepth][ddepth](reshape(1), dst.reshape(1), alpha, beta, stream);
594+
funcs[sdepth][ddepth](src.reshape(1), dst.reshape(1), alpha, beta, stream);
595595
}
596596

597597
void cv::cuda::convertFp16(InputArray _src, OutputArray _dst, Stream& stream)

modules/cudaarithm/test/test_gpumat.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,65 @@ CUDA_TEST_P(GpuMat_ConvertTo, WithScaling)
320320
}
321321
}
322322

323+
CUDA_TEST_P(GpuMat_ConvertTo, InplaceWithOutScaling)
324+
{
325+
cv::Mat src = randomMat(size, depth1);
326+
327+
if ((depth1 == CV_64F || depth2 == CV_64F) && !supportFeature(devInfo, cv::cuda::NATIVE_DOUBLE))
328+
{
329+
try
330+
{
331+
cv::cuda::GpuMat d_srcDst = loadMat(src);
332+
d_srcDst.convertTo(d_srcDst, depth2);
333+
}
334+
catch (const cv::Exception& e)
335+
{
336+
ASSERT_EQ(cv::Error::StsUnsupportedFormat, e.code);
337+
}
338+
}
339+
else
340+
{
341+
cv::cuda::GpuMat d_srcDst = loadMat(src, useRoi);
342+
d_srcDst.convertTo(d_srcDst, depth2);
343+
344+
cv::Mat dst_gold;
345+
src.convertTo(dst_gold, depth2);
346+
347+
EXPECT_MAT_NEAR(dst_gold, d_srcDst, depth2 < CV_32F ? 1.0 : 1e-4);
348+
}
349+
}
350+
351+
352+
CUDA_TEST_P(GpuMat_ConvertTo, InplaceWithScaling)
353+
{
354+
cv::Mat src = randomMat(size, depth1);
355+
double a = randomDouble(0.0, 1.0);
356+
double b = randomDouble(-10.0, 10.0);
357+
358+
if ((depth1 == CV_64F || depth2 == CV_64F) && !supportFeature(devInfo, cv::cuda::NATIVE_DOUBLE))
359+
{
360+
try
361+
{
362+
cv::cuda::GpuMat d_srcDst = loadMat(src);
363+
d_srcDst.convertTo(d_srcDst, depth2, a, b);
364+
}
365+
catch (const cv::Exception& e)
366+
{
367+
ASSERT_EQ(cv::Error::StsUnsupportedFormat, e.code);
368+
}
369+
}
370+
else
371+
{
372+
cv::cuda::GpuMat d_srcDst = loadMat(src, useRoi);
373+
d_srcDst.convertTo(d_srcDst, depth2, a, b);
374+
375+
cv::Mat dst_gold;
376+
src.convertTo(dst_gold, depth2, a, b);
377+
378+
EXPECT_MAT_NEAR(dst_gold, d_srcDst, depth2 < CV_32F ? 1.0 : 1e-4);
379+
}
380+
}
381+
323382
INSTANTIATE_TEST_CASE_P(CUDA, GpuMat_ConvertTo, testing::Combine(
324383
ALL_DEVICES,
325384
DIFFERENT_SIZES,

0 commit comments

Comments
 (0)