/*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 "_cvaux.h" #if 0 CvStatus icvFetchLine8uC3R( uchar * src, int src_step, uchar * dst, int *dst_num, CvSize src_size, CvPoint start, CvPoint end ) { int i; int dx = end.x - start.x, dy = end.y - start.y; int err; if( !src || !dst || (src_size.width | src_size.height) < 0 || src_step < src_size.width * 3 || (unsigned) start.x >= (unsigned) src_size.width || (unsigned) start.y >= (unsigned) src_size.height || (unsigned) end.x >= (unsigned) src_size.width || (unsigned) end.y >= (unsigned) src_size.height ) return CV_BADFACTOR_ERR; if( dx < 0 ) { dx = -dx; dy = -dy; start.x = end.x; start.y = end.y; } src += start.y * src_step + start.x * 3; i = dy >> 31; dy = (dy ^ i) - i; src_step = (src_step ^ i) - i; if( dx > dy ) { if( dst_num ) { if( *dst_num <= dx ) return CV_BADSIZE_ERR; *dst_num = dx + 1; } err = dx; dx += dx; dy += dy; for( i = dx; i >= 0; i -= 2, dst += 3 ) { int mask = (err -= dy) < 0 ? -1 : 0; dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; err += dx & mask; src += (src_step & mask) + 3; } } else { if( dst_num ) { if( *dst_num <= dy ) return CV_BADSIZE_ERR; *dst_num = dy + 1; } err = dy; dx += dx; dy += dy; for( i = dy; i >= 0; i -= 2, dst += 3 ) { int mask = (err -= dx) < 0 ? -1 : 0; dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; err += dy & mask; src += src_step + (mask & 3); } } return CV_NO_ERR; } CvStatus icvDrawLine8uC3R( uchar * src, int src_num, uchar * dst, int dst_step, CvSize dst_size, CvPoint start, CvPoint end ) { int i; int dx = end.x - start.x, dy = end.y - start.y; int err; if( !src || !dst || (dst_size.width | dst_size.height) < 0 || dst_step < dst_size.width * 3 || (unsigned) start.x >= (unsigned) dst_size.width || (unsigned) start.y >= (unsigned) dst_size.height || (unsigned) end.x >= (unsigned) dst_size.width || (unsigned) end.y >= (unsigned) dst_size.height ) return CV_BADFACTOR_ERR; if( dx < 0 ) { dx = -dx; dy = -dy; start.x = end.x; start.y = end.y; } dst += start.y * dst_step + start.x * 3; i = dy >> 31; dy = (dy ^ i) - i; dst_step = (dst_step ^ i) - i; if( dx > dy ) { if( (unsigned) (src_num - 1) < (unsigned) dx ) return CV_BADSIZE_ERR; err = dx; dx += dx; dy += dy; for( i = dx; i >= 0; i -= 2, src += 3 ) { int mask = (err -= dy) < 0 ? -1 : 0; dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; err += dx & mask; dst += (dst_step & mask) + 3; } } else { if( (unsigned) (src_num - 1) < (unsigned) dy ) return CV_BADSIZE_ERR; err = dy; dx += dx; dy += dy; for( i = dy; i >= 0; i -= 2, src += 3 ) { int mask = (err -= dx) < 0 ? -1 : 0; dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; err += dy & mask; dst += dst_step + (mask & 3); } } return CV_NO_ERR; } #endif /*======================================================================================*/ static CvStatus icvPreWarpImage8uC3R( int numLines, /* number of scanlines */ uchar * src, /* source image */ int src_step, /* line step */ uchar * dst, /* dest buffers */ int *dst_nums, /* lens of buffer */ CvSize src_size, /* image size in pixels */ int *scanlines ) /* scanlines array */ { int k; CvPoint start; CvPoint end; int curr; int curr_dst; CvMat mat; curr = 0; curr_dst = 0; cvInitMatHeader( &mat, src_size.height, src_size.width, CV_8UC3, src, src_step ); for( k = 0; k < numLines; k++ ) { start.x = scanlines[curr++]; start.y = scanlines[curr++]; end.x = scanlines[curr++]; end.y = scanlines[curr++]; #ifdef _DEBUG { CvLineIterator iterator; assert( cvInitLineIterator( &mat, start, end, &iterator, 8 ) == dst_nums[k] ); } #endif cvSampleLine( &mat, start, end, dst + curr_dst, 8 ); curr_dst += dst_nums[k] * 3; } return CV_NO_ERR; } /*======================================================================================*/ static CvStatus icvPostWarpImage8uC3R( int numLines, /* number of scanlines */ uchar * src, /* source buffers */ int *src_nums, /* lens of buffers */ uchar * dst, /* dest image */ int dst_step, /* dest image step */ CvSize dst_size, /* dest image size */ int *scanlines ) /* scanline */ { int i, k; CvPoint start; CvPoint end; int curr; int src_num; int curr_src; CvMat mat; CvLineIterator iterator; curr = 0; curr_src = 0; cvInitMatHeader( &mat, dst_size.height, dst_size.width, CV_8UC3, dst, dst_step ); for( k = 0; k < numLines; k++ ) { start.x = scanlines[curr++]; start.y = scanlines[curr++]; end.x = scanlines[curr++]; end.y = scanlines[curr++]; src_num = src_nums[k]; if( cvInitLineIterator( &mat, start, end, &iterator, 8 ) != src_num ) { assert(0); return CV_NOTDEFINED_ERR; } for( i = 0; i < src_num; i++ ) { memcpy( iterator.ptr, src + curr_src, 3 ); CV_NEXT_LINE_POINT( iterator ); curr_src += 3; } #if 0 err = icvDrawLine8uC3R( src + curr_src, /* sourse buffer */ src_num, /* len of buffer */ dst, /* dest image */ dst_step, /* dest image step */ dst_size, /* dest image size */ start, /* start point */ end ); /* end point */ curr_src += src_num * 3; #endif } return CV_NO_ERR; } /*======================================================================================*/ /*F/////////////////////////////////////////////////////////////////////////////////////// // Name: icvDeleteMoire8uC3R // Purpose: // Function deletes moire - replaces black uncovered pixels with their neighboors. // Context: // Parameters: // img - image data // img_step - distance between lines in bytes // img_size - width and height of the image in pixels // Returns: // CV_NO_ERR if all Ok or error code // Notes: //F*/ static CvStatus icvDeleteMoire8u( uchar * img, int img_step, CvSize img_size, int cn ) { int x, y; uchar *src = img, *dst = img + img_step; if( !img || img_size.width <= 0 || img_size.height <= 0 || img_step < img_size.width * 3 ) return CV_BADFACTOR_ERR; img_size.width *= cn; for( y = 1; y < img_size.height; y++, src = dst, dst += img_step ) { switch( cn ) { case 1: for( x = 0; x < img_size.width; x++ ) { if( dst[x] == 0 ) dst[x] = src[x]; } break; case 3: for( x = 0; x < img_size.width; x += 3 ) { if( dst[x] == 0 && dst[x + 1] == 0 && dst[x + 2] == 0 ) { dst[x] = src[x]; dst[x + 1] = src[x + 1]; dst[x + 2] = src[x + 2]; } } break; default: assert(0); break; } } return CV_NO_ERR; } /*F/////////////////////////////////////////////////////////////////////////////////////// // Name: cvDeleteMoire // Purpose: The functions delete moire on the image after ViewMorphing // Context: // Parameters: img - image on which will delete moire // // Notes: //F*/ CV_IMPL void cvDeleteMoire( IplImage * img ) { uchar *img_data = 0; int img_step = 0; CvSize img_size; CV_FUNCNAME( "cvDeleteMoire" ); __BEGIN__; cvGetImageRawData( img, &img_data, &img_step, &img_size ); if( img->nChannels != 1 && img->nChannels != 3 ) CV_ERROR( CV_BadNumChannels, "Source image must have 3 channel." ); if( img->depth != IPL_DEPTH_8U ) CV_ERROR( CV_BadDepth, "Channel depth of source image must be 8." ); CV_CALL( icvDeleteMoire8u( img_data, img_step, img_size, img->nChannels )); __CLEANUP__; __END__; } /*F/////////////////////////////////////////////////////////////////////////////////////// // Name: cvPreWarpImage // Purpose: The functions warp image for next stage of ViewMorphing // Context: // Parameters: img - initial image (in the beginning) // // Notes: //F*/ CV_IMPL void cvPreWarpImage( int numLines, /* number of scanlines */ IplImage * img, /* Source Image */ uchar * dst, /* dest buffers */ int *dst_nums, /* lens of buffer */ int *scanlines /* scanlines array */ ) { uchar *img_data = 0; int img_step = 0; CvSize img_size; CV_FUNCNAME( "cvPreWarpImage" ); __BEGIN__; cvGetImageRawData( img, &img_data, &img_step, &img_size ); if( img->nChannels != 3 ) CV_ERROR( CV_BadNumChannels, "Source image must have 3 channel." ); if( img->depth != IPL_DEPTH_8U ) CV_ERROR( CV_BadDepth, "Channel depth of image must be 8." ); CV_CALL( icvPreWarpImage8uC3R( numLines, /* number of scanlines */ img_data, /* source image */ img_step, /* line step */ dst, /* dest buffers */ dst_nums, /* lens of buffer */ img_size, /* image size in pixels */ scanlines /* scanlines array */ )); __CLEANUP__; __END__; } /*F/////////////////////////////////////////////////////////////////////////////////////// // Name: cvPostWarpImage // Purpose: The functions postwarp the image after morphing // Context: // Parameters: img - initial image (in the beginning) // // Notes: //F*/ CV_IMPL void cvPostWarpImage( int numLines, /* number of scanlines */ uchar * src, /* source buffers */ int *src_nums, /* lens of buffers */ IplImage * img, /* dest image */ int *scanlines /* scanline */ ) { uchar *img_data = 0; int img_step = 0; CvSize img_size; CV_FUNCNAME( "cvPostWarpImage" ); __BEGIN__; cvGetImageRawData( img, &img_data, &img_step, &img_size ); if( img->nChannels != 3 ) CV_ERROR( CV_BadNumChannels, "Source image must have 3 channel." ); if( img->depth != IPL_DEPTH_8U ) CV_ERROR( CV_BadDepth, "Channel depth of image must be 8." ); CV_CALL( icvPostWarpImage8uC3R( numLines, /* number of scanlines */ src, /* source buffers */ src_nums, /* lens of buffers */ img_data, /* dest image */ img_step, /* dest image step */ img_size, /* dest image size */ scanlines /* scanline */ )); __CLEANUP__; __END__; } /* End of file */