📄 cvpyramids.c
字号:
/*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*/
#include "_cv.h"
/****************************************************************************************\
Down-sampling pyramids core functions
\****************************************************************************************/
//////////// Filtering macros /////////////
/* COMMON CASE */
/* 1/16[1 4 6 4 1] */
/* ...| x0 | x1 | x2 | x3 | x4 |... */
#define PD_FILTER( x0, x1, x2, x3, x4 ) ((x2)*6+((x1)+(x3))*4+(x0)+(x4))
/* MACROS FOR BORDERS */
/* | b I a | b | reflection used ("I" denotes the image boundary) */
/* LEFT/TOP */
/* 1/16[1 4 6 4 1] */
/* | x2 | x1 I x0 | x1 | x2 |... */
#define PD_LT(x0,x1,x2) ((x0)*6 + (x1)*8 + (x2)*2)
/* RIGHT/BOTTOM */
/* 1/16[1 4 6 4 1] */
/* ...| x0 | x1 | x2 | x3 I x2 | */
#define PD_RB(x0,x1,x2,x3) ((x0) + ((x1) + (x3))*4 + (x2)*7)
/* SINGULAR CASE ( width == 2 || height == 2 ) */
/* 1/16[1 4 6 4 1] */
/* | x0 | x1 I x0 | x1 I x0 | */
#define PD_SINGULAR(x0,x1) (((x0) + (x1))*8)
#define PD_SCALE_INT(x) (((x) + (1<<7)) >> 8)
#define PD_SCALE_FLT(x) ((x)*0.00390625f)
#define PD_SZ 5
////////// generic macro ////////////
#define ICV_DEF_PYR_DOWN_FUNC( flavor, type, worktype, _pd_scale_ ) \
static CvStatus CV_STDCALL \
icvPyrDownG5x5_##flavor##_CnR( const type* src, int srcstep, type* dst, \
int dststep, CvSize size, void *buf, int Cs ) \
{ \
worktype* buffer = (worktype*)buf; /* pointer to temporary buffer */ \
worktype* rows[PD_SZ]; /* array of rows pointers. dim(rows) is PD_SZ */ \
int y, top_row = 0; \
int Wd = size.width/2, Wdn = Wd*Cs; \
int buffer_step = Wdn; \
int pd_sz = (PD_SZ + 1)*buffer_step; \
int fst = 0, lst = size.height <= PD_SZ/2 ? size.height : PD_SZ/2 + 1; \
\
assert( Cs == 1 || Cs == 3 ); \
srcstep /= sizeof(src[0]); dststep /= sizeof(dst[0]); \
\
/* main loop */ \
for( y = 0; y < size.height; y += 2, dst += dststep ) \
{ \
/* set first and last indices of buffer rows which are need to be filled */ \
int x, y1, k = top_row; \
int x1 = buffer_step; \
worktype *row01, *row23, *row4; \
\
/* assign rows pointers */ \
for( y1 = 0; y1 < PD_SZ; y1++ ) \
{ \
rows[y1] = buffer + k; \
k += buffer_step; \
k &= k < pd_sz ? -1 : 0; \
} \
\
row01 = rows[0]; \
row23 = rows[2]; \
row4 = rows[4]; \
\
/* fill new buffer rows with filtered source (horizontal conv) */ \
if( Cs == 1 ) \
{ \
if( size.width > PD_SZ/2 ) \
for( y1 = fst; y1 < lst; y1++, src += srcstep ) \
{ \
worktype *row = rows[y1]; \
\
/* process left & right bounds */ \
row[0] = PD_LT( src[0], src[1], src[2] ); \
row[Wd-1] = PD_RB( src[Wd*2-4], src[Wd*2-3], \
src[Wd*2-2], src[Wd*2-1]); \
/* other points (even) */ \
for( x = 1; x < Wd - 1; x++ ) \
{ \
row[x] = PD_FILTER( src[2*x-2], src[2*x-1], src[2*x], \
src[2*x+1], src[2*x+2] ); \
} \
} \
else \
for( y1 = fst; y1 < lst; y1++, src += srcstep ) \
{ \
rows[y1][0] = PD_SINGULAR( src[0], src[1] ); \
} \
} \
else /* Cs == 3 */ \
{ \
for( y1 = fst; y1 < lst; y1++, src += srcstep ) \
{ \
worktype *row = rows[y1]; \
\
if( size.width > PD_SZ/2 ) \
{ \
int c; \
for( c = 0; c < 3; c++ ) \
{ \
/* process left & right bounds */ \
row[c] = PD_LT( src[c], src[3+c], src[6+c] ); \
row[Wdn-3+c] = PD_RB( src[Wdn*2-12+c], src[Wdn*2-9+c], \
src[Wdn*2-6+c], src[Wdn*2-3+c] ); \
} \
/* other points (even) */ \
for( x = 3; x < Wdn - 3; x += 3 ) \
{ \
row[x] = PD_FILTER( src[2*x-6], src[2*x-3], src[2*x], \
src[2*x+3], src[2*x+6] ); \
row[x+1] = PD_FILTER( src[2*x-5], src[2*x-2], src[2*x+1], \
src[2*x+4], src[2*x+7] ); \
row[x+2] = PD_FILTER( src[2*x-4], src[2*x-1], src[2*x+2], \
src[2*x+5], src[2*x+8] ); \
} \
} \
else /* size.width <= PD_SZ/2 */ \
{ \
row[0] = PD_SINGULAR( src[0], src[3] ); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -