我是靠谱客的博主 整齐画笔,这篇文章主要介绍前置变换后置变换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 */ |
最后
以上就是整齐画笔最近收集整理的关于前置变换后置变换OpenCV源代码 转自https://github.com/kipr/opencv/blob/master/modules/legacy/src/lines.cpp的全部内容,更多相关前置变换后置变换OpenCV源代码内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复