@@ -382,6 +382,14 @@ namespace cv { namespace cuda { namespace device
382382 template void Bayer2BGR_16u_gpu<3 >(PtrStepSzb src, PtrStepSzb dst, bool blue_last, bool start_with_green, cudaStream_t stream);
383383 template void Bayer2BGR_16u_gpu<4 >(PtrStepSzb src, PtrStepSzb dst, bool blue_last, bool start_with_green, cudaStream_t stream);
384384
385+ template <typename D> __device__ __forceinline__ D toDstColor (const float3 & pix){
386+ return toDst<D>(make_uchar3 (saturate_cast<uchar>(pix.x ), saturate_cast<uchar>(pix.y ), saturate_cast<uchar>(pix.z )));
387+ }
388+ template <> __device__ __forceinline__ float3 toDstColor<float3 >(const float3 & pix)
389+ {
390+ return pix;
391+ }
392+
385393 // ////////////////////////////////////////////////////////////
386394 // Bayer Demosaicing (Malvar, He, and Cutler)
387395 //
@@ -507,16 +515,15 @@ namespace cv { namespace cuda { namespace device
507515 alternate.y = (y + firstRed.y ) % 2 ;
508516
509517 // in BGR sequence;
510- uchar3 pixelColor =
518+ float3 pixelColor =
511519 (alternate.y == 0 ) ?
512520 ((alternate.x == 0 ) ?
513- make_uchar3 (saturate_cast<uchar>( PATTERN.y ), saturate_cast<uchar>( PATTERN.x ), saturate_cast<uchar>(C) ) :
514- make_uchar3 (saturate_cast<uchar>( PATTERN.w ), saturate_cast<uchar>(C), saturate_cast<uchar>( PATTERN.z ) )) :
521+ make_float3 ( PATTERN.y , PATTERN.x , C ) :
522+ make_float3 ( PATTERN.w , C, PATTERN.z )) :
515523 ((alternate.x == 0 ) ?
516- make_uchar3 (saturate_cast<uchar>(PATTERN.z ), saturate_cast<uchar>(C), saturate_cast<uchar>(PATTERN.w )) :
517- make_uchar3 (saturate_cast<uchar>(C), saturate_cast<uchar>(PATTERN.x ), saturate_cast<uchar>(PATTERN.y )));
518-
519- dst (y, x) = toDst<DstType>(pixelColor);
524+ make_float3 (PATTERN.z , C, PATTERN.w ) :
525+ make_float3 (C, PATTERN.x , PATTERN.y ));
526+ dst (y, x) = toDstColor<DstType>(pixelColor);
520527 }
521528
522529 template <int cn>
@@ -545,6 +552,29 @@ namespace cv { namespace cuda { namespace device
545552 template void MHCdemosaic<1 >(PtrStepSzb src, int2 sourceOffset, PtrStepSzb dst, int2 firstRed, cudaStream_t stream);
546553 template void MHCdemosaic<3 >(PtrStepSzb src, int2 sourceOffset, PtrStepSzb dst, int2 firstRed, cudaStream_t stream);
547554 template void MHCdemosaic<4 >(PtrStepSzb src, int2 sourceOffset, PtrStepSzb dst, int2 firstRed, cudaStream_t stream);
555+
556+ // Implement MHCdemosaic for float and with a result of 3 channels
557+ void MHCdemosaic_float3 (PtrStepSzf src, int2 sourceOffset, PtrStepSzf dst, int2 firstRed, cudaStream_t stream)
558+ {
559+ typedef typename TypeVec<float , 3 >::vec_type dst_t ;
560+
561+ const dim3 block (32 , 8 );
562+ const dim3 grid (divUp (src.cols , block.x ), divUp (src.rows , block.y ));
563+
564+ if (sourceOffset.x || sourceOffset.y ) {
565+ cv::cudev::TextureOff<float > texSrc (src, sourceOffset.y , sourceOffset.x );
566+ MHCdemosaic<dst_t , cv::cudev::TextureOffPtr<float >><<<grid, block, 0 , stream>>> ((PtrStepSz<dst_t >)dst, texSrc, firstRed);
567+ }
568+ else {
569+ cv::cudev::Texture<float > texSrc (src);
570+ MHCdemosaic<dst_t , cv::cudev::TexturePtr<float >><<<grid, block, 0 , stream>>> ((PtrStepSz<dst_t >)dst, texSrc, firstRed);
571+ }
572+
573+ cudaSafeCall ( cudaGetLastError () );
574+
575+ if (stream == 0 )
576+ cudaSafeCall ( cudaDeviceSynchronize () );
577+ }
548578}}}
549579
550580#endif /* CUDA_DISABLER */
0 commit comments