@@ -67,10 +67,6 @@ min4( float a, float b, float c, float d )
67
67
#define INSIDE 2 // unknown
68
68
#define CHANGE 3 // servise
69
69
70
- // Processing data types
71
- typedef double data_type;
72
- int data_type_cv = CV_64F;
73
-
74
70
typedef struct CvHeapElem
75
71
{
76
72
float T;
@@ -281,7 +277,7 @@ icvCalcFMM(const CvMat *f, CvMat *t, CvPriorityQueueFloat *Heap, bool negate) {
281
277
}
282
278
}
283
279
284
-
280
+ template < typename data_type>
285
281
static void
286
282
icvTeleaInpaintFMM (const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQueueFloat *Heap ) {
287
283
int i = 0 , j = 0 , ii = 0 , jj = 0 , k, l, q, color = 0 ;
@@ -513,7 +509,7 @@ icvTeleaInpaintFMM(const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQu
513
509
}
514
510
}
515
511
516
-
512
+ template < typename data_type>
517
513
static void
518
514
icvNSInpaintFMM (const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQueueFloat *Heap) {
519
515
int i = 0 , j = 0 , ii = 0 , jj = 0 , k, l, q, color = 0 ;
@@ -644,28 +640,28 @@ icvNSInpaintFMM(const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQueue
644
640
645
641
if (CV_MAT_ELEM (*f,uchar,k+1 ,l)!=INSIDE) {
646
642
if (CV_MAT_ELEM (*f,uchar,k-1 ,l)!=INSIDE) {
647
- gradI.x =(float )(abs (CV_MAT_ELEM (*out,data_type,kp+1 ,lm)-CV_MAT_ELEM (*out,data_type,kp,lm))+
648
- abs (CV_MAT_ELEM (*out,data_type,kp,lm)-CV_MAT_ELEM (*out,data_type,km-1 ,lm)));
643
+ gradI.x =(float )(std:: abs (CV_MAT_ELEM (*out,data_type,kp+1 ,lm)-CV_MAT_ELEM (*out,data_type,kp,lm))+
644
+ std:: abs (CV_MAT_ELEM (*out,data_type,kp,lm)-CV_MAT_ELEM (*out,data_type,km-1 ,lm)));
649
645
} else {
650
- gradI.x =(float )(abs (CV_MAT_ELEM (*out,data_type,kp+1 ,lm)-CV_MAT_ELEM (*out,data_type,kp,lm)))*2 .0f ;
646
+ gradI.x =(float )(std:: abs (CV_MAT_ELEM (*out,data_type,kp+1 ,lm)-CV_MAT_ELEM (*out,data_type,kp,lm)))*2 .0f ;
651
647
}
652
648
} else {
653
649
if (CV_MAT_ELEM (*f,uchar,k-1 ,l)!=INSIDE) {
654
- gradI.x =(float )(abs (CV_MAT_ELEM (*out,data_type,kp,lm)-CV_MAT_ELEM (*out,data_type,km-1 ,lm)))*2 .0f ;
650
+ gradI.x =(float )(std:: abs (CV_MAT_ELEM (*out,data_type,kp,lm)-CV_MAT_ELEM (*out,data_type,km-1 ,lm)))*2 .0f ;
655
651
} else {
656
652
gradI.x =0 ;
657
653
}
658
654
}
659
655
if (CV_MAT_ELEM (*f,uchar,k,l+1 )!=INSIDE) {
660
656
if (CV_MAT_ELEM (*f,uchar,k,l-1 )!=INSIDE) {
661
- gradI.y =(float )(abs (CV_MAT_ELEM (*out,data_type,km,lp+1 )-CV_MAT_ELEM (*out,data_type,km,lm))+
662
- abs (CV_MAT_ELEM (*out,data_type,km,lm)-CV_MAT_ELEM (*out,data_type,km,lm-1 )));
657
+ gradI.y =(float )(std:: abs (CV_MAT_ELEM (*out,data_type,km,lp+1 )-CV_MAT_ELEM (*out,data_type,km,lm))+
658
+ std:: abs (CV_MAT_ELEM (*out,data_type,km,lm)-CV_MAT_ELEM (*out,data_type,km,lm-1 )));
663
659
} else {
664
- gradI.y =(float )(abs (CV_MAT_ELEM (*out,data_type,km,lp+1 )-CV_MAT_ELEM (*out,data_type,km,lm)))*2 .0f ;
660
+ gradI.y =(float )(std:: abs (CV_MAT_ELEM (*out,data_type,km,lp+1 )-CV_MAT_ELEM (*out,data_type,km,lm)))*2 .0f ;
665
661
}
666
662
} else {
667
663
if (CV_MAT_ELEM (*f,uchar,k,l-1 )!=INSIDE) {
668
- gradI.y =(float )(abs (CV_MAT_ELEM (*out,data_type,km,lm)-CV_MAT_ELEM (*out,data_type,km,lm-1 )))*2 .0f ;
664
+ gradI.y =(float )(std:: abs (CV_MAT_ELEM (*out,data_type,km,lm)-CV_MAT_ELEM (*out,data_type,km,lm-1 )))*2 .0f ;
669
665
} else {
670
666
gradI.y =0 ;
671
667
}
@@ -748,11 +744,13 @@ cvInpaint( const CvArr* _input_img, const CvArr* _inpaint_mask, CvArr* _output_i
748
744
if ( !CV_ARE_SIZES_EQ (input_img,output_img) || !CV_ARE_SIZES_EQ (input_img,inpaint_mask))
749
745
CV_Error ( CV_StsUnmatchedSizes, " All the input and output images must have the same size" );
750
746
751
- if ( (CV_MAT_CN (input_img->type ) != 1 &&
747
+ if ( (CV_MAT_TYPE (input_img->type ) != CV_8U &&
748
+ CV_MAT_TYPE (input_img->type ) != CV_16U &&
749
+ CV_MAT_TYPE (input_img->type ) != CV_32F &&
752
750
CV_MAT_TYPE (input_img->type ) != CV_8UC3) ||
753
751
!CV_ARE_TYPES_EQ (input_img,output_img) )
754
752
CV_Error ( CV_StsUnsupportedFormat,
755
- " Any 1-channel and 8-bit 3-channel input/output images are supported" );
753
+ " 8-bit, 16-bit unsigned or 32-bit float 1-channel and 8-bit 3-channel input/output images are supported" );
756
754
757
755
if ( CV_MAT_TYPE (inpaint_mask->type ) != CV_8UC1 )
758
756
CV_Error ( CV_StsUnsupportedFormat, " The mask must be 8-bit 1-channel image" );
@@ -802,10 +800,36 @@ cvInpaint( const CvArr* _input_img, const CvArr* _inpaint_mask, CvArr* _output_i
802
800
cvSub (out,band,out,NULL );
803
801
SET_BORDER1_C1 (out,uchar,0 );
804
802
icvCalcFMM (out,t,Out,true );
805
- icvTeleaInpaintFMM (mask,t,output_img,range,Heap);
803
+ switch (CV_MAT_DEPTH (output_img->type ))
804
+ {
805
+ case CV_8U:
806
+ icvTeleaInpaintFMM<uchar>(mask,t,output_img,range,Heap);
807
+ break ;
808
+ case CV_16U:
809
+ icvTeleaInpaintFMM<ushort>(mask,t,output_img,range,Heap);
810
+ break ;
811
+ case CV_32F:
812
+ icvTeleaInpaintFMM<float >(mask,t,output_img,range,Heap);
813
+ break ;
814
+ default :
815
+ CV_Error ( cv::Error::StsBadArg, " Unsupportedformat of the input image" );
816
+ }
806
817
}
807
818
else if (flags == cv::INPAINT_NS) {
808
- icvNSInpaintFMM (mask,t,output_img,range,Heap);
819
+ switch (CV_MAT_DEPTH (output_img->type ))
820
+ {
821
+ case CV_8U:
822
+ icvNSInpaintFMM<uchar>(mask,t,output_img,range,Heap);
823
+ break ;
824
+ case CV_16U:
825
+ icvNSInpaintFMM<ushort>(mask,t,output_img,range,Heap);
826
+ break ;
827
+ case CV_32F:
828
+ icvNSInpaintFMM<float >(mask,t,output_img,range,Heap);
829
+ break ;
830
+ default :
831
+ CV_Error ( cv::Error::StsBadArg, " Unsupported format of the input image" );
832
+ }
809
833
} else {
810
834
CV_Error ( cv::Error::StsBadArg, " The flags argument must be one of CV_INPAINT_TELEA or CV_INPAINT_NS" );
811
835
}
@@ -819,17 +843,6 @@ void cv::inpaint( InputArray _src, InputArray _mask, OutputArray _dst,
819
843
Mat src = _src.getMat (), mask = _mask.getMat ();
820
844
_dst.create ( src.size (), src.type () );
821
845
Mat dst = _dst.getMat ();
822
-
823
- Mat src_temp;
824
- if (src.channels () == 1 ) {
825
- src.convertTo (src_temp, data_type_cv);
826
- } else
827
- src_temp = src.clone ();
828
-
829
- Mat dst_temp = Mat::zeros (src_temp.size (), src_temp.type ());
830
- CvMat c_src = src_temp, c_mask = mask, c_dst = dst_temp;
846
+ CvMat c_src = src, c_mask = mask, c_dst = dst;
831
847
cvInpaint ( &c_src, &c_mask, &c_dst, inpaintRange, flags );
832
-
833
- if (src.channels () == 1 ) dst_temp.convertTo (dst_temp, src.type ());
834
- dst_temp.copyTo (dst);
835
848
}
0 commit comments