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
10CV_IMPL void
11cvSplit( 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(arr: 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(arr: 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( m: src, mv: dvec );
38 else
39 {
40 cv::mixChannels( src: &src, nsrcs: 1, dst: &dvec[0], ndsts: nz, fromTo: &pairs[0], npairs: nz );
41 }
42}
43
44
45CV_IMPL void
46cvMerge( 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(arr: 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(arr: 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( mv: svec, dst );
74 else
75 {
76 cv::mixChannels( src: &svec[0], nsrcs: nz, dst: &dst, ndsts: 1, fromTo: &pairs[0], npairs: nz );
77 }
78}
79
80
81CV_IMPL void
82cvMixChannels( 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(arr: src[i]);
91 for( i = 0; i < dst_count; i++ )
92 buf[i+src_count] = cv::cvarrToMat(arr: dst[i]);
93 cv::mixChannels(src: &buf[0], nsrcs: src_count, dst: &buf[src_count], ndsts: dst_count, fromTo: from_to, npairs: pair_count);
94}
95
96
97CV_IMPL void
98cvConvertScaleAbs( const void* srcarr, void* dstarr,
99 double scale, double shift )
100{
101 cv::Mat src = cv::cvarrToMat(arr: srcarr), dst = cv::cvarrToMat(arr: dstarr);
102 CV_Assert( src.size == dst.size && dst.type() == CV_8UC(src.channels()));
103 cv::convertScaleAbs( src, dst, alpha: scale, beta: shift );
104}
105
106
107CV_IMPL void
108cvConvertScale( const void* srcarr, void* dstarr,
109 double scale, double shift )
110{
111 cv::Mat src = cv::cvarrToMat(arr: srcarr), dst = cv::cvarrToMat(arr: dstarr);
112
113 CV_Assert( src.size == dst.size && src.channels() == dst.channels() );
114 src.convertTo(m: dst, rtype: dst.type(), alpha: scale, beta: shift);
115}
116
117
118CV_IMPL void cvLUT( const void* srcarr, void* dstarr, const void* lutarr )
119{
120 cv::Mat src = cv::cvarrToMat(arr: srcarr), dst = cv::cvarrToMat(arr: dstarr), lut = cv::cvarrToMat(arr: 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
127CV_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(arr: srcarr), dst = cv::cvarrToMat(arr: dstarr), mask;
131 if( maskarr )
132 mask = cv::cvarrToMat(arr: maskarr);
133 CV_Assert( dst.size() == src.size() && src.channels() == dst.channels() );
134 cv::normalize( src, dst, alpha: a, beta: b, norm_type, dtype: dst.type(), mask );
135}
136
137#endif // OPENCV_EXCLUDE_C_API
138

source code of opencv/modules/core/src/convert_c.cpp