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