1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html
4 
5 
6 #include "precomp.hpp"
7 
8 #ifndef OPENCV_EXCLUDE_C_API
9 
10 CV_IMPL void
cvSplit(const void * srcarr,void * dstarr0,void * dstarr1,void * dstarr2,void * dstarr3)11 cvSplit( const void* srcarr, void* dstarr0, void* dstarr1, void* dstarr2, void* dstarr3 )
12 {
13     void* dptrs[] = { dstarr0, dstarr1, dstarr2, dstarr3 };
14     cv::Mat src = cv::cvarrToMat(srcarr);
15     int i, j, nz = 0;
16     for( i = 0; i < 4; i++ )
17         nz += dptrs[i] != 0;
18     CV_Assert( nz > 0 );
19     std::vector<cv::Mat> dvec(nz);
20     std::vector<int> pairs(nz*2);
21 
22     for( i = j = 0; i < 4; i++ )
23     {
24         if( dptrs[i] != 0 )
25         {
26             dvec[j] = cv::cvarrToMat(dptrs[i]);
27             CV_Assert( dvec[j].size() == src.size() );
28             CV_Assert( dvec[j].depth() == src.depth() );
29             CV_Assert( dvec[j].channels() == 1 );
30             CV_Assert( i < src.channels() );
31             pairs[j*2] = i;
32             pairs[j*2+1] = j;
33             j++;
34         }
35     }
36     if( nz == src.channels() )
37         cv::split( src, dvec );
38     else
39     {
40         cv::mixChannels( &src, 1, &dvec[0], nz, &pairs[0], nz );
41     }
42 }
43 
44 
45 CV_IMPL void
cvMerge(const void * srcarr0,const void * srcarr1,const void * srcarr2,const void * srcarr3,void * dstarr)46 cvMerge( const void* srcarr0, const void* srcarr1, const void* srcarr2,
47          const void* srcarr3, void* dstarr )
48 {
49     const void* sptrs[] = { srcarr0, srcarr1, srcarr2, srcarr3 };
50     cv::Mat dst = cv::cvarrToMat(dstarr);
51     int i, j, nz = 0;
52     for( i = 0; i < 4; i++ )
53         nz += sptrs[i] != 0;
54     CV_Assert( nz > 0 );
55     std::vector<cv::Mat> svec(nz);
56     std::vector<int> pairs(nz*2);
57 
58     for( i = j = 0; i < 4; i++ )
59     {
60         if( sptrs[i] != 0 )
61         {
62             svec[j] = cv::cvarrToMat(sptrs[i]);
63             CV_Assert( svec[j].size == dst.size &&
64                 svec[j].depth() == dst.depth() &&
65                 svec[j].channels() == 1 && i < dst.channels() );
66             pairs[j*2] = j;
67             pairs[j*2+1] = i;
68             j++;
69         }
70     }
71 
72     if( nz == dst.channels() )
73         cv::merge( svec, dst );
74     else
75     {
76         cv::mixChannels( &svec[0], nz, &dst, 1, &pairs[0], nz );
77     }
78 }
79 
80 
81 CV_IMPL void
cvMixChannels(const CvArr ** src,int src_count,CvArr ** dst,int dst_count,const int * from_to,int pair_count)82 cvMixChannels( const CvArr** src, int src_count,
83                CvArr** dst, int dst_count,
84                const int* from_to, int pair_count )
85 {
86     cv::AutoBuffer<cv::Mat> buf(src_count + dst_count);
87 
88     int i;
89     for( i = 0; i < src_count; i++ )
90         buf[i] = cv::cvarrToMat(src[i]);
91     for( i = 0; i < dst_count; i++ )
92         buf[i+src_count] = cv::cvarrToMat(dst[i]);
93     cv::mixChannels(&buf[0], src_count, &buf[src_count], dst_count, from_to, pair_count);
94 }
95 
96 
97 CV_IMPL void
cvConvertScaleAbs(const void * srcarr,void * dstarr,double scale,double shift)98 cvConvertScaleAbs( const void* srcarr, void* dstarr,
99                    double scale, double shift )
100 {
101     cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr);
102     CV_Assert( src.size == dst.size && dst.type() == CV_8UC(src.channels()));
103     cv::convertScaleAbs( src, dst, scale, shift );
104 }
105 
106 
107 CV_IMPL void
cvConvertScale(const void * srcarr,void * dstarr,double scale,double shift)108 cvConvertScale( const void* srcarr, void* dstarr,
109                 double scale, double shift )
110 {
111     cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr);
112 
113     CV_Assert( src.size == dst.size && src.channels() == dst.channels() );
114     src.convertTo(dst, dst.type(), scale, shift);
115 }
116 
117 
cvLUT(const void * srcarr,void * dstarr,const void * lutarr)118 CV_IMPL void cvLUT( const void* srcarr, void* dstarr, const void* lutarr )
119 {
120     cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr), lut = cv::cvarrToMat(lutarr);
121 
122     CV_Assert( dst.size() == src.size() && dst.type() == CV_MAKETYPE(lut.depth(), src.channels()) );
123     cv::LUT( src, lut, dst );
124 }
125 
126 
cvNormalize(const CvArr * srcarr,CvArr * dstarr,double a,double b,int norm_type,const CvArr * maskarr)127 CV_IMPL void cvNormalize( const CvArr* srcarr, CvArr* dstarr,
128                           double a, double b, int norm_type, const CvArr* maskarr )
129 {
130     cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr), mask;
131     if( maskarr )
132         mask = cv::cvarrToMat(maskarr);
133     CV_Assert( dst.size() == src.size() && src.channels() == dst.channels() );
134     cv::normalize( src, dst, a, b, norm_type, dst.type(), mask );
135 }
136 
137 #endif  // OPENCV_EXCLUDE_C_API
138