📄 cxcmp.cpp
字号:
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// Intel License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2000, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of Intel Corporation may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
/* ////////////////////////////////////////////////////////////////////
//
// CvMat comparison functions: range checking, min, max
//
// */
#include "_cxcore.h"
/****************************************************************************************\
* InRange[S] *
\****************************************************************************************/
#define ICV_DEF_IN_RANGE_CASE_C1( worktype, _toggle_macro_ ) \
for( x = 0; x < size.width; x++ ) \
{ \
worktype a1 = _toggle_macro_(src1[x]), \
a2 = src2[x], a3 = src3[x]; \
dst[x] = (uchar)-(_toggle_macro_(a2) <= a1 && \
a1 < _toggle_macro_(a3)); \
}
#define ICV_DEF_IN_RANGE_CASE_C2( worktype, _toggle_macro_ ) \
for( x = 0; x < size.width; x++ ) \
{ \
worktype a1 = _toggle_macro_(src1[x*2]), \
a2 = src2[x*2], a3 = src3[x*2]; \
int f = _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
a1 = _toggle_macro_(src1[x*2+1]); \
a2 = src2[x*2+1]; \
a3 = src3[x*2+1]; \
f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
dst[x] = (uchar)-f; \
}
#define ICV_DEF_IN_RANGE_CASE_C3( worktype, _toggle_macro_ ) \
for( x = 0; x < size.width; x++ ) \
{ \
worktype a1 = _toggle_macro_(src1[x*3]), \
a2 = src2[x*3], a3 = src3[x*3]; \
int f = _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
a1 = _toggle_macro_(src1[x*3+1]); \
a2 = src2[x*3+1]; \
a3 = src3[x*3+1]; \
f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
a1 = _toggle_macro_(src1[x*3+2]); \
a2 = src2[x*3+2]; \
a3 = src3[x*3+2]; \
f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
dst[x] = (uchar)-f; \
}
#define ICV_DEF_IN_RANGE_CASE_C4( worktype, _toggle_macro_ ) \
for( x = 0; x < size.width; x++ ) \
{ \
worktype a1 = _toggle_macro_(src1[x*4]), \
a2 = src2[x*4], a3 = src3[x*4]; \
int f = _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
a1 = _toggle_macro_(src1[x*4+1]); \
a2 = src2[x*4+1]; \
a3 = src3[x*4+1]; \
f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
a1 = _toggle_macro_(src1[x*4+2]); \
a2 = src2[x*4+2]; \
a3 = src3[x*4+2]; \
f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
a1 = _toggle_macro_(src1[x*4+3]); \
a2 = src2[x*4+3]; \
a3 = src3[x*4+3]; \
f &= _toggle_macro_(a2) <= a1 && a1 < _toggle_macro_(a3); \
dst[x] = (uchar)-f; \
}
#define ICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, \
_toggle_macro_, cn ) \
static CvStatus CV_STDCALL \
icvInRange_##flavor##_C##cn##R( const arrtype* src1, int step1, \
const arrtype* src2, int step2, \
const arrtype* src3, int step3, \
uchar* dst, int step, CvSize size ) \
{ \
step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]); \
step3 /= sizeof(src3[0]); step /= sizeof(dst[0]); \
\
for( ; size.height--; src1 += step1, src2 += step2, \
src3 += step3, dst += step ) \
{ \
int x; \
ICV_DEF_IN_RANGE_CASE_C##cn( worktype, _toggle_macro_ ) \
} \
\
return CV_OK; \
}
#define ICV_DEF_IN_RANGE_CASE_CONST_C1( worktype, _toggle_macro_ ) \
for( x = 0; x < size.width; x++ ) \
{ \
worktype a1 = _toggle_macro_(src1[x]); \
dst[x] = (uchar)-(scalar[0] <= a1 && a1 < scalar[1]); \
}
#define ICV_DEF_IN_RANGE_CASE_CONST_C2( worktype, _toggle_macro_ ) \
for( x = 0; x < size.width; x++ ) \
{ \
worktype a1 = _toggle_macro_(src1[x*2]); \
int f = scalar[0] <= a1 && a1 < scalar[2]; \
a1 = _toggle_macro_(src1[x*2+1]); \
f &= scalar[1] <= a1 && a1 < scalar[3]; \
dst[x] = (uchar)-f; \
}
#define ICV_DEF_IN_RANGE_CASE_CONST_C3( worktype, _toggle_macro_ ) \
for( x = 0; x < size.width; x++ ) \
{ \
worktype a1 = _toggle_macro_(src1[x*3]); \
int f = scalar[0] <= a1 && a1 < scalar[3]; \
a1 = _toggle_macro_(src1[x*3+1]); \
f &= scalar[1] <= a1 && a1 < scalar[4]; \
a1 = _toggle_macro_(src1[x*3+2]); \
f &= scalar[2] <= a1 && a1 < scalar[5]; \
dst[x] = (uchar)-f; \
}
#define ICV_DEF_IN_RANGE_CASE_CONST_C4( worktype, _toggle_macro_ ) \
for( x = 0; x < size.width; x++ ) \
{ \
worktype a1 = _toggle_macro_(src1[x*4]); \
int f = scalar[0] <= a1 && a1 < scalar[4]; \
a1 = _toggle_macro_(src1[x*4+1]); \
f &= scalar[1] <= a1 && a1 < scalar[5]; \
a1 = _toggle_macro_(src1[x*4+2]); \
f &= scalar[2] <= a1 && a1 < scalar[6]; \
a1 = _toggle_macro_(src1[x*4+3]); \
f &= scalar[3] <= a1 && a1 < scalar[7]; \
dst[x] = (uchar)-f; \
}
#define ICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, \
_toggle_macro_, cn ) \
static CvStatus CV_STDCALL \
icvInRangeC_##flavor##_C##cn##R( const arrtype* src1, int step1, \
uchar* dst, int step, CvSize size, \
const worktype* scalar ) \
{ \
step1 /= sizeof(src1[0]); step /= sizeof(dst[0]); \
\
for( ; size.height--; src1 += step1, dst += step ) \
{ \
int x; \
ICV_DEF_IN_RANGE_CASE_CONST_C##cn( worktype, _toggle_macro_)\
} \
\
return CV_OK; \
}
#define ICV_DEF_IN_RANGE_ALL( flavor, arrtype, worktype, _toggle_macro_ ) \
ICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, _toggle_macro_, 1 ) \
ICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, _toggle_macro_, 2 ) \
ICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, _toggle_macro_, 3 ) \
ICV_DEF_IN_RANGE_FUNC( flavor, arrtype, worktype, _toggle_macro_, 4 ) \
\
ICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, _toggle_macro_, 1 ) \
ICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, _toggle_macro_, 2 ) \
ICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, _toggle_macro_, 3 ) \
ICV_DEF_IN_RANGE_CONST_FUNC( flavor, arrtype, worktype, _toggle_macro_, 4 )
ICV_DEF_IN_RANGE_ALL( 8u, uchar, int, CV_NOP )
ICV_DEF_IN_RANGE_ALL( 16u, ushort, int, CV_NOP )
ICV_DEF_IN_RANGE_ALL( 16s, short, int, CV_NOP )
ICV_DEF_IN_RANGE_ALL( 32s, int, int, CV_NOP )
ICV_DEF_IN_RANGE_ALL( 32f, float, float, CV_NOP )
ICV_DEF_IN_RANGE_ALL( 64f, double, double, CV_NOP )
#define icvInRange_8s_C1R 0
#define icvInRange_8s_C2R 0
#define icvInRange_8s_C3R 0
#define icvInRange_8s_C4R 0
#define icvInRangeC_8s_C1R 0
#define icvInRangeC_8s_C2R 0
#define icvInRangeC_8s_C3R 0
#define icvInRangeC_8s_C4R 0
CV_DEF_INIT_BIG_FUNC_TAB_2D( InRange, R )
CV_DEF_INIT_BIG_FUNC_TAB_2D( InRangeC, R )
typedef CvStatus (CV_STDCALL * CvInRangeCFunc)( const void* src, int srcstep,
uchar* dst, int dststep,
CvSize size, const void* scalar );
/*************************************** InRange ****************************************/
CV_IMPL void
cvInRange( const void* srcarr1, const void* srcarr2,
const void* srcarr3, void* dstarr )
{
static CvBigFuncTable inrange_tab;
static int inittab = 0;
CV_FUNCNAME( "cvInRange" );
__BEGIN__;
int type, coi = 0;
int src1_step, src2_step, src3_step, dst_step;
CvMat srcstub1, *src1 = (CvMat*)srcarr1;
CvMat srcstub2, *src2 = (CvMat*)srcarr2;
CvMat srcstub3, *src3 = (CvMat*)srcarr3;
CvMat dststub, *dst = (CvMat*)dstarr;
CvSize size;
CvFunc2D_4A func;
if( !inittab )
{
icvInitInRangeRTable( &inrange_tab );
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(src2) )
{
CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
if( !CV_IS_MAT(src3) )
{
CV_CALL( src3 = cvGetMat( src3, &srcstub3, &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_ARE_TYPES_EQ( src1, src2 ) ||
!CV_ARE_TYPES_EQ( src1, src3 ) )
CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
if( !CV_IS_MASK_ARR( dst ))
CV_ERROR( CV_StsUnsupportedFormat, "Destination image should be 8uC1 or 8sC1");
if( !CV_ARE_SIZES_EQ( src1, src2 ) ||
!CV_ARE_SIZES_EQ( src1, src3 ) ||
!CV_ARE_SIZES_EQ( src1, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
type = CV_MAT_TYPE(src1->type);
size = cvGetMatSize( src1 );
if( CV_IS_MAT_CONT( src1->type & src2->type & src3->type & dst->type ))
{
size.width *= size.height;
src1_step = src2_step = src3_step = dst_step = CV_STUB_STEP;
size.height = 1;
}
else
{
src1_step = src1->step;
src2_step = src2->step;
src3_step = src3->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 = (CvFunc2D_4A)(inrange_tab.fn_2d[type]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
IPPI_CALL( func( src1->data.ptr, src1_step, src2->data.ptr, src2_step,
src3->data.ptr, src3_step, dst->data.ptr, dst_step, size ));
__END__;
}
/************************************** InRangeS ****************************************/
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;
CvInRangeCFunc func;
double buf[8];
if( !inittab )
{
icvInitInRangeCRTable( &inrange_tab );
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -