OpenCV InRange函数
2016-03-24 21:36
267 查看
原文地址: http://blog.csdn.net/wendychueng/article/details/7459390
CV_IMPL void
cvInRangeS( const void* srcarr, CvScalar lower, CvScalar upper, void* dstarr )
{
static CvBigFuncTable inrange_tab;
static int inittab = 0;
CV_FUNCNAME( "cvInRangeS" );
__BEGIN__;
int sctype, type, coi = 0;
int src1_step, dst_step;
CvMat srcstub1, *src1 = (CvMat*)srcarr; //矩阵
CvMat dststub, *dst = (CvMat*)dstarr;
CvSize size;
CvInRangeC Func func;
double buf[8];
if( !inittab ) //第一次调用inittab为0
{
icvInitInRangeCRTable( &inrange_tab ); //初始化Table
inittab = 1;
}
if( !CV_IS_MAT(src1) )
{
CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
if( !CV_IS_MAT(dst) )
{
CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
if( !CV_IS_MASK_ARR( dst ))
CV_ERROR( CV_StsUnsupportedFormat, "Destination image should be 8uC1 or 8sC1");
if( !CV_ARE_SIZES_EQ( src1, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
sctype = type = CV_MAT_TYPE(src1->type); //给出矩阵的类型
if( CV_MAT_DEPTH(sctype) < CV_32S )
sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
size = cvGetMatSize( src1 );
if( CV_IS_MAT_CONT( src1->type & dst->type ))
{
size.width *= size.height;
src1_step = dst_step = CV_STUB_STEP;
size.height = 1;
}
else
{
src1_step = src1->step;
dst_step = dst->step;
}
if( CV_MAT_CN(type) > 4 )
CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 4" );
func = (CvInRangeCFunc)(inrange_tab.fn_2d[type]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
cvScalarToRawData( &lower, buf, sctype, 0 );
cvScalarToRawData( &upper, (char*)buf + CV_ELEM_SIZE(sctype), sctype, 0 );
IPPI_CALL( func( src1->data.ptr, src1_step, dst->data.ptr,
dst_step, size, buf ));
__END__;
}
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大小)
CV_IMPL void
cvInRangeS( const void* srcarr, CvScalar lower, CvScalar upper, void* dstarr )
{
static CvBigFuncTable inrange_tab;
static int inittab = 0;
CV_FUNCNAME( "cvInRangeS" );
__BEGIN__;
int sctype, type, coi = 0;
int src1_step, dst_step;
CvMat srcstub1, *src1 = (CvMat*)srcarr; //矩阵
CvMat dststub, *dst = (CvMat*)dstarr;
CvSize size;
CvInRangeC Func func;
double buf[8];
if( !inittab ) //第一次调用inittab为0
{
icvInitInRangeCRTable( &inrange_tab ); //初始化Table
inittab = 1;
}
if( !CV_IS_MAT(src1) )
{
CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
if( !CV_IS_MAT(dst) )
{
CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
if( !CV_IS_MASK_ARR( dst ))
CV_ERROR( CV_StsUnsupportedFormat, "Destination image should be 8uC1 or 8sC1");
if( !CV_ARE_SIZES_EQ( src1, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
sctype = type = CV_MAT_TYPE(src1->type); //给出矩阵的类型
if( CV_MAT_DEPTH(sctype) < CV_32S )
sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
size = cvGetMatSize( src1 );
if( CV_IS_MAT_CONT( src1->type & dst->type ))
{
size.width *= size.height;
src1_step = dst_step = CV_STUB_STEP;
size.height = 1;
}
else
{
src1_step = src1->step;
dst_step = dst->step;
}
if( CV_MAT_CN(type) > 4 )
CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 4" );
func = (CvInRangeCFunc)(inrange_tab.fn_2d[type]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
cvScalarToRawData( &lower, buf, sctype, 0 );
cvScalarToRawData( &upper, (char*)buf + CV_ELEM_SIZE(sctype), sctype, 0 );
IPPI_CALL( func( src1->data.ptr, src1_step, dst->data.ptr,
dst_step, size, buf ));
__END__;
}
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大小)
相关文章推荐
- 来谈谈关于Shell中效率的问题
- 秒杀业务架构优化之路
- linux下安装升级mysql到新版本(5.1-5.7)
- Unity3D与JSP TomCat服务器传递数据和文件( 二 ) Unity3D向java传输表单
- ROS_OpenCV2_MatchTemplate模板匹配
- Mac下安装使用OpenCV
- OpenCV直方图均值化
- 命题范式(propositional normal form)
- 关于shell的几个不为人知却十分有用的命令分享
- Linux GCC常用命令
- shell 随机从文件中抽取若干行的实现方法
- Apache 配置二级域名匹配目录及多个站点配置 +阿里云服务器如何解析添加二级域名
- 解决Linux Fedora 虚拟机root用户登录提示"鉴定故障"的问题
- Apache与Tomcat 区别联系
- linux下文件类型获取
- HDU1011 Starship Troopers(树形dp)
- 如何配置Apache虚拟主机?(基于IP、基于端口、基于域名)
- 如何在Linux中设置Eclipse的快捷方式
- IntelliJ 中部署Tomcat应用存在一个带exploded另一个不带exploded
- 看大众点评如何通过实时监控系统CAT打造7*24服务