--- /dev/null
+/*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 */
+