前置变换后置变换OpenCV源代码 转自https://github.com/kipr/opencv/blob/master/modules/legacy/src/lines.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*/
  #include "precomp.hpp"
   
  #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 ));
   
  __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 */ ));
   
  __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 */ ));
   
  __END__;
  }
   
  /* End of file */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值