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/* ////////////////////////////////////////////////////////////////////
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  CvMat, CvMatND, CvSparceMat and IplImage support functions
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  (creation, deletion, copying, retrieving and setting elements etc.)
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// */
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxcore.h"
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic struct
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv_iplCreateImageHeader  createHeader;
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv_iplAllocateImageData  allocateData;
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv_iplDeallocate  deallocate;
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv_iplCreateROI  createROI;
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv_iplCloneImage  cloneImage;
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvIPL;
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Makes the library use native IPL image allocators
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetIPLAllocators( Cv_iplCreateImageHeader createHeader,
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    Cv_iplAllocateImageData allocateData,
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    Cv_iplDeallocate deallocate,
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    Cv_iplCreateROI createROI,
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    Cv_iplCloneImage cloneImage )
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetIPLAllocators" );
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !createHeader || !allocateData || !deallocate || !createROI || !cloneImage )
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( createHeader || allocateData || deallocate || createROI || cloneImage )
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Either all the pointers should be null or "
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    "they all should be non-null" );
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvIPL.createHeader = createHeader;
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvIPL.allocateData = allocateData;
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvIPL.deallocate = deallocate;
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvIPL.createROI = createROI;
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvIPL.cloneImage = cloneImage;
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                               CvMat creation and basic operations                      *
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates CvMat and underlying data
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMat*
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateMat( int height, int width, int type )
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* arr = 0;
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCreateMat" );
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( arr = cvCreateMatHeader( height, width, type ));
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( cvCreateData( arr ));
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 )
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseMat( &arr );
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return arr;
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvCheckHuge( CvMat* arr )
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (int64)arr->step*arr->rows > INT_MAX )
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        arr->type &= ~CV_MAT_CONT_FLAG;
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates CvMat header only
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMat*
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateMatHeader( int rows, int cols, int type )
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* arr = 0;
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCreateMatHeader" );
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int min_step;
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(type);
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rows <= 0 || cols <= 0 )
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadSize, "Non-positive width or height" );
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    min_step = CV_ELEM_SIZE(type)*cols;
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( min_step <= 0 )
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Invalid matrix type" );
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( arr = (CvMat*)cvAlloc( sizeof(*arr)));
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->step = rows == 1 ? 0 : cvAlign(min_step, CV_DEFAULT_MAT_ROW_ALIGN);
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->type = CV_MAT_MAGIC_VAL | type |
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                (arr->step == 0 || arr->step == min_step ? CV_MAT_CONT_FLAG : 0);
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->rows = rows;
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->cols = cols;
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->data.ptr = 0;
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->refcount = 0;
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->hdr_refcount = 1;
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvCheckHuge( arr );
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 )
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseMat( &arr );
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return arr;
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Initializes CvMat header, allocated by the user
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMat*
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvInitMatHeader( CvMat* arr, int rows, int cols,
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                 int type, void* data, int step )
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvInitMatHeader" );
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int mask, pix_size, min_step;
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !arr )
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsNullPtr );
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (unsigned)CV_MAT_DEPTH(type) > CV_DEPTH_MAX )
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_BadNumChannels );
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rows <= 0 || cols <= 0 )
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadSize, "Non-positive cols or rows" );
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE( type );
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->type = type | CV_MAT_MAGIC_VAL;
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->rows = rows;
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->cols = cols;
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->data.ptr = (uchar*)data;
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->refcount = 0;
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->hdr_refcount = 0;
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mask = (arr->rows <= 1) - 1;
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    pix_size = CV_ELEM_SIZE(type);
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    min_step = arr->cols*pix_size & mask;
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( step != CV_AUTOSTEP && step != 0 )
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( step < min_step )
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_BadStep );
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        arr->step = step & mask;
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        arr->step = min_step;
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->type = CV_MAT_MAGIC_VAL | type |
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                (arr->step == min_step ? CV_MAT_CONT_FLAG : 0);
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    icvCheckHuge( arr );
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return arr;
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Deallocates the CvMat structure and underlying data
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvReleaseMat( CvMat** array )
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvReleaseMat" );
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !array )
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_HeaderIsNull );
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( *array )
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* arr = *array;
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT_HDR(arr) && !CV_IS_MATND_HDR(arr) )
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsBadFlag );
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *array = 0;
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvDecRefData( arr );
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &arr );
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates a copy of matrix
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMat*
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCloneMat( const CvMat* src )
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* dst = 0;
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCloneMat" );
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT_HDR( src ))
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Bad CvMat header" );
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( dst = cvCreateMatHeader( src->rows, src->cols, src->type ));
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( src->data.ptr )
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvCreateData( dst ));
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvCopy( src, dst ));
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return dst;
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                               CvMatND creation and basic operations                    *
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMatND*
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvInitMatNDHeader( CvMatND* mat, int dims, const int* sizes,
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int type, void* data )
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatND* result = 0;
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvInitMatNDHeader" );
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(type);
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int64 step = CV_ELEM_SIZE(type);
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mat )
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "NULL matrix header pointer" );
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( step == 0 )
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "invalid array data type" );
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !sizes )
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "NULL <sizes> pointer" );
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( dims <= 0 || dims > CV_MAX_DIM )
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange,
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "non-positive or too large number of dimensions" );
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = dims - 1; i >= 0; i-- )
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sizes[i] <= 0 )
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadSize, "one of dimesion sizes is non-positive" );
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->dim[i].size = sizes[i];
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( step > INT_MAX )
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "The array is too big" );
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->dim[i].step = (int)step;
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        step *= sizes[i];
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat->type = CV_MATND_MAGIC_VAL | (step <= INT_MAX ? CV_MAT_CONT_FLAG : 0) | type;
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat->dims = dims;
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat->data.ptr = (uchar*)data;
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat->refcount = 0;
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    mat->hdr_refcount = 0;
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    result = mat;
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 && mat )
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->type = 0;
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->data.ptr = 0;
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return result;
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates CvMatND and underlying data
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMatND*
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateMatND( int dims, const int* sizes, int type )
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatND* arr = 0;
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCreateMatND" );
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( arr = cvCreateMatNDHeader( dims, sizes, type ));
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( cvCreateData( arr ));
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 )
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseMatND( &arr );
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return arr;
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates CvMatND header only
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMatND*
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateMatNDHeader( int dims, const int* sizes, int type )
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatND* arr = 0;
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCreateMatNDHeader" );
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( dims <= 0 || dims > CV_MAX_DIM )
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange,
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "non-positive or too large number of dimensions" );
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( arr = (CvMatND*)cvAlloc( sizeof(*arr) ));
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( cvInitMatNDHeader( arr, dims, sizes, type, 0 ));
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->hdr_refcount = 1;
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 )
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseMatND( &arr );
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return arr;
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates a copy of nD array
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMatND*
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCloneMatND( const CvMatND* src )
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatND* dst = 0;
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCloneMatND" );
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, *sizes;
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MATND_HDR( src ))
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Bad CvMatND header" );
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sizes = (int*)alloca( src->dims*sizeof(sizes[0]) );
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < src->dims; i++ )
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sizes[i] = src->dim[i].size;
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( dst = cvCreateMatNDHeader( src->dims, sizes, src->type ));
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( src->data.ptr )
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvCreateData( dst ));
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvCopy( src, dst ));
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return dst;
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvMatND*
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetMatND( const CvArr* arr, CvMatND* matnd, int* coi )
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatND* result = 0;
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetMatND" );
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi )
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *coi = 0;
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !matnd || !arr )
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "NULL array pointer is passed" );
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MATND_HDR(arr))
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !((CvMatND*)arr)->data.ptr )
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsNullPtr, "The matrix has NULL data pointer" );
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        result = (CvMatND*)arr;
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat stub, *mat = (CvMat*)arr;
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_IMAGE_HDR( mat ))
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mat = cvGetMat( mat, &stub, coi ));
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT_HDR( mat ))
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Unrecognized or unsupported array type" );
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !mat->data.ptr )
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsNullPtr, "Input array has NULL data pointer" );
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->data.ptr = mat->data.ptr;
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->refcount = 0;
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->hdr_refcount = 0;
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->type = mat->type;
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->dims = 2;
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->dim[0].size = mat->rows;
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->dim[0].step = mat->step;
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->dim[1].size = mat->cols;
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        matnd->dim[1].step = CV_ELEM_SIZE(mat->type);
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        result = matnd;
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return result;
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// returns number of dimensions to iterate.
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennChecks whether <count> arrays have equal type, sizes (mask is optional array
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennthat needs to have the same size, but 8uC1 or 8sC1 type).
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennReturns number of dimensions to iterate through:
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn0 means that all arrays are continuous,
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn1 means that all arrays are vectors of continuous arrays etc.
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennand the size of largest common continuous part of the arrays
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL int
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvInitNArrayIterator( int count, CvArr** arrs,
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      const CvArr* mask, CvMatND* stubs,
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvNArrayIterator* iterator, int flags )
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims = -1;
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvInitArrayOp" );
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j, size, dim0 = -1;
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int64 step;
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatND* hdr0 = 0;
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( count < 1 || count > CV_MAX_ARR )
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange, "Incorrect number of arrays" );
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !arrs || !stubs )
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "Some of required array pointers is NULL" );
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !iterator )
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "Iterator pointer is NULL" );
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i <= count; i++ )
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        const CvArr* arr = i < count ? arrs[i] : mask;
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* hdr;
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !arr )
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i < count )
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsNullPtr, "Some of required array pointers is NULL" );
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MATND( arr ))
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            hdr = (CvMatND*)arr;
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int coi = 0;
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( hdr = cvGetMatND( arr, stubs + i, &coi ));
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( coi != 0 )
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadCOI, "COI set is not allowed here" );
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator->hdr[i] = hdr;
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( i > 0 )
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( hdr->dims != hdr0->dims )
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsUnmatchedSizes,
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          "Number of dimensions is the same for all arrays" );
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i < count )
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                switch( flags & (CV_NO_DEPTH_CHECK|CV_NO_CN_CHECK))
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                case 0:
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( !CV_ARE_TYPES_EQ( hdr, hdr0 ))
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CV_ERROR( CV_StsUnmatchedFormats,
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  "Data type is not the same for all arrays" );
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    break;
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                case CV_NO_DEPTH_CHECK:
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( !CV_ARE_CNS_EQ( hdr, hdr0 ))
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CV_ERROR( CV_StsUnmatchedFormats,
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  "Number of channels is not the same for all arrays" );
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    break;
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                case CV_NO_CN_CHECK:
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( !CV_ARE_CNS_EQ( hdr, hdr0 ))
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CV_ERROR( CV_StsUnmatchedFormats,
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  "Depth is not the same for all arrays" );
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    break;
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !CV_IS_MASK_ARR( hdr ))
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsBadMask, "Mask should have 8uC1 or 8sC1 data type" );
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !(flags & CV_NO_SIZE_CHECK) )
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( j = 0; j < hdr->dims; j++ )
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( hdr->dim[j].size != hdr0->dim[j].size )
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CV_ERROR( CV_StsUnmatchedSizes,
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  "Dimension sizes are the same for all arrays" );
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            hdr0 = hdr;
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        step = CV_ELEM_SIZE(hdr->type);
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = hdr->dims - 1; j > dim0; j-- )
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( step != hdr->dim[j].step )
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                break;
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            step *= hdr->dim[j].size;
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( j == dim0 && step > INT_MAX )
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            j++;
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( j > dim0 )
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dim0 = j;
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator->hdr[i] = (CvMatND*)hdr;
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator->ptr[i] = (uchar*)hdr->data.ptr;
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = 1;
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( j = hdr0->dims - 1; j > dim0; j-- )
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size *= hdr0->dim[j].size;
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dims = dim0 + 1;
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    iterator->dims = dims;
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    iterator->count = count;
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    iterator->size = cvSize(size,1);
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < dims; i++ )
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator->stack[i] = hdr0->dim[i].size;
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return dims;
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// returns zero value if iteration is finished, non-zero otherwise
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  int  cvNextNArraySlice( CvNArrayIterator* iterator )
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( iterator != 0 );
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, dims, size = 0;
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( dims = iterator->dims; dims > 0; dims-- )
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < iterator->count; i++ )
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            iterator->ptr[i] += iterator->hdr[i]->dim[dims-1].step;
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( --iterator->stack[dims-1] > 0 )
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size = iterator->hdr[0]->dim[dims-1].size;
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < iterator->count; i++ )
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            iterator->ptr[i] -= (size_t)size*iterator->hdr[i]->dim[dims-1].step;
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        iterator->stack[dims-1] = size;
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return dims > 0;
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                            CvSparseMat creation and basic operations                   *
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates CvMatND and underlying data
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvSparseMat*
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateSparseMat( int dims, const int* sizes, int type )
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSparseMat* arr = 0;
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCreateSparseMat" );
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE( type );
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int pix_size1 = CV_ELEM_SIZE1(type);
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int pix_size = pix_size1*CV_MAT_CN(type);
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, size;
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMemStorage* storage;
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( pix_size == 0 )
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "invalid array data type" );
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( dims <= 0 || dims > CV_MAX_DIM_HEAP )
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange, "bad number of dimensions" );
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !sizes )
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "NULL <sizes> pointer" );
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < dims; i++ )
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sizes[i] <= 0 )
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadSize, "one of dimesion sizes is non-positive" );
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( arr = (CvSparseMat*)cvAlloc(sizeof(*arr)+MAX(0,dims-CV_MAX_DIM)*sizeof(arr->size[0])));
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->type = CV_SPARSE_MAT_MAGIC_VAL | type;
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->dims = dims;
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->refcount = 0;
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->hdr_refcount = 1;
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memcpy( arr->size, sizes, dims*sizeof(sizes[0]));
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->valoffset = (int)cvAlign(sizeof(CvSparseNode), pix_size1);
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->idxoffset = (int)cvAlign(arr->valoffset + pix_size, sizeof(int));
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = (int)cvAlign(arr->idxoffset + dims*sizeof(int), sizeof(CvSetElem));
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( storage = cvCreateMemStorage( CV_SPARSE_MAT_BLOCK ));
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( arr->heap = cvCreateSet( 0, sizeof(CvSet), size, storage ));
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arr->hashsize = CV_SPARSE_HASH_SIZE0;
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = arr->hashsize*sizeof(arr->hashtable[0]);
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( arr->hashtable = (void**)cvAlloc( size ));
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memset( arr->hashtable, 0, size );
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 )
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseSparseMat( &arr );
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return arr;
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates CvMatND and underlying data
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvReleaseSparseMat( CvSparseMat** array )
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvReleaseSparseMat" );
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !array )
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_HeaderIsNull );
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( *array )
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvSparseMat* arr = *array;
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_SPARSE_MAT_HDR(arr) )
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsBadFlag );
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *array = 0;
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseMemStorage( &arr->heap->storage );
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &arr->hashtable );
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &arr );
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Creates CvMatND and underlying data
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvSparseMat*
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCloneSparseMat( const CvSparseMat* src )
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSparseMat* dst = 0;
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCloneSparseMat" );
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT_HDR(src) )
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Invalid sparse array header" );
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( dst = cvCreateSparseMat( src->dims, src->size, src->type ));
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( cvCopy( src, dst ));
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 )
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseSparseMat( &dst );
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return dst;
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSparseNode*
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvInitSparseMatIterator( const CvSparseMat* mat, CvSparseMatIterator* iterator )
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSparseNode* node = 0;
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvInitSparseMatIterator" );
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int idx;
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( mat ))
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Invalid sparse matrix header" );
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !iterator )
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "NULL iterator pointer" );
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    iterator->mat = (CvSparseMat*)mat;
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    iterator->node = 0;
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( idx = 0; idx < mat->hashsize; idx++ )
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat->hashtable[idx] )
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            node = iterator->node = (CvSparseNode*)mat->hashtable[idx];
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    iterator->curidx = idx;
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return node;
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_SPARSE_MAT_HASH_MULTIPLIER  33
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic uchar*
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetNodePtr( CvSparseMat* mat, const int* idx, int* _type,
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               int create_node, unsigned* precalc_hashval )
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr = 0;
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "icvGetNodePtr" );
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, tabidx;
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    unsigned hashval = 0;
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSparseNode *node;
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( CV_IS_SPARSE_MAT( mat ));
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !precalc_hashval )
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < mat->dims; i++ )
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int t = idx[i];
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( (unsigned)t >= (unsigned)mat->size[i] )
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsOutOfRange, "One of indices is out of range" );
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            hashval = hashval*ICV_SPARSE_MAT_HASH_MULTIPLIER + t;
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        hashval = *precalc_hashval;
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tabidx = hashval & (mat->hashsize - 1);
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    hashval &= INT_MAX;
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( node = (CvSparseNode*)mat->hashtable[tabidx];
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         node != 0; node = node->next )
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( node->hashval == hashval )
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int* nodeidx = CV_NODE_IDX(mat,node);
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < mat->dims; i++ )
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( idx[i] != nodeidx[i] )
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    break;
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i == mat->dims )
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ptr = (uchar*)CV_NODE_VAL(mat,node);
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                break;
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !ptr && create_node )
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat->heap->active_count >= mat->hashsize*CV_SPARSE_HASH_RATIO )
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            void** newtable;
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int newsize = MAX( mat->hashsize*2, CV_SPARSE_HASH_SIZE0);
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int newrawsize = newsize*sizeof(newtable[0]);
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvSparseMatIterator iterator;
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( (newsize & (newsize - 1)) == 0 );
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            // resize hash table
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( newtable = (void**)cvAlloc( newrawsize ));
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memset( newtable, 0, newrawsize );
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            node = cvInitSparseMatIterator( mat, &iterator );
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            while( node )
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CvSparseNode* next = cvGetNextSparseNode( &iterator );
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int newidx = node->hashval & (newsize - 1);
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                node->next = (CvSparseNode*)newtable[newidx];
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                newtable[newidx] = node;
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                node = next;
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvFree( &mat->hashtable );
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat->hashtable = newtable;
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat->hashsize = newsize;
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tabidx = hashval & (newsize - 1);
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        node = (CvSparseNode*)cvSetNew( mat->heap );
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        node->hashval = hashval;
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        node->next = (CvSparseNode*)mat->hashtable[tabidx];
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->hashtable[tabidx] = node;
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_MEMCPY_INT( CV_NODE_IDX(mat,node), idx, mat->dims );
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = (uchar*)CV_NODE_VAL(mat,node);
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( create_node > 0 )
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ZERO_CHAR( ptr, CV_ELEM_SIZE(mat->type));
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( _type )
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *_type = CV_MAT_TYPE(mat->type);
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return ptr;
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvDeleteNode( CvSparseMat* mat, const int* idx, unsigned* precalc_hashval )
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "icvDeleteNode" );
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, tabidx;
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    unsigned hashval = 0;
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSparseNode *node, *prev = 0;
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( CV_IS_SPARSE_MAT( mat ));
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !precalc_hashval )
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < mat->dims; i++ )
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int t = idx[i];
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( (unsigned)t >= (unsigned)mat->size[i] )
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsOutOfRange, "One of indices is out of range" );
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            hashval = hashval*ICV_SPARSE_MAT_HASH_MULTIPLIER + t;
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        hashval = *precalc_hashval;
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tabidx = hashval & (mat->hashsize - 1);
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    hashval &= INT_MAX;
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( node = (CvSparseNode*)mat->hashtable[tabidx];
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         node != 0; prev = node, node = node->next )
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( node->hashval == hashval )
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int* nodeidx = CV_NODE_IDX(mat,node);
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < mat->dims; i++ )
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( idx[i] != nodeidx[i] )
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    break;
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i == mat->dims )
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                break;
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( node )
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( prev )
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            prev->next = node->next;
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat->hashtable[tabidx] = node->next;
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvSetRemoveByPtr( mat->heap, node );
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                          Common for multiple array types operations                    *
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Allocates underlying array data
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateData( CvArr* arr )
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCreateData" );
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_HDR( arr ))
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size_t step, total_size;
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        step = mat->step;
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat->data.ptr != 0 )
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsError, "Data is already allocated" );
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( step == 0 )
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            step = CV_ELEM_SIZE(mat->type)*mat->cols;
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        total_size = step*mat->rows + sizeof(int) + CV_MALLOC_ALIGN;
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat->refcount = (int*)cvAlloc( (size_t)total_size ));
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->data.ptr = (uchar*)cvAlignPtr( mat->refcount + 1, CV_MALLOC_ALIGN );
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *mat->refcount = 1;
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE_HDR(arr))
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( img->imageData != 0 )
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsError, "Data is already allocated" );
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CvIPL.allocateData )
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( img->imageData = img->imageDataOrigin =
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        (char*)cvAlloc( (size_t)img->imageSize ));
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int depth = img->depth;
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int width = img->width;
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( img->depth == IPL_DEPTH_32F || img->nChannels == 64 )
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                img->width *= img->depth == IPL_DEPTH_32F ? sizeof(float) : sizeof(double);
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                img->depth = IPL_DEPTH_8U;
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvIPL.allocateData( img, 0, 0 );
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            img->width = width;
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            img->depth = depth;
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MATND_HDR( arr ))
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size_t total_size = CV_ELEM_SIZE(mat->type);
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat->data.ptr != 0 )
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsError, "Data is already allocated" );
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT( mat->type ))
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            total_size = (size_t)mat->dim[0].size*(mat->dim[0].step != 0 ?
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         mat->dim[0].step : total_size);
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = mat->dims - 1; i >= 0; i-- )
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                size_t size = (size_t)mat->dim[i].step*mat->dim[i].size;
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( total_size < size )
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    total_size = size;
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat->refcount = (int*)cvAlloc( total_size +
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        sizeof(int) + CV_MALLOC_ALIGN ));
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->data.ptr = (uchar*)cvAlignPtr( mat->refcount + 1, CV_MALLOC_ALIGN );
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *mat->refcount = 1;
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Assigns external data to array
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetData( CvArr* arr, void* data, int step )
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetData" );
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int pix_size, min_step;
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_HDR(arr) || CV_IS_MATND_HDR(arr) )
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseData( arr );
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_HDR( arr ))
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int type = CV_MAT_TYPE(mat->type);
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        pix_size = CV_ELEM_SIZE(type);
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        min_step = mat->cols*pix_size & ((mat->rows <= 1) - 1);
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( step != CV_AUTOSTEP )
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( step < min_step && data != 0 )
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR_FROM_CODE( CV_BadStep );
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat->step = step & ((mat->rows <= 1) - 1);
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat->step = min_step;
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->data.ptr = (uchar*)data;
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->type = CV_MAT_MAGIC_VAL | type |
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    (mat->step==min_step ? CV_MAT_CONT_FLAG : 0);
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvCheckHuge( mat );
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE_HDR( arr ))
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        pix_size = ((img->depth & 255) >> 3)*img->nChannels;
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        min_step = img->width*pix_size;
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( step != CV_AUTOSTEP && img->height > 1 )
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( step < min_step && data != 0 )
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR_FROM_CODE( CV_BadStep );
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            img->widthStep = step;
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            img->widthStep = min_step;
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        img->imageSize = img->widthStep * img->height;
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        img->imageData = img->imageDataOrigin = (char*)data;
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (((int)(size_t)data | step) & 7) == 0 &&
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvAlign(img->width * pix_size, 8) == step )
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            img->align = 8;
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            img->align = 4;
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MATND_HDR( arr ))
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int64 cur_step;
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( step != CV_AUTOSTEP )
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadStep,
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "For multidimensional array only CV_AUTOSTEP is allowed here" );
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->data.ptr = (uchar*)data;
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cur_step = CV_ELEM_SIZE(mat->type);
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = mat->dims - 1; i >= 0; i-- )
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( cur_step > INT_MAX )
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsOutOfRange, "The array is too big" );
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            mat->dim[i].step = (int)cur_step;
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cur_step *= mat->dim[i].size;
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Deallocates array's data
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvReleaseData( CvArr* arr )
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvReleaseData" );
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_HDR( arr ) || CV_IS_MATND_HDR( arr ))
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvDecRefData( mat );
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE_HDR( arr ))
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CvIPL.deallocate )
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            char* ptr = img->imageDataOrigin;
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            img->imageData = img->imageDataOrigin = 0;
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvFree( &ptr );
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvIPL.deallocate( img, IPL_IMAGE_DATA );
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Retrieves essential information about image ROI or CvMat data
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetRawData( const CvArr* arr, uchar** data, int* step, CvSize* roi_size )
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetRawData" );
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ))
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat *mat = (CvMat*)arr;
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( step )
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *step = mat->step;
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( data )
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *data = mat->data.ptr;
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( roi_size )
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *roi_size = cvGetMatSize( mat );
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE( arr ))
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( step )
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *step = img->widthStep;
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( data )
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( *data = cvPtr2D( img, 0, 0 ));
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( roi_size )
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( img->roi )
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                *roi_size = cvSize( img->roi->width, img->roi->height );
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                *roi_size = cvSize( img->width, img->height );
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MATND( arr ))
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT_CONT( mat->type ))
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Only continuous nD arrays are supported here" );
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( data )
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *data = mat->data.ptr;
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( roi_size || step )
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i, size1 = mat->dim[0].size, size2 = 1;
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mat->dims > 2 )
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 1; i < mat->dims; i++ )
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    size1 *= mat->dim[i].size;
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                size2 = mat->dim[1].size;
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( roi_size )
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                roi_size->width = size2;
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                roi_size->height = size1;
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( step )
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                *step = size1 == 1 ? 0 : mat->dim[0].step;
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL int
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetElemType( const CvArr* arr )
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = -1;
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetElemType" );
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_HDR(arr) || CV_IS_MATND_HDR(arr) || CV_IS_SPARSE_MAT_HDR(arr))
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE( ((CvMat*)arr)->type );
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE(arr))
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAKETYPE( icvIplToCvDepth(img->depth), img->nChannels );
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return type;
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns a number of array dimensions
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL int
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetDims( const CvArr* arr, int* sizes )
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims = -1;
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetDims" );
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_HDR( arr ))
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dims = 2;
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sizes )
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sizes[0] = mat->rows;
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sizes[1] = mat->cols;
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE( arr ))
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dims = 2;
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sizes )
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sizes[0] = img->height;
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sizes[1] = img->width;
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MATND_HDR( arr ))
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dims = mat->dims;
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sizes )
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i;
13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < dims; i++ )
13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sizes[i] = mat->dim[i].size;
13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_SPARSE_MAT_HDR( arr ))
13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvSparseMat* mat = (CvSparseMat*)arr;
13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dims = mat->dims;
13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sizes )
13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memcpy( sizes, mat->size, dims*sizeof(sizes[0]));
13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return dims;
13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns the size of particular array dimension
13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL int
13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetDimSize( const CvArr* arr, int index )
13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int size = -1;
13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetDimSize" );
13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ))
13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat *mat = (CvMat*)arr;
13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        switch( index )
13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 0:
13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size = mat->rows;
13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 1:
13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size = mat->cols;
13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        default:
13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "bad dimension index" );
13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE( arr ))
13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        switch( index )
13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 0:
13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size = !img->roi ? img->height : img->roi->height;
13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 1:
13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size = !img->roi ? img->width : img->roi->width;
13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        default:
13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "bad dimension index" );
13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MATND_HDR( arr ))
13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)index >= (unsigned)mat->dims )
13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "bad dimension index" );
13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size = mat->dim[index].size;
13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_SPARSE_MAT_HDR( arr ))
14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvSparseMat* mat = (CvSparseMat*)arr;
14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)index >= (unsigned)mat->dims )
14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "bad dimension index" );
14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size = mat->size[index];
14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return size;
14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns the size of CvMat or IplImage
14206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvSize
14216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetSize( const CvArr* arr )
14226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
14236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size = { 0, 0 };
14246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetSize" );
14266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
14286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_HDR( arr ))
14306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat *mat = (CvMat*)arr;
14326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width = mat->cols;
14346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = mat->rows;
14356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE_HDR( arr ))
14376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
14396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( img->roi )
14416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
14426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width = img->roi->width;
14436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = img->roi->height;
14446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
14456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
14466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
14476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width = img->width;
14486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.height = img->height;
14496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
14506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
14526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Array should be CvMat or IplImage" );
14546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
14576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return size;
14596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Selects sub-array (no data is copied)
14636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  CvMat*
14646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetSubRect( const CvArr* arr, CvMat* submat, CvRect rect )
14656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
14666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* res = 0;
14676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetRect" );
14696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
14716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arr;
14736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( mat ))
14756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat = cvGetMat( mat, &stub ));
14766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !submat )
14786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "" );
14796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (rect.x|rect.y|rect.width|rect.height) < 0 )
14816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadSize, "" );
14826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rect.x + rect.width > mat->cols ||
14846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.y + rect.height > mat->rows )
14856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadSize, "" );
14866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*
14896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* refcount = mat->refcount;
14906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( refcount )
14926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ++*refcount;
14936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvDecRefData( submat );
14956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    */
14966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->data.ptr = mat->data.ptr + (size_t)rect.y*mat->step +
14976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       rect.x*CV_ELEM_SIZE(mat->type);
14986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->step = mat->step & (rect.height > 1 ? -1 : 0);
14996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->type = (mat->type & (rect.width < mat->cols ? ~CV_MAT_CONT_FLAG : -1)) |
15006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   (submat->step == 0 ? CV_MAT_CONT_FLAG : 0);
15016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->rows = rect.height;
15026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->cols = rect.width;
15036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->refcount = 0;
15046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    res = submat;
15056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
15086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return res;
15106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Selects array's row span.
15146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  CvMat*
15156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetRows( const CvArr* arr, CvMat* submat,
15166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           int start_row, int end_row, int delta_row )
15176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
15186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* res = 0;
15196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetRows" );
15216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
15236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arr;
15256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( mat ))
15276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat = cvGetMat( mat, &stub ));
15286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !submat )
15306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "" );
15316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (unsigned)start_row >= (unsigned)mat->rows ||
15336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (unsigned)end_row > (unsigned)mat->rows || delta_row <= 0 )
15346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange, "" );
15356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*
15386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* refcount = mat->refcount;
15396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( refcount )
15416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ++*refcount;
15426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvDecRefData( submat );
15446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    */
15456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( delta_row == 1 )
15466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        submat->rows = end_row - start_row;
15486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        submat->step = mat->step & (submat->rows > 1 ? -1 : 0);
15496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
15516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        submat->rows = (end_row - start_row + delta_row - 1)/delta_row;
15536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        submat->step = mat->step * delta_row;
15546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->cols = mat->cols;
15576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->step &= submat->rows > 1 ? -1 : 0;
15586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->data.ptr = mat->data.ptr + (size_t)start_row*mat->step;
15596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->type = (mat->type | (submat->step == 0 ? CV_MAT_CONT_FLAG : 0)) &
15606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   (delta_row != 1 ? ~CV_MAT_CONT_FLAG : -1);
15616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->refcount = 0;
15626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->hdr_refcount = 0;
15636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    res = submat;
15646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
15676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return res;
15696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Selects array's column span.
15736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  CvMat*
15746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetCols( const CvArr* arr, CvMat* submat, int start_col, int end_col )
15756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
15766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* res = 0;
15776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetCols" );
15796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
15816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arr;
15836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cols;
15846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( mat ))
15866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat = cvGetMat( mat, &stub ));
15876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !submat )
15896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "" );
15906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cols = mat->cols;
15926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (unsigned)start_col >= (unsigned)cols ||
15936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (unsigned)end_col > (unsigned)cols )
15946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange, "" );
15956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*
15986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* refcount = mat->refcount;
15996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( refcount )
16016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ++*refcount;
16026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvDecRefData( submat );
16046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    */
16056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->rows = mat->rows;
16066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->cols = end_col - start_col;
16076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->step = mat->step & (submat->rows > 1 ? -1 : 0);
16086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->data.ptr = mat->data.ptr + (size_t)start_col*CV_ELEM_SIZE(mat->type);
16096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->type = mat->type & (submat->step && submat->cols < cols ? ~CV_MAT_CONT_FLAG : -1);
16106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->refcount = 0;
16116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->hdr_refcount = 0;
16126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    res = submat;
16136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
16166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return res;
16186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Selects array diagonal
16226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  CvMat*
16236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetDiag( const CvArr* arr, CvMat* submat, int diag )
16246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
16256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* res = 0;
16266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetDiag" );
16286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
16306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)arr;
16326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int len, pix_size;
16336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( mat ))
16356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat = cvGetMat( mat, &stub ));
16366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !submat )
16386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "" );
16396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    pix_size = CV_ELEM_SIZE(mat->type);
16416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*{
16436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* refcount = mat->refcount;
16446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( refcount )
16466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ++*refcount;
16476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvDecRefData( submat );
16496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }*/
16506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( diag >= 0 )
16526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        len = mat->cols - diag;
16546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( len <= 0 )
16566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "" );
16576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        len = CV_IMIN( len, mat->rows );
16596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        submat->data.ptr = mat->data.ptr + diag*pix_size;
16606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
16626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        len = mat->rows + diag;
16646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( len <= 0 )
16666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "" );
16676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        len = CV_IMIN( len, mat->cols );
16696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        submat->data.ptr = mat->data.ptr - diag*mat->step;
16706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->rows = len;
16736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->cols = 1;
16746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->step = (mat->step + pix_size) & (submat->rows > 1 ? -1 : 0);
16756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->type = mat->type;
16766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( submat->step )
16776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        submat->type &= ~CV_MAT_CONT_FLAG;
16786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
16796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        submat->type |= CV_MAT_CONT_FLAG;
16806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->refcount = 0;
16816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    submat->hdr_refcount = 0;
16826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    res = submat;
16836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
16856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return res;
16876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
16916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                      Operations on CvScalar and accessing array elements               *
16926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
16936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Converts CvScalar to specified type
16956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
16966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvScalarToRawData( const CvScalar* scalar, void* data, int type, int extend_to_12 )
16976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
16986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvScalarToRawData" );
16996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(type);
17016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
17036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cn = CV_MAT_CN( type );
17056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int depth = type & CV_MAT_DEPTH_MASK;
17066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( scalar && data );
17086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (unsigned)(cn - 1) >= 4 )
17096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 4" );
17106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch( depth )
17126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_8UC1:
17146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
17156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int t = cvRound( scalar->val[cn] );
17176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ((uchar*)data)[cn] = CV_CAST_8U(t);
17186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
17206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_8SC1:
17216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
17226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int t = cvRound( scalar->val[cn] );
17246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ((char*)data)[cn] = CV_CAST_8S(t);
17256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
17276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_16UC1:
17286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
17296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int t = cvRound( scalar->val[cn] );
17316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ((ushort*)data)[cn] = CV_CAST_16U(t);
17326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
17346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_16SC1:
17356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
17366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int t = cvRound( scalar->val[cn] );
17386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ((short*)data)[cn] = CV_CAST_16S(t);
17396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
17416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_32SC1:
17426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
17436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ((int*)data)[cn] = cvRound( scalar->val[cn] );
17446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
17456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_32FC1:
17466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
17476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ((float*)data)[cn] = (float)(scalar->val[cn]);
17486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
17496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_64FC1:
17506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
17516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ((double*)data)[cn] = (double)(scalar->val[cn]);
17526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
17536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    default:
17546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert(0);
17556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_BadDepth );
17566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( extend_to_12 )
17596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int pix_size = CV_ELEM_SIZE(type);
17616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int offset = CV_ELEM_SIZE1(depth)*12;
17626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        do
17646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
17656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            offset -= pix_size;
17666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_MEMCPY_AUTO( (char*)data + offset, data, pix_size );
17676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
17686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( offset > pix_size );
17696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
17706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
17726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
17736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Converts data of specified type to CvScalar
17766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
17776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvRawDataToScalar( const void* data, int flags, CvScalar* scalar )
17786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvRawDataToScalar" );
17806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
17826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cn = CV_MAT_CN( flags );
17846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( scalar && data );
17866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (unsigned)(cn - 1) >= 4 )
17886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 4" );
17896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memset( scalar->val, 0, sizeof(scalar->val));
17916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch( CV_MAT_DEPTH( flags ))
17936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_8U:
17956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
17966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            scalar->val[cn] = CV_8TO32F(((uchar*)data)[cn]);
17976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
17986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_8S:
17996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
18006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            scalar->val[cn] = CV_8TO32F(((char*)data)[cn]);
18016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
18026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_16U:
18036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
18046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            scalar->val[cn] = ((ushort*)data)[cn];
18056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
18066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_16S:
18076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
18086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            scalar->val[cn] = ((short*)data)[cn];
18096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
18106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_32S:
18116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
18126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            scalar->val[cn] = ((int*)data)[cn];
18136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
18146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_32F:
18156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
18166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            scalar->val[cn] = ((float*)data)[cn];
18176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
18186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_64F:
18196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( cn-- )
18206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            scalar->val[cn] = ((double*)data)[cn];
18216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
18226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    default:
18236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert(0);
18246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_BadDepth );
18256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
18286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
18296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic double icvGetReal( const void* data, int type )
18326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
18336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch( type )
18346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_8U:
18366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return *(uchar*)data;
18376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_8S:
18386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return *(char*)data;
18396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_16U:
18406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return *(ushort*)data;
18416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_16S:
18426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return *(short*)data;
18436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_32S:
18446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return *(int*)data;
18456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_32F:
18466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return *(float*)data;
18476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_64F:
18486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return *(double*)data;
18496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return 0;
18526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
18536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvSetReal( double value, const void* data, int type )
18566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
18576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( type < CV_32F )
18586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int ivalue = cvRound(value);
18606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        switch( type )
18616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
18626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case CV_8U:
18636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(uchar*)data = CV_CAST_8U(ivalue);
18646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
18656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case CV_8S:
18666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(char*)data = CV_CAST_8S(ivalue);
18676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
18686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case CV_16U:
18696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(ushort*)data = CV_CAST_16U(ivalue);
18706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
18716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case CV_16S:
18726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(short*)data = CV_CAST_16S(ivalue);
18736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
18746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case CV_32S:
18756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(int*)data = CV_CAST_32S(ivalue);
18766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
18776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
18786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
18806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        switch( type )
18826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
18836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case CV_32F:
18846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(float*)data = (float)value;
18856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
18866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case CV_64F:
18876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(double*)data = value;
18886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
18896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
18906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
18926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns pointer to specified element of array (linear index is used)
18956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  uchar*
18966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvPtr1D( const CvArr* arr, int idx, int* _type )
18976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
18986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr = 0;
18996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvPtr1D" );
19016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
19036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ))
19056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
19076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int type = CV_MAT_TYPE(mat->type);
19096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int pix_size = CV_ELEM_SIZE(type);
19106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( _type )
19126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *_type = type;
19136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // the first part is mul-free sufficient check
19156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // that the index is within the matrix
19166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)idx >= (unsigned)(mat->rows + mat->cols - 1) &&
19176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)idx >= (unsigned)(mat->rows*mat->cols))
19186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
19196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT(mat->type))
19216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ptr = mat->data.ptr + (size_t)idx*pix_size;
19236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
19256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int row, col;
19276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mat->cols == 1 )
19286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                row = idx, col = 0;
19296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
19306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                row = idx/mat->cols, col = idx - row*mat->cols;
19316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ptr = mat->data.ptr + (size_t)row*mat->step + col*pix_size;
19326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE_HDR( arr ))
19356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
19376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int width = !img->roi ? img->width : img->roi->width;
19386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int y = idx/width, x = idx - y*width;
19396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr2D( arr, y, x, _type );
19416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MATND( arr ))
19436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
19456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int j, type = CV_MAT_TYPE(mat->type);
19466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size_t size = mat->dim[0].size;
19476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( _type )
19496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *_type = type;
19506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = 1; j < mat->dims; j++ )
19526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size *= mat->dim[j].size;
19536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if((unsigned)idx >= (unsigned)size )
19556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
19566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_IS_MAT_CONT(mat->type))
19586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int pix_size = CV_ELEM_SIZE(type);
19606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ptr = mat->data.ptr + (size_t)idx*pix_size;
19616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
19636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ptr = mat->data.ptr;
19656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = mat->dims - 1; j >= 0; j-- )
19666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
19676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int sz = mat->dim[j].size;
19686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( sz )
19696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
19706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int t = idx/sz;
19716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ptr += (idx - t*sz)*mat->dim[j].step;
19726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    idx = t;
19736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
19746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
19756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_SPARSE_MAT( arr ))
19786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvSparseMat* m = (CvSparseMat*)arr;
19806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( m->dims == 1 )
19816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ptr = icvGetNodePtr( (CvSparseMat*)arr, &idx, _type, 1, 0 );
19826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
19836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i, n = m->dims;
19856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int* _idx = (int*)cvStackAlloc(n*sizeof(_idx[0]));
19866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = n - 1; i >= 0; i-- )
19886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
19896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t = idx / m->size[i];
19906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                _idx[i] = idx - t*m->size[i];
19916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                idx = t;
19926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
19936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ptr = icvGetNodePtr( (CvSparseMat*)arr, _idx, _type, 1, 0 );
19946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
19976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
19996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
20026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return ptr;
20046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
20056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns pointer to specified element of 2d array
20086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  uchar*
20096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvPtr2D( const CvArr* arr, int y, int x, int* _type )
20106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
20116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr = 0;
20126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvPtr2D" );
20146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
20166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ))
20186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
20196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
20206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int type;
20216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)y >= (unsigned)(mat->rows) ||
20236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)x >= (unsigned)(mat->cols) )
20246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
20256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
20276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( _type )
20286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *_type = type;
20296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)y*mat->step + x*CV_ELEM_SIZE(type);
20316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE( arr ))
20336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
20346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = (IplImage*)arr;
20356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int pix_size = (img->depth & 255) >> 3;
20366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int width, height;
20376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = (uchar*)img->imageData;
20386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( img->dataOrder == 0 )
20406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            pix_size *= img->nChannels;
20416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( img->roi )
20436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
20446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            width = img->roi->width;
20456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            height = img->roi->height;
20466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ptr += img->roi->yOffset*img->widthStep +
20486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   img->roi->xOffset*pix_size;
20496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( img->dataOrder )
20516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
20526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int coi = img->roi->coi;
20536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( !coi )
20546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_BadCOI,
20556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        "COI must be non-null in case of planar images" );
20566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ptr += (coi - 1)*img->imageSize;
20576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
20586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
20596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
20606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
20616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            width = img->width;
20626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            height = img->height;
20636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
20646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)y >= (unsigned)height ||
20666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)x >= (unsigned)width )
20676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
20686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr += y*img->widthStep + x*pix_size;
20706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( _type )
20726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
20736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int type = icvIplToCvDepth(img->depth);
20746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( type < 0 || (unsigned)(img->nChannels - 1) > 3 )
20756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsUnsupportedFormat, "" );
20766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *_type = CV_MAKETYPE( type, img->nChannels );
20786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
20796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MATND( arr ))
20816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
20826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
20836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat->dims != 2 ||
20856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)y >= (unsigned)(mat->dim[0].size) ||
20866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)x >= (unsigned)(mat->dim[1].size) )
20876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
20886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)y*mat->dim[0].step + x*mat->dim[1].step;
20906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( _type )
20916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *_type = CV_MAT_TYPE(mat->type);
20926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_SPARSE_MAT( arr ))
20946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
20956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { y, x };
20966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, _type, 1, 0 );
20976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
20996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
21006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
21016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
21026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
21046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return ptr;
21066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
21076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns pointer to specified element of 3d array
21106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  uchar*
21116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvPtr3D( const CvArr* arr, int z, int y, int x, int* _type )
21126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
21136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr = 0;
21146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvPtr3D" );
21166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
21186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MATND( arr ))
21206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
21216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
21226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat->dims != 3 ||
21246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)z >= (unsigned)(mat->dim[0].size) ||
21256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)y >= (unsigned)(mat->dim[1].size) ||
21266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)x >= (unsigned)(mat->dim[2].size) )
21276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
21286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)z*mat->dim[0].step +
21306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn              (size_t)y*mat->dim[1].step + x*mat->dim[2].step;
21316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( _type )
21336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *_type = CV_MAT_TYPE(mat->type);
21346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
21356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_SPARSE_MAT( arr ))
21366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
21376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { z, y, x };
21386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, _type, 1, 0 );
21396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
21406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
21416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
21426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
21436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
21446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
21466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return ptr;
21486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
21496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns pointer to specified element of n-d array
21526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  uchar*
21536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvPtrND( const CvArr* arr, const int* idx, int* _type,
21546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         int create_node, unsigned* precalc_hashval )
21556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
21566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr = 0;
21576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvPtrND" );
21586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
21606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !idx )
21626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "NULL pointer to indices" );
21636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_SPARSE_MAT( arr ))
21656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx,
21666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             _type, create_node, precalc_hashval );
21676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MATND( arr ))
21686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
21696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* mat = (CvMatND*)arr;
21706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
21716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr;
21726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < mat->dims; i++ )
21746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
21756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( (unsigned)idx[i] >= (unsigned)(mat->dim[i].size) )
21766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsOutOfRange, "index is out of range" );
21776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ptr += (size_t)idx[i]*mat->dim[i].step;
21786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
21796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( _type )
21816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *_type = CV_MAT_TYPE(mat->type);
21826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
21836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_MAT_HDR(arr) || CV_IS_IMAGE_HDR(arr) )
21846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr2D( arr, idx[0], idx[1], _type );
21856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
21866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
21876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
21896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return ptr;
21916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
21926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns specifed element of n-D array given linear index
21956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  CvScalar
21966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGet1D( const CvArr* arr, int idx )
21976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
21986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScalar scalar = {{0,0,0,0}};
21996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGet1D" );
22016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
22036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
22056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
22066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ) && CV_IS_MAT_CONT( ((CvMat*)arr)->type ))
22086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
22096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
22106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
22126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int pix_size = CV_ELEM_SIZE(type);
22136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // the first part is mul-free sufficient check
22156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // that the index is within the matrix
22166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)idx >= (unsigned)(mat->rows + mat->cols - 1) &&
22176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)idx >= (unsigned)(mat->rows*mat->cols))
22186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
22196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)idx*pix_size;
22216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
22226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_SPARSE_MAT( arr ) || ((CvSparseMat*)arr)->dims > 1 )
22236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr1D( arr, idx, &type );
22246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
22256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, &idx, &type, 0, 0 );
22266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvRawDataToScalar( ptr, type, &scalar );
22286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
22306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return scalar;
22326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
22336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns specifed element of 2D array
22366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  CvScalar
22376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGet2D( const CvArr* arr, int y, int x )
22386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
22396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScalar scalar = {{0,0,0,0}};
22406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGet2D" );
22426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
22446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
22466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
22476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ))
22496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
22506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
22516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)y >= (unsigned)(mat->rows) ||
22536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)x >= (unsigned)(mat->cols) )
22546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
22556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
22576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)y*mat->step + x*CV_ELEM_SIZE(type);
22586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
22596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_SPARSE_MAT( arr ))
22606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr2D( arr, y, x, &type );
22616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
22626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
22636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { y, x };
22646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
22656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
22666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvRawDataToScalar( ptr, type, &scalar );
22686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
22706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return scalar;
22726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
22736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns specifed element of 3D array
22766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  CvScalar
22776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGet3D( const CvArr* arr, int z, int y, int x )
22786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
22796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScalar scalar = {{0,0,0,0}};
22806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*CV_FUNCNAME( "cvGet3D" );*/
22826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
22846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
22866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
22876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
22896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr3D( arr, z, y, x, &type );
22906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
22916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
22926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { z, y, x };
22936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
22946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
22956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvRawDataToScalar( ptr, type, &scalar );
22976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
22996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return scalar;
23016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
23026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns specifed element of nD array
23056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  CvScalar
23066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetND( const CvArr* arr, const int* idx )
23076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
23086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScalar scalar = {{0,0,0,0}};
23096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*CV_FUNCNAME( "cvGetND" );*/
23116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
23136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
23156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
23166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
23186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtrND( arr, idx, &type );
23196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
23206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
23216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvRawDataToScalar( ptr, type, &scalar );
23236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
23256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return scalar;
23276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
23286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns specifed element of n-D array given linear index
23316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  double
23326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetReal1D( const CvArr* arr, int idx )
23336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
23346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double value = 0;
23356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetReal1D" );
23376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
23396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
23416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
23426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ) && CV_IS_MAT_CONT( ((CvMat*)arr)->type ))
23446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
23456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
23466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
23486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int pix_size = CV_ELEM_SIZE(type);
23496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // the first part is mul-free sufficient check
23516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // that the index is within the matrix
23526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)idx >= (unsigned)(mat->rows + mat->cols - 1) &&
23536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)idx >= (unsigned)(mat->rows*mat->cols))
23546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
23556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)idx*pix_size;
23576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
23586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_SPARSE_MAT( arr ) || ((CvSparseMat*)arr)->dims > 1 )
23596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr1D( arr, idx, &type );
23606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
23616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, &idx, &type, 0, 0 );
23626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ptr )
23646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
23656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_CN( type ) > 1 )
23666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels, "cvGetReal* support only single-channel arrays" );
23676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        value = icvGetReal( ptr, type );
23696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
23706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
23726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return value;
23746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
23756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns specifed element of 2D array
23786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  double
23796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetReal2D( const CvArr* arr, int y, int x )
23806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
23816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double value = 0;
23826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetReal2D" );
23846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
23866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
23886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
23896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ))
23916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
23926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
23936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)y >= (unsigned)(mat->rows) ||
23956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)x >= (unsigned)(mat->cols) )
23966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
23976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
23996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)y*mat->step + x*CV_ELEM_SIZE(type);
24006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
24016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_SPARSE_MAT( arr ))
24026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr2D( arr, y, x, &type );
24036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
24046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
24056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { y, x };
24066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
24076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
24086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ptr )
24106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
24116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_CN( type ) > 1 )
24126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels, "cvGetReal* support only single-channel arrays" );
24136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        value = icvGetReal( ptr, type );
24156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
24166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
24186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return value;
24206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
24216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns specifed element of 3D array
24246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  double
24256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetReal3D( const CvArr* arr, int z, int y, int x )
24266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
24276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double value = 0;
24286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetReal3D" );
24306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
24326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
24346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
24356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
24376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr3D( arr, z, y, x, &type );
24386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
24396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
24406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { z, y, x };
24416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
24426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
24436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ptr )
24456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
24466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_CN( type ) > 1 )
24476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels, "cvGetReal* support only single-channel arrays" );
24486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        value = icvGetReal( ptr, type );
24506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
24516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
24536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return value;
24556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
24566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Returns specifed element of nD array
24596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  double
24606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetRealND( const CvArr* arr, const int* idx )
24616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
24626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double value = 0;
24636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetRealND" );
24656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
24676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
24696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
24706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
24726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtrND( arr, idx, &type );
24736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
24746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
24756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ptr )
24776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
24786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_CN( type ) > 1 )
24796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels, "cvGetReal* support only single-channel arrays" );
24806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        value = icvGetReal( ptr, type );
24826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
24836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
24856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return value;
24876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
24886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Assigns new value to specifed element of nD array given linear index
24916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
24926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSet1D( CvArr* arr, int idx, CvScalar scalar )
24936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
24946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSet1D" );
24956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
24976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
24996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
25006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ) && CV_IS_MAT_CONT( ((CvMat*)arr)->type ))
25026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
25036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
25046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
25066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int pix_size = CV_ELEM_SIZE(type);
25076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // the first part is mul-free sufficient check
25096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // that the index is within the matrix
25106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)idx >= (unsigned)(mat->rows + mat->cols - 1) &&
25116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)idx >= (unsigned)(mat->rows*mat->cols))
25126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
25136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)idx*pix_size;
25156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_SPARSE_MAT( arr ) || ((CvSparseMat*)arr)->dims > 1 )
25176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr1D( arr, idx, &type );
25186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
25196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, &idx, &type, -1, 0 );
25206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvScalarToRawData( &scalar, ptr, type );
25226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
25246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
25256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Assigns new value to specifed element of 2D array
25286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
25296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSet2D( CvArr* arr, int y, int x, CvScalar scalar )
25306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
25316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSet2D" );
25326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
25346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
25366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
25376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ))
25396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
25406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
25416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)y >= (unsigned)(mat->rows) ||
25436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)x >= (unsigned)(mat->cols) )
25446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
25456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
25476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)y*mat->step + x*CV_ELEM_SIZE(type);
25486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_SPARSE_MAT( arr ))
25506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr2D( arr, y, x, &type );
25516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
25526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
25536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { y, x };
25546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, -1, 0 );
25556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvScalarToRawData( &scalar, ptr, type );
25576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
25596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
25606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Assigns new value to specifed element of 3D array
25636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
25646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSet3D( CvArr* arr, int z, int y, int x, CvScalar scalar )
25656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
25666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*CV_FUNCNAME( "cvSet3D" );*/
25676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
25696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
25716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
25726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
25746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr3D( arr, z, y, x, &type );
25756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
25766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
25776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { z, y, x };
25786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, -1, 0 );
25796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvScalarToRawData( &scalar, ptr, type );
25816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
25836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
25846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Assigns new value to specifed element of nD array
25876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
25886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetND( CvArr* arr, const int* idx, CvScalar scalar )
25896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
25906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*CV_FUNCNAME( "cvSetND" );*/
25916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
25936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
25956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
25966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
25986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtrND( arr, idx, &type );
25996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
26006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, -1, 0 );
26016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvScalarToRawData( &scalar, ptr, type );
26026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
26046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
26056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
26086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetReal1D( CvArr* arr, int idx, double value )
26096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
26106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetReal1D" );
26116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
26136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
26156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
26166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ) && CV_IS_MAT_CONT( ((CvMat*)arr)->type ))
26186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
26196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
26206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
26226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int pix_size = CV_ELEM_SIZE(type);
26236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // the first part is mul-free sufficient check
26256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // that the index is within the matrix
26266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)idx >= (unsigned)(mat->rows + mat->cols - 1) &&
26276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)idx >= (unsigned)(mat->rows*mat->cols))
26286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
26296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)idx*pix_size;
26316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
26326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_SPARSE_MAT( arr ) || ((CvSparseMat*)arr)->dims > 1 )
26336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr1D( arr, idx, &type );
26346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
26356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, &idx, &type, -1, 0 );
26366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN( type ) > 1 )
26386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadNumChannels, "cvSetReal* support only single-channel arrays" );
26396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ptr )
26416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvSetReal( value, ptr, type );
26426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
26446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
26456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
26486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetReal2D( CvArr* arr, int y, int x, double value )
26496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
26506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetReal2D" );
26516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
26536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
26556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
26566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT( arr ))
26586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
26596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
26606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)y >= (unsigned)(mat->rows) ||
26626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)x >= (unsigned)(mat->cols) )
26636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "index is out of range" );
26646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        type = CV_MAT_TYPE(mat->type);
26666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = mat->data.ptr + (size_t)y*mat->step + x*CV_ELEM_SIZE(type);
26676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
26686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( !CV_IS_SPARSE_MAT( arr ))
26696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
26706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr2D( arr, y, x, &type );
26716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
26726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
26736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
26746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { y, x };
26756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, -1, 0 );
26766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
26776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN( type ) > 1 )
26786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadNumChannels, "cvSetReal* support only single-channel arrays" );
26796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ptr )
26816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvSetReal( value, ptr, type );
26826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
26846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
26856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
26886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetReal3D( CvArr* arr, int z, int y, int x, double value )
26896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
26906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetReal3D" );
26916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
26936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
26956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
26966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
26976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
26986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtr3D( arr, z, y, x, &type );
26996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
27006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
27016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int idx[] = { z, y, x };
27026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, -1, 0 );
27036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
27046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN( type ) > 1 )
27056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadNumChannels, "cvSetReal* support only single-channel arrays" );
27066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ptr )
27086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvSetReal( value, ptr, type );
27096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
27116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
27126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL  void
27156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetRealND( CvArr* arr, const int* idx, double value )
27166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
27176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetRealND" );
27186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
27206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type = 0;
27226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
27236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
27256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtrND( arr, idx, &type );
27266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
27276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, -1, 0 );
27286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_CN( type ) > 1 )
27306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadNumChannels, "cvSetReal* support only single-channel arrays" );
27316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ptr )
27336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvSetReal( value, ptr, type );
27346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
27366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
27376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
27406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvClearND( CvArr* arr, const int* idx )
27416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
27426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*CV_FUNCNAME( "cvClearND" );*/
27436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
27456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SPARSE_MAT( arr ))
27476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
27486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int type;
27496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* ptr;
27506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ptr = cvPtrND( arr, idx, &type );
27516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( ptr )
27526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ZERO_CHAR( ptr, CV_ELEM_SIZE(type) );
27536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
27546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
27556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
27566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvDeleteNode( (CvSparseMat*)arr, idx, 0 );
27576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
27586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
27606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
27616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
27646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                             Conversion to CvMat or IplImage                            *
27656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
27666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// convert array (CvMat or IplImage) to CvMat
27686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMat*
27696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetMat( const CvArr* array, CvMat* mat,
27706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn          int* pCOI, int allowND )
27716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
27726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* result = 0;
27736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* src = (CvMat*)array;
27746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi = 0;
27756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetMat" );
27776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
27796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !mat || !src )
27816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "NULL array pointer is passed" );
27826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_HDR(src))
27846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
27856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !src->data.ptr )
27866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsNullPtr, "The matrix has NULL data pointer" );
27876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        result = (CvMat*)src;
27896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
27906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_IS_IMAGE_HDR(src) )
27916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
27926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        const IplImage* img = (const IplImage*)src;
27936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int depth, order;
27946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( img->imageData == 0 )
27966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsNullPtr, "The image has NULL data pointer" );
27976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
27986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        depth = icvIplToCvDepth( img->depth );
27996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth < 0 )
28006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_BadDepth );
28016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        order = img->dataOrder & (img->nChannels > 1 ? -1 : 0);
28036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( img->roi )
28056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
28066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( order == IPL_DATA_ORDER_PLANE )
28076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
28086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int type = depth;
28096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( img->roi->coi == 0 )
28116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsBadFlag,
28126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    "Images with planar data layout should be used with COI selected" );
28136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_CALL( cvInitMatHeader( mat, img->roi->height,
28156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   img->roi->width, type,
28166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   img->imageData + (img->roi->coi-1)*img->imageSize +
28176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   img->roi->yOffset*img->widthStep +
28186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   img->roi->xOffset*CV_ELEM_SIZE(type),
28196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   img->widthStep ));
28206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
28216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else /* pixel order */
28226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
28236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int type = CV_MAKETYPE( depth, img->nChannels );
28246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                coi = img->roi->coi;
28256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( img->nChannels > CV_CN_MAX )
28276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_BadNumChannels,
28286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        "The image is interleaved and has over CV_CN_MAX channels" );
28296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_CALL( cvInitMatHeader( mat, img->roi->height, img->roi->width,
28316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          type, img->imageData +
28326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          img->roi->yOffset*img->widthStep +
28336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          img->roi->xOffset*CV_ELEM_SIZE(type),
28346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          img->widthStep ));
28356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
28366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
28376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
28386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
28396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int type = CV_MAKETYPE( depth, img->nChannels );
28406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( order != IPL_DATA_ORDER_PIXEL )
28426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadFlag, "Pixel order should be used with coi == 0" );
28436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( cvInitMatHeader( mat, img->height, img->width, type,
28456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      img->imageData, img->widthStep ));
28466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
28476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        result = mat;
28496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
28506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( allowND && CV_IS_MATND_HDR(src) )
28516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
28526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* matnd = (CvMatND*)src;
28536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;
28546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int size1 = matnd->dim[0].size, size2 = 1;
28556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !src->data.ptr )
28576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsNullPtr, "Input array has NULL data pointer" );
28586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT_CONT( matnd->type ))
28606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Only continuous nD arrays are supported here" );
28616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( matnd->dims > 2 )
28636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 1; i < matnd->dims; i++ )
28646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                size2 *= matnd->dim[i].size;
28656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
28666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size2 = matnd->dims == 1 ? 1 : matnd->dim[1].size;
28676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->refcount = 0;
28696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->hdr_refcount = 0;
28706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->data.ptr = matnd->data.ptr;
28716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->rows = size1;
28726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->cols = size2;
28736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->type = CV_MAT_TYPE(matnd->type) | CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG;
28746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->step = size2*CV_ELEM_SIZE(matnd->type);
28756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        mat->step &= size1 > 1 ? -1 : 0;
28766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvCheckHuge( mat );
28786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        result = mat;
28796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
28806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
28816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
28826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadFlag, "Unrecognized or unsupported array type" );
28836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
28846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
28866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( pCOI )
28886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *pCOI = coi;
28896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return result;
28916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
28926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
28946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvArr*
28956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvReshapeMatND( const CvArr* arr,
28966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int sizeof_header, CvArr* _header,
28976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int new_cn, int new_dims, int* new_sizes )
28986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
28996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvArr* result = 0;
29006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvReshapeMatND" );
29016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
29036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims, coi = 0;
29056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !arr || !_header )
29076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "NULL pointer to array or destination header" );
29086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( new_cn == 0 && new_dims == 0 )
29106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "None of array parameters is changed: dummy call?" );
29116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( dims = cvGetDims( arr ));
29136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( new_dims == 0 )
29156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
29166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        new_sizes = 0;
29176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        new_dims = dims;
29186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
29196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( new_dims == 1 )
29206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
29216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        new_sizes = 0;
29226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
29236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
29246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
29256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( new_dims <= 0 || new_dims > CV_MAX_DIM )
29266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "Non-positive or too large number of dimensions" );
29276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !new_sizes )
29286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsNullPtr, "New dimension sizes are not specified" );
29296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
29306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( new_dims <= 2 )
29326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
29336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* mat = (CvMat*)arr;
29346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMat* header = (CvMat*)_header;
29356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int* refcount = 0;
29366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int  hdr_refcount = 0;
29376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int  total_width, new_rows, cn;
29386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sizeof_header != sizeof(CvMat))
29406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "The header should be CvMat" );
29416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat == header )
29436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
29446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            refcount = mat->refcount;
29456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            hdr_refcount = mat->hdr_refcount;
29466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
29476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( !CV_IS_MAT( mat ))
29486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( mat = cvGetMat( mat, header, &coi, 1 ));
29496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cn = CV_MAT_CN( mat->type );
29516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        total_width = mat->cols * cn;
29526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( new_cn == 0 )
29546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            new_cn = cn;
29556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( new_sizes )
29576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            new_rows = new_sizes[0];
29586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( new_dims == 1 )
29596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            new_rows = total_width*mat->rows/new_cn;
29606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
29616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
29626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            new_rows = mat->rows;
29636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( new_cn > total_width )
29646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                new_rows = mat->rows * total_width / new_cn;
29656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
29666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( new_rows != mat->rows )
29686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
29696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int total_size = total_width * mat->rows;
29706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_IS_MAT_CONT( mat->type ))
29726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_BadStep,
29736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                "The matrix is not continuous so the number of rows can not be changed" );
29746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            total_width = total_size / new_rows;
29766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( total_width * new_rows != total_size )
29786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadArg, "The total number of matrix elements "
29796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        "is not divisible by the new number of rows" );
29806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
29816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->rows = new_rows;
29836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->cols = total_width / new_cn;
29846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( header->cols * new_cn != total_width ||
29866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (new_sizes && header->cols != new_sizes[1]) )
29876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "The total matrix width is not "
29886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            "divisible by the new number of columns" );
29896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
29906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->type = CV_MAKETYPE( mat->type & ~CV_MAT_CN_MASK, new_cn );
29916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->step = header->cols * CV_ELEM_SIZE(mat->type);
29926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->step &= new_rows > 1 ? -1 : 0;
29936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->refcount = refcount;
29946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->hdr_refcount = hdr_refcount;
29956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
29966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
29976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
29986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvMatND* header = (CvMatND*)_header;
29996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sizeof_header != sizeof(CvMatND))
30016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadSize, "The header should be CvMatND" );
30026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !new_sizes )
30046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
30056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_IS_MATND( arr ))
30066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadArg, "The source array must be CvMatND" );
30076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
30096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvMatND* mat = (CvMatND*)arr;
30106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert( new_cn > 0 );
30116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int last_dim_size = mat->dim[mat->dims-1].size*CV_MAT_CN(mat->type);
30126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int new_size = last_dim_size/new_cn;
30136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( new_size*new_cn != last_dim_size )
30156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadArg,
30166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                "The last dimension full size is not divisible by new number of channels");
30176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( mat != header )
30196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
30206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                memcpy( header, mat, sizeof(*header));
30216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                header->refcount = 0;
30226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                header->hdr_refcount = 0;
30236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
30246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            header->dim[header->dims-1].size = new_size;
30266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            header->type = CV_MAKETYPE( header->type & ~CV_MAT_CN_MASK, new_cn );
30276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
30286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
30296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
30306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
30316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvMatND stub;
30326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvMatND* mat = (CvMatND*)arr;
30336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i, size1, size2;
30346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int step;
30356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( new_cn != 0 )
30376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadArg,
30386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                "Simultaneous change of shape and number of channels is not supported. "
30396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                "Do it by 2 separate calls" );
30406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !CV_IS_MATND( mat ))
30426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
30436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_CALL( cvGetMatND( mat, &stub, &coi ));
30446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                mat = &stub;
30456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
30466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( CV_IS_MAT_CONT( mat->type ))
30486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadArg, "Non-continuous nD arrays are not supported" );
30496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size1 = mat->dim[0].size;
30516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 1; i < dims; i++ )
30526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                size1 *= mat->dim[i].size;
30536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size2 = 1;
30556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < new_dims; i++ )
30566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
30576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( new_sizes[i] <= 0 )
30586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_ERROR( CV_StsBadSize,
30596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    "One of new dimension sizes is non-positive" );
30606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                size2 *= new_sizes[i];
30616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
30626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( size1 != size2 )
30646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                CV_ERROR( CV_StsBadSize,
30656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                "Number of elements in the original and reshaped array is different" );
30666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( header != mat )
30686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
30696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                header->refcount = 0;
30706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                header->hdr_refcount = 0;
30716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
30726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            header->dims = new_dims;
30746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            header->type = mat->type;
30756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            header->data.ptr = mat->data.ptr;
30766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            step = CV_ELEM_SIZE(header->type);
30776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = new_dims - 1; i >= 0; i-- )
30796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
30806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                header->dim[i].size = new_sizes[i];
30816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                header->dim[i].step = step;
30826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                step *= new_sizes[i];
30836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
30846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
30856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
30866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !coi )
30886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "COI is not supported by this operation" );
30896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    result = _header;
30916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
30936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return result;
30956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
30966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
30986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvMat*
30996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvReshape( const CvArr* array, CvMat* header,
31006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           int new_cn, int new_rows )
31016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
31026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat* result = 0;
31036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvReshape" );
31046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
31066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat *mat = (CvMat*)array;
31086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int total_width, new_width;
31096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !header )
31116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "" );
31126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( mat ))
31146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
31156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int coi = 0;
31166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( mat = cvGetMat( mat, header, &coi, 1 ));
31176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( coi )
31186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadCOI, "COI is not supported" );
31196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
31206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( new_cn == 0 )
31226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        new_cn = CV_MAT_CN(mat->type);
31236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( (unsigned)(new_cn - 1) > 3 )
31246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadNumChannels, "" );
31256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( mat != header )
31276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
31286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int hdr_refcount = header->hdr_refcount;
31296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *header = *mat;
31306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->refcount = 0;
31316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->hdr_refcount = hdr_refcount;
31326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
31336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    total_width = mat->cols * CV_MAT_CN( mat->type );
31356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (new_cn > total_width || total_width % new_cn != 0) && new_rows == 0 )
31376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        new_rows = mat->rows * total_width / new_cn;
31386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( new_rows == 0 || new_rows == mat->rows )
31406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
31416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->rows = mat->rows;
31426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->step = mat->step;
31436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
31446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
31456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
31466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int total_size = total_width * mat->rows;
31476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT_CONT( mat->type ))
31486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadStep,
31496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "The matrix is not continuous, thus its number of rows can not be changed" );
31506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)new_rows > (unsigned)total_size )
31526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsOutOfRange, "Bad new number of rows" );
31536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        total_width = total_size / new_rows;
31556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( total_width * new_rows != total_size )
31576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "The total number of matrix elements "
31586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    "is not divisible by the new number of rows" );
31596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->rows = new_rows;
31616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        header->step = total_width * CV_ELEM_SIZE1(mat->type);
31626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
31636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    new_width = total_width / new_cn;
31656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( new_width * new_cn != total_width )
31676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadNumChannels,
31686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "The total width is not divisible by the new number of channels" );
31696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    header->cols = new_width;
31716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    header->type = CV_MAKETYPE( mat->type & ~CV_MAT_CN_MASK, new_cn );
31726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    result = header;
31746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
31766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return  result;
31786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
31796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// convert array (CvMat or IplImage) to IplImage
31826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL IplImage*
31836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetImage( const CvArr* array, IplImage* img )
31846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
31856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplImage* result = 0;
31866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const IplImage* src = (const IplImage*)array;
31876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetImage" );
31896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
31916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int depth;
31936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !img )
31956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR_FROM_CODE( CV_StsNullPtr );
31966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
31976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_IMAGE_HDR(src) )
31986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
31996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        const CvMat* mat = (const CvMat*)src;
32006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_IS_MAT_HDR(mat))
32026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsBadFlag );
32036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( mat->data.ptr == 0 )
32056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_CODE( CV_StsNullPtr );
32066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        depth = cvCvToIplDepth(mat->type);
32086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvInitImageHeader( img, cvSize(mat->cols, mat->rows),
32106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           depth, CV_MAT_CN(mat->type) );
32116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvSetData( img, mat->data.ptr, mat->step );
32126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        result = img;
32146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
32156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
32166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
32176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        result = (IplImage*)src;
32186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
32196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
32216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return result;
32236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
32246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
32276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                               IplImage-specific functions                              *
32286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
32296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic IplROI* icvCreateROI( int coi, int xOffset, int yOffset, int width, int height )
32316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
32326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplROI *roi = 0;
32336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "icvCreateROI" );
32356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
32376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CvIPL.createROI )
32396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
32406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( roi = (IplROI*)cvAlloc( sizeof(*roi)));
32416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        roi->coi = coi;
32436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        roi->xOffset = xOffset;
32446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        roi->yOffset = yOffset;
32456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        roi->width = width;
32466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        roi->height = height;
32476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
32486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
32496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
32506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        roi = CvIPL.createROI( coi, xOffset, yOffset, width, height );
32516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
32526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
32546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return roi;
32566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
32576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic  void
32596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetColorModel( int nchannels, const char** colorModel, const char** channelSeq )
32606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
32616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const char* tab[][2] =
32626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
32636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {"GRAY", "GRAY"},
32646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {"",""},
32656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {"RGB","BGR"},
32666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {"RGB","BGRA"}
32676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
32686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    nchannels--;
32706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *colorModel = *channelSeq = "";
32716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (unsigned)nchannels <= 3 )
32736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
32746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *colorModel = tab[nchannels][0];
32756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *channelSeq = tab[nchannels][1];
32766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
32776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
32786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// create IplImage header
32816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL IplImage *
32826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateImageHeader( CvSize size, int depth, int channels )
32836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
32846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplImage *img = 0;
32856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCreateImageHeader" );
32876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
32896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
32906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CvIPL.createHeader )
32916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
32926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( img = (IplImage *)cvAlloc( sizeof( *img )));
32936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( cvInitImageHeader( img, size, depth, channels, IPL_ORIGIN_TL,
32946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    CV_DEFAULT_IMAGE_ROW_ALIGN ));
32956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
32966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
32976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
32986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        const char *colorModel, *channelSeq;
32996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvGetColorModel( channels, &colorModel, &channelSeq );
33016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        img = CvIPL.createHeader( channels, 0, depth, (char*)colorModel, (char*)channelSeq,
33036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_TL,
33046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  CV_DEFAULT_IMAGE_ROW_ALIGN,
33056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                  size.width, size.height, 0, 0, 0, 0 );
33066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
33076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
33096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 && img )
33116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseImageHeader( &img );
33126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return img;
33146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
33156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// create IplImage header and allocate underlying data
33186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL IplImage *
33196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCreateImage( CvSize size, int depth, int channels )
33206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
33216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplImage *img = 0;
33226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCreateImage" );
33246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
33266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( img = cvCreateImageHeader( size, depth, channels ));
33286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( img );
33296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( cvCreateData( img ));
33306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
33326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cvGetErrStatus() < 0 )
33346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseImage( &img );
33356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return img;
33376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
33386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// initalize IplImage header, allocated by the user
33416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL IplImage*
33426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvInitImageHeader( IplImage * image, CvSize size, int depth,
33436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   int channels, int origin, int align )
33446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
33456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplImage* result = 0;
33466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvInitImageHeader" );
33486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
33506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char *colorModel, *channelSeq;
33526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !image )
33546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_HeaderIsNull, "null pointer to header" );
33556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memset( image, 0, sizeof( *image ));
33576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->nSize = sizeof( *image );
33586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( icvGetColorModel( channels, &colorModel, &channelSeq ));
33606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    strncpy( image->colorModel, colorModel, 4 );
33616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    strncpy( image->channelSeq, channelSeq, 4 );
33626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.width < 0 || size.height < 0 )
33646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadROISize, "Bad input roi" );
33656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (depth != (int)IPL_DEPTH_1U && depth != (int)IPL_DEPTH_8U &&
33676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         depth != (int)IPL_DEPTH_8S && depth != (int)IPL_DEPTH_16U &&
33686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         depth != (int)IPL_DEPTH_16S && depth != (int)IPL_DEPTH_32S &&
33696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         depth != (int)IPL_DEPTH_32F && depth != (int)IPL_DEPTH_64F) ||
33706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         channels < 0 )
33716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadDepth, "Unsupported format" );
33726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( origin != CV_ORIGIN_BL && origin != CV_ORIGIN_TL )
33736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadOrigin, "Bad input origin" );
33746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( align != 4 && align != 8 )
33766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadAlign, "Bad input align" );
33776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->width = size.width;
33796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->height = size.height;
33806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( image->roi )
33826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
33836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        image->roi->coi = 0;
33846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        image->roi->xOffset = image->roi->yOffset = 0;
33856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        image->roi->width = size.width;
33866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        image->roi->height = size.height;
33876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
33886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->nChannels = MAX( channels, 1 );
33906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->depth = depth;
33916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->align = align;
33926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->widthStep = (((image->width * image->nChannels *
33936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         (image->depth & ~IPL_DEPTH_SIGN) + 7)/8)+ align - 1) & (~(align - 1));
33946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->origin = origin;
33956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    image->imageSize = image->widthStep * image->height;
33966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    result = image;
33986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
33996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
34006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return result;
34026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
34036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
34066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvReleaseImageHeader( IplImage** image )
34076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
34086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvReleaseImageHeader" );
34096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
34116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !image )
34136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "" );
34146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( *image )
34166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
34176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = *image;
34186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *image = 0;
34196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CvIPL.deallocate )
34216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
34226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvFree( &img->roi );
34236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvFree( &img );
34246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
34256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
34266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
34276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvIPL.deallocate( img, IPL_IMAGE_HEADER | IPL_IMAGE_ROI );
34286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
34296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
34306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
34316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
34326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
34356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvReleaseImage( IplImage ** image )
34366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
34376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvReleaseImage" );
34386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__
34406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !image )
34426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "" );
34436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( *image )
34456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
34466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IplImage* img = *image;
34476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        *image = 0;
34486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseData( img );
34506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvReleaseImageHeader( &img );
34516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
34526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
34546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
34556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
34586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetImageROI( IplImage* image, CvRect rect )
34596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
34606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetImageROI" );
34616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
34636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !image )
34656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_HeaderIsNull, "" );
34666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rect.x > image->width || rect.y > image->height )
34686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadROISize, "" );
34696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rect.x + rect.width < 0 || rect.y + rect.height < 0 )
34716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadROISize, "" );
34726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rect.x < 0 )
34746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
34756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.width += rect.x;
34766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.x = 0;
34776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
34786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rect.y < 0 )
34806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
34816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.height += rect.y;
34826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.y = 0;
34836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
34846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rect.x + rect.width > image->width )
34866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.width = image->width - rect.x;
34876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( rect.y + rect.height > image->height )
34896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.height = image->height - rect.y;
34906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
34916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( image->roi )
34926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
34936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        image->roi->xOffset = rect.x;
34946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        image->roi->yOffset = rect.y;
34956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        image->roi->width = rect.width;
34966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        image->roi->height = rect.height;
34976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
34986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
34996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
35006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( image->roi = icvCreateROI( 0, rect.x, rect.y, rect.width, rect.height ));
35016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
35026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
35046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
35056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
35086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvResetImageROI( IplImage* image )
35096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
35106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvResetImageROI" );
35116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
35136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !image )
35156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_HeaderIsNull, "" );
35166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( image->roi )
35186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
35196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CvIPL.deallocate )
35206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
35216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvFree( &image->roi );
35226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
35236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
35246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
35256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvIPL.deallocate( image, IPL_IMAGE_ROI );
35266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            image->roi = 0;
35276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
35286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
35296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
35316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
35326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvRect
35356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetImageROI( const IplImage* img )
35366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
35376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvRect rect = { 0, 0, 0, 0 };
35386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetImageROI" );
35406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
35426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !img )
35446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "Null pointer to image" );
35456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( img->roi )
35476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect = cvRect( img->roi->xOffset, img->roi->yOffset,
35486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       img->roi->width, img->roi->height );
35496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
35506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect = cvRect( 0, 0, img->width, img->height );
35516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
35536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return rect;
35556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
35566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
35596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSetImageCOI( IplImage* image, int coi )
35606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
35616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSetImageCOI" );
35626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
35646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !image )
35666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_HeaderIsNull, "" );
35676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (unsigned)coi > (unsigned)(image->nChannels) )
35696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
35706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( image->roi || coi != 0 )
35726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
35736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( image->roi )
35746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
35756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            image->roi->coi = coi;
35766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
35776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
35786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
35796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALL( image->roi = icvCreateROI( coi, 0, 0, image->width, image->height ));
35806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
35816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
35826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
35846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
35856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL int
35886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetImageCOI( const IplImage* image )
35896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
35906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi = -1;
35916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetImageCOI" );
35926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
35946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !image )
35966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_HeaderIsNull, "" );
35976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
35986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    coi = image->roi ? image->roi->coi : 0;
35996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
36016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return coi;
36036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
36046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL IplImage*
36076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCloneImage( const IplImage* src )
36086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
36096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplImage* dst = 0;
36106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCloneImage" );
36116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
36136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_IMAGE_HDR( src ))
36156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "Bad image header" );
36166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CvIPL.cloneImage )
36186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
36196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = (IplImage*)cvAlloc( sizeof(*dst)));
36206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        memcpy( dst, src, sizeof(*src));
36226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst->imageData = dst->imageDataOrigin = 0;
36236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst->roi = 0;
36246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src->roi )
36266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
36276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst->roi = icvCreateROI( src->roi->coi, src->roi->xOffset,
36286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          src->roi->yOffset, src->roi->width, src->roi->height );
36296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
36306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src->imageData )
36326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
36336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int size = src->imageSize;
36346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvCreateData( dst );
36356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            memcpy( dst->imageData, src->imageData, size );
36366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
36376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
36386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
36396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
36406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst = CvIPL.cloneImage( src );
36416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
36426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
36446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return dst;
36466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
36476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
36506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                            Additional operations on CvTermCriteria                     *
36516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
36526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL CvTermCriteria
36546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCheckTermCriteria( CvTermCriteria criteria, double default_eps,
36556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     int default_max_iters )
36566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
36576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCheckTermCriteria" );
36586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvTermCriteria crit;
36606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    crit.type = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
36626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    crit.max_iter = default_max_iters;
36636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    crit.epsilon = (float)default_eps;
36646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
36666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (criteria.type & ~(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER)) != 0 )
36686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg,
36696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  "Unknown type of term criteria" );
36706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (criteria.type & CV_TERMCRIT_ITER) != 0 )
36726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
36736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( criteria.max_iter <= 0 )
36746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg,
36756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  "Iterations flag is set and maximum number of iterations is <= 0" );
36766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        crit.max_iter = criteria.max_iter;
36776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
36786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (criteria.type & CV_TERMCRIT_EPS) != 0 )
36806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
36816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( criteria.epsilon < 0 )
36826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsBadArg, "Accuracy flag is set and epsilon is < 0" );
36836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        crit.epsilon = criteria.epsilon;
36856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
36866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (criteria.type & (CV_TERMCRIT_EPS | CV_TERMCRIT_ITER)) == 0 )
36886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg,
36896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  "Neither accuracy nor maximum iterations "
36906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  "number flags are set in criteria type" );
36916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
36936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    crit.epsilon = (float)MAX( 0, crit.epsilon );
36956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    crit.max_iter = MAX( 1, crit.max_iter );
36966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return crit;
36986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
36996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
37006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
37016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
3702