Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/core/src/convert_c.cpp
16337 views
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
9
CV_IMPL void
10
cvSplit( const void* srcarr, void* dstarr0, void* dstarr1, void* dstarr2, void* dstarr3 )
11
{
12
void* dptrs[] = { dstarr0, dstarr1, dstarr2, dstarr3 };
13
cv::Mat src = cv::cvarrToMat(srcarr);
14
int i, j, nz = 0;
15
for( i = 0; i < 4; i++ )
16
nz += dptrs[i] != 0;
17
CV_Assert( nz > 0 );
18
std::vector<cv::Mat> dvec(nz);
19
std::vector<int> pairs(nz*2);
20
21
for( i = j = 0; i < 4; i++ )
22
{
23
if( dptrs[i] != 0 )
24
{
25
dvec[j] = cv::cvarrToMat(dptrs[i]);
26
CV_Assert( dvec[j].size() == src.size() );
27
CV_Assert( dvec[j].depth() == src.depth() );
28
CV_Assert( dvec[j].channels() == 1 );
29
CV_Assert( i < src.channels() );
30
pairs[j*2] = i;
31
pairs[j*2+1] = j;
32
j++;
33
}
34
}
35
if( nz == src.channels() )
36
cv::split( src, dvec );
37
else
38
{
39
cv::mixChannels( &src, 1, &dvec[0], nz, &pairs[0], nz );
40
}
41
}
42
43
44
CV_IMPL void
45
cvMerge( const void* srcarr0, const void* srcarr1, const void* srcarr2,
46
const void* srcarr3, void* dstarr )
47
{
48
const void* sptrs[] = { srcarr0, srcarr1, srcarr2, srcarr3 };
49
cv::Mat dst = cv::cvarrToMat(dstarr);
50
int i, j, nz = 0;
51
for( i = 0; i < 4; i++ )
52
nz += sptrs[i] != 0;
53
CV_Assert( nz > 0 );
54
std::vector<cv::Mat> svec(nz);
55
std::vector<int> pairs(nz*2);
56
57
for( i = j = 0; i < 4; i++ )
58
{
59
if( sptrs[i] != 0 )
60
{
61
svec[j] = cv::cvarrToMat(sptrs[i]);
62
CV_Assert( svec[j].size == dst.size &&
63
svec[j].depth() == dst.depth() &&
64
svec[j].channels() == 1 && i < dst.channels() );
65
pairs[j*2] = j;
66
pairs[j*2+1] = i;
67
j++;
68
}
69
}
70
71
if( nz == dst.channels() )
72
cv::merge( svec, dst );
73
else
74
{
75
cv::mixChannels( &svec[0], nz, &dst, 1, &pairs[0], nz );
76
}
77
}
78
79
80
CV_IMPL void
81
cvMixChannels( const CvArr** src, int src_count,
82
CvArr** dst, int dst_count,
83
const int* from_to, int pair_count )
84
{
85
cv::AutoBuffer<cv::Mat> buf(src_count + dst_count);
86
87
int i;
88
for( i = 0; i < src_count; i++ )
89
buf[i] = cv::cvarrToMat(src[i]);
90
for( i = 0; i < dst_count; i++ )
91
buf[i+src_count] = cv::cvarrToMat(dst[i]);
92
cv::mixChannels(&buf[0], src_count, &buf[src_count], dst_count, from_to, pair_count);
93
}
94
95
96
CV_IMPL void
97
cvConvertScaleAbs( const void* srcarr, void* dstarr,
98
double scale, double shift )
99
{
100
cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr);
101
CV_Assert( src.size == dst.size && dst.type() == CV_8UC(src.channels()));
102
cv::convertScaleAbs( src, dst, scale, shift );
103
}
104
105
106
CV_IMPL void
107
cvConvertScale( const void* srcarr, void* dstarr,
108
double scale, double shift )
109
{
110
cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr);
111
112
CV_Assert( src.size == dst.size && src.channels() == dst.channels() );
113
src.convertTo(dst, dst.type(), scale, shift);
114
}
115
116
117
CV_IMPL void cvLUT( const void* srcarr, void* dstarr, const void* lutarr )
118
{
119
cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr), lut = cv::cvarrToMat(lutarr);
120
121
CV_Assert( dst.size() == src.size() && dst.type() == CV_MAKETYPE(lut.depth(), src.channels()) );
122
cv::LUT( src, lut, dst );
123
}
124
125
126
CV_IMPL void cvNormalize( const CvArr* srcarr, CvArr* dstarr,
127
double a, double b, int norm_type, const CvArr* maskarr )
128
{
129
cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr), mask;
130
if( maskarr )
131
mask = cv::cvarrToMat(maskarr);
132
CV_Assert( dst.size() == src.size() && src.channels() == dst.channels() );
133
cv::normalize( src, dst, a, b, norm_type, dst.type(), mask );
134
}
135
136