OpenCV InRange函数

原文地址: http://blog.csdn.net/wendychueng/article/details/7459390


  1. CV_IMPL void  
  2. cvInRangeS( const void* srcarr, CvScalar lower, CvScalar upper, void* dstarr )  
  3. {  
  4.     static CvBigFuncTable inrange_tab;  
  5.     static int inittab = 0;  
  6.   
  7.     CV_FUNCNAME( "cvInRangeS" );  
  8.   
  9.     __BEGIN__;  
  10.   
  11.     int sctype, type, coi = 0;  
  12.     int src1_step, dst_step;  
  13.     CvMat srcstub1, *src1 = (CvMat*)srcarr;  //矩阵  
  14.     CvMat dststub,  *dst = (CvMat*)dstarr;  
  15.     CvSize size;  
  16.     CvInRangeC Func func;  
  17.     double buf[8];  
  18.   
  19.     if( !inittab )          //第一次调用inittab为0  
  20.     {  
  21.         icvInitInRangeCRTable( &inrange_tab ); //初始化Table  
  22.         inittab = 1;  
  23.     }  
  24.   
  25.     if( !CV_IS_MAT(src1) )  
  26.     {  
  27.         CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));  
  28.         if( coi != 0 )  
  29.             CV_ERROR( CV_BadCOI, "" );  
  30.     }  
  31.   
  32.     if( !CV_IS_MAT(dst) )  
  33.     {  
  34.         CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));  
  35.         if( coi != 0 )  
  36.             CV_ERROR( CV_BadCOI, "" );  
  37.     }  
  38.   
  39.     if( !CV_IS_MASK_ARR( dst ))  
  40.         CV_ERROR( CV_StsUnsupportedFormat, "Destination image should be 8uC1 or 8sC1");  
  41.   
  42.     if( !CV_ARE_SIZES_EQ( src1, dst ))  
  43.         CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );  
  44.   
  45.     sctype = type = CV_MAT_TYPE(src1->type);  //给出矩阵的类型  
  46.     if( CV_MAT_DEPTH(sctype) < CV_32S )  
  47.         sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;  
  48.   
  49.     size = cvGetMatSize( src1 );  
  50.   
  51.     if( CV_IS_MAT_CONT( src1->type & dst->type ))  
  52.     {  
  53.         size.width *= size.height;  
  54.         src1_step = dst_step = CV_STUB_STEP;  
  55.         size.height = 1;  
  56.     }  
  57.     else  
  58.     {  
  59.         src1_step = src1->step;  
  60.         dst_step = dst->step;  
  61.     }  
  62.   
  63.     if( CV_MAT_CN(type) > 4 )  
  64.         CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 4" );  
  65.   
  66.     func = (CvInRangeCFunc)(inrange_tab.fn_2d[type]);  
  67.   
  68.     if( !func )  
  69.         CV_ERROR( CV_StsUnsupportedFormat, "" );  
  70.   
  71.     cvScalarToRawData( &lower, buf, sctype, 0 );  
  72.     cvScalarToRawData( &upper, (char*)buf + CV_ELEM_SIZE(sctype), sctype, 0 );  
  73.   
  74.     IPPI_CALL( func( src1->data.ptr, src1_step, dst->data.ptr,  
  75.                      dst_step, size, buf ));  
  76.   
  77.     __END__;  
  78. }  


InRangeS
检查数组元素是否在两个数量之间 

void cvInRangeS( const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst );
src 
第一个原数组 
lower 
包括进的下边界. 
upper 
不包括进的上边界 
dst 
输出数组必须是 8u 或 8s 类型. 
函数 cvInRangeS 检查输入数组元素范围:对于单通道数组: 

dst(I)=lower0 <= src(I)0 < upper0
对于双通道数组以此类推: 

dst(I)=lower0 <= src(I)0 < upper0 &&
lower1 <= src(I)1 < upper1
如果 src(I) 在范围内dst(I)被设置为 0xff (每一位都是 '1')否则置0 。所有的数组必须有相同的大小(或ROI大小) 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值