1/*M/////////////////////////////////////////////////////////////////////////////////////// 2// 3// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4// 5// By downloading, copying, installing or using the software you agree to this license. 6// If you do not agree to this license, do not download, install, 7// copy or use the software. 8// 9// 10// Intel License Agreement 11// For Open Source Computer Vision Library 12// 13// Copyright (C) 2000, Intel Corporation, all rights reserved. 14// Third party copyrights are property of their respective owners. 15// 16// Redistribution and use in source and binary forms, with or without modification, 17// are permitted provided that the following conditions are met: 18// 19// * Redistribution's of source code must retain the above copyright notice, 20// this list of conditions and the following disclaimer. 21// 22// * Redistribution's in binary form must reproduce the above copyright notice, 23// this list of conditions and the following disclaimer in the documentation 24// and/or other materials provided with the distribution. 25// 26// * The name of Intel Corporation may not be used to endorse or promote products 27// derived from this software without specific prior written permission. 28// 29// This software is provided by the copyright holders and contributors "as is" and 30// any express or implied warranties, including, but not limited to, the implied 31// warranties of merchantability and fitness for a particular purpose are disclaimed. 32// In no event shall the Intel Corporation or contributors be liable for any direct, 33// indirect, incidental, special, exemplary, or consequential damages 34// (including, but not limited to, procurement of substitute goods or services; 35// loss of use, data, or profits; or business interruption) however caused 36// and on any theory of liability, whether in contract, strict liability, 37// or tort (including negligence or otherwise) arising in any way out of 38// the use of this software, even if advised of the possibility of such damage. 39// 40//M*/ 41#include "_cvaux.h" 42#include "_cvvm.h" 43 44/* Valery Mosyagin */ 45 46static CvStatus 47icvFindRuns( int numLines, /* number of scanlines */ 48 uchar * prewarp_1, /* prewarp image 1 */ 49 uchar * prewarp_2, /* prewarp image 2 */ 50 int *line_lens_1, /* line lengths 1 */ 51 int *line_lens_2, /* line lengths 2 */ 52 int *runs_1, /* result runs 1 */ 53 int *runs_2, /* result runs 2 */ 54 int *num_runs_1, /* numbers of first runs */ 55 int *num_runs_2 ) 56{ 57 CvStatus err; 58 59 err = icvFindRunsInOneImage( numLines, prewarp_1, line_lens_1, runs_1, num_runs_1 ); 60 61 if( err != CV_NO_ERR ) 62 return err; 63 64 err = icvFindRunsInOneImage( numLines, prewarp_2, line_lens_2, runs_2, num_runs_2 ); 65 66 return err; 67 68} 69 70 71/*======================================================================================*/ 72 73CV_INLINE int 74icvGetColor( uchar * valueRGB ) 75{ 76 int R = *valueRGB; 77 int G = *(valueRGB + 1); 78 int B = *(valueRGB + 2); 79 80 return ( ((R + G + B) >> 3) & 0xFFFC ); 81} /* vm_GetColor */ 82 83 84/*======================================================================================*/ 85 86CvStatus 87icvFindRunsInOneImage( int numLines, /* number of scanlines */ 88 uchar * prewarp, /* prewarp image */ 89 int *line_lens, /* line lengths in pixels */ 90 int *runs, /* result runs */ 91 int *num_runs ) 92{ 93 int epiLine; 94 int run_index; 95 int curr_color; 96 int index; 97 int color; 98 uchar *curr_point; 99 int num; 100 101 102 run_index = 0; 103 104 curr_point = prewarp; 105 106 for( epiLine = 0; epiLine < numLines; epiLine++ ) 107 { 108 109 curr_color = icvGetColor( curr_point ); 110 111 runs[run_index++] = 0; 112 runs[run_index++] = curr_color; 113 114 curr_point += 3; 115 116 num = 1; 117 for( index = 1; index < line_lens[epiLine]; index++ ) 118 { 119 120 color = icvGetColor( curr_point ); 121 122 if( color != curr_color ) 123 { 124 runs[run_index++] = index; 125 runs[run_index++] = color; 126 curr_color = color; 127 num++; 128 } 129 130 curr_point += 3; 131 } 132 133 runs[run_index++] = index; 134 num_runs[epiLine] = num; 135 } 136 137 return CV_NO_ERR; 138} 139 140 141/*======================================================================================*/ 142 143CV_IMPL void 144cvFindRuns( int numLines, /* number of scanlines */ 145 uchar * prewarp_1, /* prewarp image 1 */ 146 uchar * prewarp_2, /* prewarp image 2 */ 147 int *line_lens_1, /* line lengths 1 */ 148 int *line_lens_2, /* line lengths 2 */ 149 int *runs_1, /* result runs 1 */ 150 int *runs_2, /* result runs 2 */ 151 int *num_runs_1, /* numbers of first runs */ 152 int *num_runs_2 ) 153{ 154 CV_FUNCNAME( "cvFindRuns" ); 155 __BEGIN__; 156 157 IPPI_CALL( icvFindRuns( numLines, /* number of scanlines */ 158 prewarp_1, /* prewarp image 1 */ 159 prewarp_2, /* prewarp image 2 */ 160 line_lens_1, /* line lengths 1 */ 161 line_lens_2, /* line lengths 2 */ 162 runs_1, /* result runs 1 */ 163 runs_2, /* result runs 2 */ 164 num_runs_1, /* numbers of first runs */ 165 num_runs_2 )); 166 __CLEANUP__; 167 __END__; 168} 169