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 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cv.h" 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <stdio.h> 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCalcMinEigenVal( const float* cov, int cov_step, float* dst, 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int dst_step, CvSize size, CvMat* buffer ) 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* buf = buffer->data.fl; 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_step /= sizeof(cov[0]); 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step /= sizeof(dst[0]); 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer->rows = 1; 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; cov += cov_step, dst += dst_step ) 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < size.width; j++ ) 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double a = cov[j*3]*0.5; 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double b = cov[j*3+1]; 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double c = cov[j*3+2]*0.5; 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[j + size.width] = (float)(a + c); 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[j] = (float)((a - c)*(a - c) + b*b); 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvPow( buffer, buffer, 0.5 ); 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < size.width ; j++ ) 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[j] = (float)(buf[j + size.width] - buf[j]); 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCalcHarris( const float* cov, int cov_step, float* dst, 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int dst_step, CvSize size, CvMat* /*buffer*/, double k ) 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_step /= sizeof(cov[0]); 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step /= sizeof(dst[0]); 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; cov += cov_step, dst += dst_step ) 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < size.width; j++ ) 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double a = cov[j*3]; 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double b = cov[j*3+1]; 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double c = cov[j*3+2]; 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[j] = (float)(a*c - b*b - k*(a + c)*(a + c)); 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCalcEigenValsVecs( const float* cov, int cov_step, float* dst, 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int dst_step, CvSize size, CvMat* buffer ) 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn static int y0 = 0; 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int j; 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* buf = buffer->data.fl; 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_step /= sizeof(cov[0]); 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_step /= sizeof(dst[0]); 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ; size.height--; cov += cov_step, dst += dst_step ) 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < size.width; j++ ) 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double a = cov[j*3]*0.5; 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double b = cov[j*3+1]; 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double c = cov[j*3+2]*0.5; 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[j + size.width] = (float)(a + c); 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[j] = (float)((a - c)*(a - c) + b*b); 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer->rows = 1; 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvPow( buffer, buffer, 0.5 ); 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < size.width; j++ ) 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double a = cov[j*3]; 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double b = cov[j*3+1]; 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double c = cov[j*3+2]; 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double l1 = buf[j + size.width] + buf[j]; 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double l2 = buf[j + size.width] - buf[j]; 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double x = b; 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double y = l1 - a; 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double e = fabs(x); 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( e + fabs(y) < 1e-4 ) 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y = b; 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn x = l1 - c; 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn e = fabs(x); 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( e + fabs(y) < 1e-4 ) 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn e = 1./(e + fabs(y) + FLT_EPSILON); 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn x *= e, y *= e; 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[j] = (float)(x*x + y*y + DBL_EPSILON); 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j] = (float)l1; 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 2] = (float)x; 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 3] = (float)y; 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn x = b; 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y = l2 - a; 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn e = fabs(x); 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( e + fabs(y) < 1e-4 ) 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y = b; 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn x = l2 - c; 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn e = fabs(x); 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( e + fabs(y) < 1e-4 ) 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn e = 1./(e + fabs(y) + FLT_EPSILON); 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn x *= e, y *= e; 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buf[j + size.width] = (float)(x*x + y*y + DBL_EPSILON); 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 1] = (float)l2; 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 4] = (float)x; 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 5] = (float)y; 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn buffer->rows = 2; 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvPow( buffer, buffer, -0.5 ); 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < size.width; j++ ) 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t0 = buf[j]*dst[6*j + 2]; 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double t1 = buf[j]*dst[6*j + 3]; 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 2] = (float)t0; 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 3] = (float)t1; 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t0 = buf[j + size.width]*dst[6*j + 4]; 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn t1 = buf[j + size.width]*dst[6*j + 5]; 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 4] = (float)t0; 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[6*j + 5] = (float)t1; 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y0++; 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_MINEIGENVAL 0 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_HARRIS 1 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_EIGENVALSVECS 2 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCornerEigenValsVecs( const CvMat* src, CvMat* eigenv, int block_size, 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int aperture_size, int op_type, double k=0. ) 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSepFilter dx_filter, dy_filter; 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvBoxFilter blur_filter; 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat *tempsrc = 0; 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat *Dx = 0, *Dy = 0, *cov = 0; 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat *sqrt_buf = 0; 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int buf_size = 1 << 12; 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "icvCornerEigenValsVecs" ); 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j, y, dst_y = 0, max_dy, delta = 0; 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int aperture_size0 = aperture_size; 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int temp_step = 0, d_step; 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* shifted_ptr = 0; 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int depth, d_depth; 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int stage = CV_START; 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSobelFixedIPPFunc ipp_sobel_vert = 0, ipp_sobel_horiz = 0; 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvFilterFixedIPPFunc ipp_scharr_vert = 0, ipp_scharr_horiz = 0; 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize el_size, size, stripe_size; 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int aligned_width; 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint el_anchor; 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double factorx, factory; 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool use_ipp = false; 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( block_size < 3 || !(block_size & 1) ) 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsOutOfRange, "averaging window size must be an odd number >= 3" ); 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( (aperture_size < 3 && aperture_size != CV_SCHARR) || !(aperture_size & 1) ) 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsOutOfRange, 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn "Derivative filter aperture size must be a positive odd number >=3 or CV_SCHARR" ); 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn depth = CV_MAT_DEPTH(src->type); 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d_depth = depth == CV_8U ? CV_16S : CV_32F; 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = cvGetMatSize(src); 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn aligned_width = cvAlign(size.width, 4); 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn aperture_size = aperture_size == CV_SCHARR ? 3 : aperture_size; 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn el_size = cvSize( aperture_size, aperture_size ); 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn el_anchor = cvPoint( aperture_size/2, aperture_size/2 ); 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( aperture_size <= 5 && icvFilterSobelVert_8u16s_C1R_p ) 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth == CV_8U && aperture_size0 == CV_SCHARR ) 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_scharr_vert = icvFilterScharrVert_8u16s_C1R_p; 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_scharr_horiz = icvFilterScharrHoriz_8u16s_C1R_p; 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( depth == CV_32F && aperture_size0 == CV_SCHARR ) 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_scharr_vert = icvFilterScharrVert_32f_C1R_p; 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_scharr_horiz = icvFilterScharrHoriz_32f_C1R_p; 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( depth == CV_8U ) 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert = icvFilterSobelVert_8u16s_C1R_p; 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_horiz = icvFilterSobelHoriz_8u16s_C1R_p; 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( depth == CV_32F ) 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert = icvFilterSobelVert_32f_C1R_p; 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_horiz = icvFilterSobelHoriz_32f_C1R_p; 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( (ipp_sobel_vert && ipp_sobel_horiz) || 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (ipp_scharr_vert && ipp_scharr_horiz) ) 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( tempsrc = icvIPPFilterInit( src, buf_size, 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvSize(el_size.width,el_size.height + block_size))); 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn shifted_ptr = tempsrc->data.ptr + el_anchor.y*tempsrc->step + 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn el_anchor.x*CV_ELEM_SIZE(depth); 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn temp_step = tempsrc->step ? tempsrc->step : CV_STUB_STEP; 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dy = tempsrc->rows - aperture_size + 1; 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn use_ipp = true; 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert = ipp_sobel_horiz = 0; 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_scharr_vert = ipp_scharr_horiz = 0; 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( dx_filter.init_deriv( size.width, depth, d_depth, 1, 0, aperture_size0 )); 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( dy_filter.init_deriv( size.width, depth, d_depth, 0, 1, aperture_size0 )); 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dy = buf_size / src->cols; 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dy = MAX( max_dy, aperture_size + block_size ); 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( Dx = cvCreateMat( max_dy, aligned_width, d_depth )); 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( Dy = cvCreateMat( max_dy, aligned_width, d_depth )); 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( cov = cvCreateMat( max_dy + block_size + 1, size.width, CV_32FC3 )); 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( sqrt_buf = cvCreateMat( 2, size.width, CV_32F )); 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dx->cols = Dy->cols = size.width; 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !use_ipp ) 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dy -= aperture_size - 1; 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d_step = Dx->step ? Dx->step : CV_STUB_STEP; 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL(blur_filter.init(size.width, CV_32FC3, CV_32FC3, 0, cvSize(block_size,block_size))); 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size = size; 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn factorx = (double)(1 << (aperture_size - 1)) * block_size; 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( aperture_size0 == CV_SCHARR ) 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn factorx *= 2; 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth == CV_8U ) 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn factorx *= 255.; 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn factory = factorx = 1./factorx; 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( ipp_sobel_vert ) 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn factory = -factory; 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < size.height; y += delta ) 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !use_ipp ) 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn delta = MIN( size.height - y, max_dy ); 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( y + delta == size.height ) 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stage = stage & CV_START ? CV_START + CV_END : CV_END; 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dx_filter.process( src, Dx, cvRect(0,y,-1,delta), cvPoint(0,0), stage ); 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size.height = dy_filter.process( src, Dy, cvRect(0,y,-1,delta), 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvPoint(0,0), stage ); 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn delta = icvIPPFilterNextStripe( src, tempsrc, y, el_size, el_anchor ); 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size.height = delta; 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( ipp_sobel_vert ) 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_sobel_vert( shifted_ptr, temp_step, 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dx->data.ptr, d_step, stripe_size, 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn aperture_size*10 + aperture_size )); 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_sobel_horiz( shifted_ptr, temp_step, 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dy->data.ptr, d_step, stripe_size, 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn aperture_size*10 + aperture_size )); 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else /*if( ipp_scharr_vert )*/ 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_scharr_vert( shifted_ptr, temp_step, 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dx->data.ptr, d_step, stripe_size )); 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_scharr_horiz( shifted_ptr, temp_step, 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dy->data.ptr, d_step, stripe_size )); 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < stripe_size.height; i++ ) 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* cov_data = (float*)(cov->data.ptr + i*cov->step); 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( d_depth == CV_16S ) 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const short* dxdata = (const short*)(Dx->data.ptr + i*Dx->step); 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const short* dydata = (const short*)(Dy->data.ptr + i*Dy->step); 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < size.width; j++ ) 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dx = dxdata[j]*factorx; 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dy = dydata[j]*factory; 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_data[j*3] = (float)(dx*dx); 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_data[j*3+1] = (float)(dx*dy); 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_data[j*3+2] = (float)(dy*dy); 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* dxdata = (const float*)(Dx->data.ptr + i*Dx->step); 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* dydata = (const float*)(Dy->data.ptr + i*Dy->step); 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < size.width; j++ ) 3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dx = dxdata[j]*factorx; 3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dy = dydata[j]*factory; 3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_data[j*3] = (float)(dx*dx); 3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_data[j*3+1] = (float)(dx*dy); 3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cov_data[j*3+2] = (float)(dy*dy); 3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( y + stripe_size.height >= size.height ) 3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stage = stage & CV_START ? CV_START + CV_END : CV_END; 3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size.height = blur_filter.process(cov,cov, 3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvRect(0,0,-1,stripe_size.height),cvPoint(0,0),stage+CV_ISOLATED_ROI); 3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( op_type == ICV_MINEIGENVAL ) 3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCalcMinEigenVal( cov->data.fl, cov->step, 3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (float*)(eigenv->data.ptr + dst_y*eigenv->step), eigenv->step, 3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size, sqrt_buf ); 3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( op_type == ICV_HARRIS ) 3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCalcHarris( cov->data.fl, cov->step, 3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (float*)(eigenv->data.ptr + dst_y*eigenv->step), eigenv->step, 3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size, sqrt_buf, k ); 4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( op_type == ICV_EIGENVALSVECS ) 4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCalcEigenValsVecs( cov->data.fl, cov->step, 4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn (float*)(eigenv->data.ptr + dst_y*eigenv->step), eigenv->step, 4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size, sqrt_buf ); 4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst_y += stripe_size.height; 4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stage = CV_MIDDLE; 4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &Dx ); 4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &Dy ); 4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &cov ); 4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &sqrt_buf ); 4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &tempsrc ); 4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCornerMinEigenVal( const void* srcarr, void* eigenvarr, 4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int block_size, int aperture_size ) 4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvCornerMinEigenVal" ); 4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat stub, *src = (CvMat*)srcarr; 4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat eigstub, *eigenv = (CvMat*)eigenvarr; 4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( src = cvGetMat( srcarr, &stub )); 4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( eigenv = cvGetMat( eigenv, &eigstub )); 4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( (CV_MAT_TYPE(src->type) != CV_8UC1 && CV_MAT_TYPE(src->type) != CV_32FC1) || 4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_MAT_TYPE(eigenv->type) != CV_32FC1 ) 4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "Input must be 8uC1 or 32fC1, output must be 32fC1" ); 4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_SIZES_EQ( src, eigenv )) 4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "" ); 4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( icvCornerEigenValsVecs( src, eigenv, block_size, aperture_size, ICV_MINEIGENVAL )); 4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCornerHarris( const CvArr* srcarr, CvArr* harris_responce, 4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int block_size, int aperture_size, double k ) 4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvCornerHarris" ); 4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat stub, *src = (CvMat*)srcarr; 4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat eigstub, *eigenv = (CvMat*)harris_responce; 4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( src = cvGetMat( srcarr, &stub )); 4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( eigenv = cvGetMat( eigenv, &eigstub )); 4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( (CV_MAT_TYPE(src->type) != CV_8UC1 && CV_MAT_TYPE(src->type) != CV_32FC1) || 4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_MAT_TYPE(eigenv->type) != CV_32FC1 ) 4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "Input must be 8uC1 or 32fC1, output must be 32fC1" ); 4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_SIZES_EQ( src, eigenv )) 4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "" ); 4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( icvCornerEigenValsVecs( src, eigenv, block_size, aperture_size, ICV_HARRIS, k )); 4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCornerEigenValsAndVecs( const void* srcarr, void* eigenvarr, 4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int block_size, int aperture_size ) 4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvCornerEigenValsAndVecs" ); 4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat stub, *src = (CvMat*)srcarr; 4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat eigstub, *eigenv = (CvMat*)eigenvarr; 4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( src = cvGetMat( srcarr, &stub )); 4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( eigenv = cvGetMat( eigenv, &eigstub )); 4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( CV_MAT_CN(eigenv->type)*eigenv->cols != src->cols*6 || 4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn eigenv->rows != src->rows ) 4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "Output array should be 6 times " 4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn "wider than the input array and they should have the same height"); 4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( (CV_MAT_TYPE(src->type) != CV_8UC1 && CV_MAT_TYPE(src->type) != CV_32FC1) || 4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_MAT_TYPE(eigenv->type) != CV_32FC1 ) 4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "Input must be 8uC1 or 32fC1, output must be 32fC1" ); 4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( icvCornerEigenValsVecs( src, eigenv, block_size, aperture_size, ICV_EIGENVALSVECS )); 4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void 5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvPreCornerDetect( const void* srcarr, void* dstarr, int aperture_size ) 5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSepFilter dx_filter, dy_filter, d2x_filter, d2y_filter, dxy_filter; 5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat *Dx = 0, *Dy = 0, *D2x = 0, *D2y = 0, *Dxy = 0; 5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat *tempsrc = 0; 5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int buf_size = 1 << 12; 5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_FUNCNAME( "cvPreCornerDetect" ); 5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __BEGIN__; 5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j, y, dst_y = 0, max_dy, delta = 0; 5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int temp_step = 0, d_step; 5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* shifted_ptr = 0; 5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int depth, d_depth; 5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int stage = CV_START; 5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSobelFixedIPPFunc ipp_sobel_vert = 0, ipp_sobel_horiz = 0, 5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert_second = 0, ipp_sobel_horiz_second = 0, 5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_cross = 0; 5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvSize el_size, size, stripe_size; 5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int aligned_width; 5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint el_anchor; 5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double factor; 5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat stub, *src = (CvMat*)srcarr; 5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat dststub, *dst = (CvMat*)dstarr; 5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool use_ipp = false; 5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( src = cvGetMat( srcarr, &stub )); 5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( dst = cvGetMat( dst, &dststub )); 5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( (CV_MAT_TYPE(src->type) != CV_8UC1 && CV_MAT_TYPE(src->type) != CV_32FC1) || 5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_MAT_TYPE(dst->type) != CV_32FC1 ) 5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnsupportedFormat, "Input must be 8uC1 or 32fC1, output must be 32fC1" ); 5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !CV_ARE_SIZES_EQ( src, dst )) 5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsUnmatchedSizes, "" ); 5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( aperture_size == CV_SCHARR ) 5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsOutOfRange, "CV_SCHARR is not supported by this function" ); 5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( aperture_size < 3 || aperture_size > 7 || !(aperture_size & 1) ) 5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_ERROR( CV_StsOutOfRange, 5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn "Derivative filter aperture size must be 3, 5 or 7" ); 5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn depth = CV_MAT_DEPTH(src->type); 5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d_depth = depth == CV_8U ? CV_16S : CV_32F; 5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn size = cvGetMatSize(src); 5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn aligned_width = cvAlign(size.width, 4); 5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn el_size = cvSize( aperture_size, aperture_size ); 5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn el_anchor = cvPoint( aperture_size/2, aperture_size/2 ); 5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( aperture_size <= 5 && icvFilterSobelVert_8u16s_C1R_p ) 5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth == CV_8U ) 5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert = icvFilterSobelVert_8u16s_C1R_p; 5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_horiz = icvFilterSobelHoriz_8u16s_C1R_p; 5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert_second = icvFilterSobelVertSecond_8u16s_C1R_p; 5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_horiz_second = icvFilterSobelHorizSecond_8u16s_C1R_p; 5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_cross = icvFilterSobelCross_8u16s_C1R_p; 5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( depth == CV_32F ) 5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert = icvFilterSobelVert_32f_C1R_p; 5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_horiz = icvFilterSobelHoriz_32f_C1R_p; 5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert_second = icvFilterSobelVertSecond_32f_C1R_p; 5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_horiz_second = icvFilterSobelHorizSecond_32f_C1R_p; 5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_cross = icvFilterSobelCross_32f_C1R_p; 5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( ipp_sobel_vert && ipp_sobel_horiz && ipp_sobel_vert_second && 5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_horiz_second && ipp_sobel_cross ) 5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( tempsrc = icvIPPFilterInit( src, buf_size, el_size )); 5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn shifted_ptr = tempsrc->data.ptr + el_anchor.y*tempsrc->step + 5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn el_anchor.x*CV_ELEM_SIZE(depth); 5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn temp_step = tempsrc->step ? tempsrc->step : CV_STUB_STEP; 5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dy = tempsrc->rows - aperture_size + 1; 5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn use_ipp = true; 5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert = ipp_sobel_horiz = 0; 5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ipp_sobel_vert_second = ipp_sobel_horiz_second = ipp_sobel_cross = 0; 5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dx_filter.init_deriv( size.width, depth, d_depth, 1, 0, aperture_size ); 5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dy_filter.init_deriv( size.width, depth, d_depth, 0, 1, aperture_size ); 5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d2x_filter.init_deriv( size.width, depth, d_depth, 2, 0, aperture_size ); 5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d2y_filter.init_deriv( size.width, depth, d_depth, 0, 2, aperture_size ); 5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dxy_filter.init_deriv( size.width, depth, d_depth, 1, 1, aperture_size ); 5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dy = buf_size / src->cols; 5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dy = MAX( max_dy, aperture_size ); 5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( Dx = cvCreateMat( max_dy, aligned_width, d_depth )); 6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( Dy = cvCreateMat( max_dy, aligned_width, d_depth )); 6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( D2x = cvCreateMat( max_dy, aligned_width, d_depth )); 6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( D2y = cvCreateMat( max_dy, aligned_width, d_depth )); 6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CV_CALL( Dxy = cvCreateMat( max_dy, aligned_width, d_depth )); 6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dx->cols = Dy->cols = D2x->cols = D2y->cols = Dxy->cols = size.width; 6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !use_ipp ) 6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn max_dy -= aperture_size - 1; 6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d_step = Dx->step ? Dx->step : CV_STUB_STEP; 6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size = size; 6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn factor = 1 << (aperture_size - 1); 6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth == CV_8U ) 6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn factor *= 255; 6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn factor = 1./(factor * factor * factor); 6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn aperture_size = aperture_size * 10 + aperture_size; 6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < size.height; y += delta ) 6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !use_ipp ) 6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn delta = MIN( size.height - y, max_dy ); 6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvRect roi = cvRect(0,y,size.width,delta); 6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvPoint origin=cvPoint(0,0); 6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( y + delta == size.height ) 6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stage = stage & CV_START ? CV_START + CV_END : CV_END; 6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dx_filter.process(src,Dx,roi,origin,stage); 6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dy_filter.process(src,Dy,roi,origin,stage); 6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d2x_filter.process(src,D2x,roi,origin,stage); 6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn d2y_filter.process(src,D2y,roi,origin,stage); 6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size.height = dxy_filter.process(src,Dxy,roi,origin,stage); 6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn delta = icvIPPFilterNextStripe( src, tempsrc, y, el_size, el_anchor ); 6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stripe_size.height = delta; 6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_sobel_vert( shifted_ptr, temp_step, 6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dx->data.ptr, d_step, stripe_size, aperture_size )); 6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_sobel_horiz( shifted_ptr, temp_step, 6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dy->data.ptr, d_step, stripe_size, aperture_size )); 6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_sobel_vert_second( shifted_ptr, temp_step, 6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn D2x->data.ptr, d_step, stripe_size, aperture_size )); 6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_sobel_horiz_second( shifted_ptr, temp_step, 6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn D2y->data.ptr, d_step, stripe_size, aperture_size )); 6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn IPPI_CALL( ipp_sobel_cross( shifted_ptr, temp_step, 6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Dxy->data.ptr, d_step, stripe_size, aperture_size )); 6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < stripe_size.height; i++, dst_y++ ) 6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* dstdata = (float*)(dst->data.ptr + dst_y*dst->step); 6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( d_depth == CV_16S ) 6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const short* dxdata = (const short*)(Dx->data.ptr + i*Dx->step); 6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const short* dydata = (const short*)(Dy->data.ptr + i*Dy->step); 6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const short* d2xdata = (const short*)(D2x->data.ptr + i*D2x->step); 6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const short* d2ydata = (const short*)(D2y->data.ptr + i*D2y->step); 6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const short* dxydata = (const short*)(Dxy->data.ptr + i*Dxy->step); 6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < stripe_size.width; j++ ) 6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dx = dxdata[j]; 6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dx2 = dx * dx; 6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dy = dydata[j]; 6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dy2 = dy * dy; 6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dstdata[j] = (float)(factor*(dx2*d2ydata[j] + dy2*d2xdata[j] - 2*dx*dy*dxydata[j])); 6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* dxdata = (const float*)(Dx->data.ptr + i*Dx->step); 6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* dydata = (const float*)(Dy->data.ptr + i*Dy->step); 6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* d2xdata = (const float*)(D2x->data.ptr + i*D2x->step); 6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* d2ydata = (const float*)(D2y->data.ptr + i*D2y->step); 6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* dxydata = (const float*)(Dxy->data.ptr + i*Dxy->step); 6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < stripe_size.width; j++ ) 6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dx = dxdata[j]; 6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double dy = dydata[j]; 6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dstdata[j] = (float)(factor*(dx*dx*d2ydata[j] + dy*dy*d2xdata[j] - 2*dx*dy*dxydata[j])); 6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn stage = CV_MIDDLE; 6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn __END__; 6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &Dx ); 6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &Dy ); 7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &D2x ); 7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &D2y ); 7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &Dxy ); 7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvReleaseMat( &tempsrc ); 7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file */ 707