16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// For Open Source Computer Vision Library 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cv.h" 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if 0 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI(CvStatus, icvCalcContrastHist8uC1R, ( uchar** img, int step, CvSize size, 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvHistogram* hist, int dont_clear )) 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIPCVAPI(CvStatus, icvCalcContrastHistMask8uC1R, ( uchar** img, int step, 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* mask, int mask_step, CvSize size, 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvHistogram* hist, int dont_clear )) 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*F/////////////////////////////////////////////////////////////////////////////////////// 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Name: icvCalcContrastHist8uC1R 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Purpose: Calculating the histogram of contrast from one-channel images 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Context: 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Parameters: 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns: 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Notes: if dont_clear parameter is NULL then histogram clearing before 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// calculating (all values sets to NULL) 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//F*/ 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCalcContrastHist8uC1R( uchar** img, int step, CvSize size, 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvHistogram* hist, int dont_clear ) 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j, t, x = 0, y = 0; 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int dims; 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !hist || !img ) 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_NULLPTR_ERR; 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dims = hist->c_dims; 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( dims != 1 ) 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADSIZE_ERR; 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( hist->type != CV_HIST_ARRAY ) 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADFLAG_ERR; 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < dims; i++ ) 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !img[i] ) 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_NULLPTR_ERR; 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < hist->c_dims; i++ ) 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !hist->thresh[i] ) 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_NULLPTR_ERR; 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert( hist->chdims[i] ); 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn j = hist->dims[0] * hist->mdims[0]; 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *n = (int *)cvAlloc( (size_t)hist->dims[0] * sizeof( int )); 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( hist->type == CV_HIST_ARRAY ) 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !dont_clear ) 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < j; i++ ) 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hist->array[i] = 0; 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn n[i] = 0; 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch (hist->c_dims) 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case 1: 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar *data0 = img[0]; 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *array = (int *) hist->array; 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *chdims = hist->chdims[0]; 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < j; i++ ) 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn array[i] = cvRound( hist->array[i] ); 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < size.height; y++, data0 += step ) 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x <= size.width - 1; x += 2 ) 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int v1_r = MIN( data0[x], data0[x + 1] ); 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int v2_r = MAX( data0[x], data0[x + 1] ); 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// calculate contrast for the right-left pair 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( t = v1_r; t < v2_r; t++ ) 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int val0 = chdims[t + 128]; 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn array[val0] += MIN( t - v1_r, v2_r - t ); 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn n[val0]++; 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( y < size.height - 1 ) 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int v1_d = MIN( data0[x], data0[x + step] ); 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int v2_d = MAX( data0[x], data0[x + step] ); 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// calculate contrast for the top-down pair 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( t = v1_d; t < v2_d; t++ ) 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int val0 = chdims[t + 128]; 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn array[val0] += MIN( t - v1_d, v2_d - t ); 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn n[val0]++; 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// convert int to float 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < j; i++ ) 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( n[i] != 0 ) 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hist->array[i] = (float) array[i] / n[i]; 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hist->array[i] = 0; 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default: 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADSIZE_ERR; 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvFree( &n ); 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_NO_ERR; 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*F/////////////////////////////////////////////////////////////////////////////////////// 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Name: icvCalcContrastHistMask8uC1R 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Purpose: Calculating the mask histogram of contrast from one-channel images 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Context: 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Parameters: 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns: 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Notes: if dont_clear parameter is NULL then histogram clearing before 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// calculating (all values sets to NULL) 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//F*/ 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCalcContrastHistMask8uC1R( uchar** img, int step, uchar* mask, int mask_step, 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize size, CvHistogram * hist, int dont_clear ) 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j, t, x = 0, y = 0; 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int dims; 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !hist || !img || !mask ) 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_NULLPTR_ERR; 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dims = hist->c_dims; 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( dims != 1 ) 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADSIZE_ERR; 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( hist->type != CV_HIST_ARRAY ) 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADFLAG_ERR; 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < dims; i++ ) 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !img[i] ) 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_NULLPTR_ERR; 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < hist->c_dims; i++ ) 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !hist->thresh[i] ) 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_NULLPTR_ERR; 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert( hist->chdims[i] ); 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn j = hist->dims[0] * hist->mdims[0]; 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *n = (int *)cvAlloc( (size_t) hist->dims[0] * sizeof( int )); 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( hist->type == CV_HIST_ARRAY ) 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !dont_clear ) 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < j; i++ ) 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hist->array[i] = 0; 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn n[i] = 0; 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch (hist->c_dims) 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case 1: 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar *data0 = img[0]; 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar *maskp = mask; 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *array = (int *) hist->array; 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int *chdims = hist->chdims[0]; 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < j; i++ ) 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn array[i] = cvRound( hist->array[i] ); 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < size.height; y++, data0 += step, maskp += mask_step ) 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x <= size.width - 2; x++ ) 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( maskp[x] ) 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( maskp[x + 1] ) 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int v1_r = MIN( data0[x], data0[x + 1] ); 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int v2_r = MAX( data0[x], data0[x + 1] ); 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // calculate contrast for the right-left pair 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( t = v1_r; t < v2_r; t++ ) 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int val0 = chdims[t + 128]; 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn array[val0] += MIN( t - v1_r, v2_r - t ); 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn n[val0]++; 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( y < size.height - 1 ) 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( maskp[x + mask_step] ) 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int v1_d = MIN( data0[x], data0[x + step] ); 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int v2_d = MAX( data0[x], data0[x + step] ); 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // calculate contrast for the top-down pair 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( t = v1_d; t < v2_d; t++ ) 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int val0 = chdims[t + 128]; 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn array[val0] += MIN( t - v1_d, v2_d - t ); 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn n[val0]++; 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// convert int to float 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < j; i++ ) 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( n[i] != 0 ) 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hist->array[i] = (float) array[i] / n[i]; 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn hist->array[i] = 0; 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default: 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_BADSIZE_ERR; 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvFree( &n ); 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return CV_NO_ERR; 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void cvCalcContrastHist( IplImage** img, CvHistogram* hist, int dont_clear ) 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvCalcContrastHist" ); 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* data[CV_HIST_MAX_DIM]; 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int step = 0; 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize roi = {0,0}; 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {for( int i = 0; i < hist->c_dims; i++ ) 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( CV_CHECK_IMAGE( img[i] ) );} 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn {for( int i = 0; i < hist->c_dims; i++ ) 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvGetImageRawData( img[i], &data[i], &step, &roi );} 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(img[0]->nChannels != 1) 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( IPL_BadNumChannels, "bad channels numbers" ); 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(img[0]->depth != IPL_DEPTH_8U) 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( IPL_BadDepth, "bad image depth" ); 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch(img[0]->depth) 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case IPL_DEPTH_8U: 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( icvCalcContrastHist8uC1R( data, step, roi, hist, dont_clear ) ); 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default: CV_ERROR( IPL_BadDepth, "bad image depth" ); 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __CLEANUP__; 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/ 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCalcContrastHist( IplImage ** img, CvHistogram * hist, int dont_clear, IplImage * mask ) 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvCalcContrastHist" ); 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar *data[CV_HIST_MAX_DIM]; 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar *mask_data = 0; 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int step = 0; 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int mask_step = 0; 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize roi = { 0, 0 }; 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < hist->c_dims; i++ ) 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( CV_CHECK_IMAGE( img[i] )); 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( mask ) 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( CV_CHECK_IMAGE( mask )); 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( mask->depth != IPL_DEPTH_8U ) 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadDepth, "bad mask depth" ); 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvGetImageRawData( mask, &mask_data, &mask_step, 0 ); 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < hist->c_dims; i++ ) 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvGetImageRawData( img[i], &data[i], &step, &roi ); 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( img[0]->nChannels != 1 ) 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadNumChannels, "bad channels numbers" ); 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( img[0]->depth != IPL_DEPTH_8U ) 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadDepth, "bad image depth" ); 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn switch (img[0]->depth) 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn case IPL_DEPTH_8U: 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !mask ) 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( icvCalcContrastHist8uC1R( data, step, roi, hist, dont_clear )); 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( icvCalcContrastHistMask8uC1R( data, step, mask_data, 3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn mask_step, roi, hist, dont_clear )); 3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn break; 3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn default: 3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_BadDepth, "bad image depth" ); 3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __CLEANUP__; 3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif 386