Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
bb93e3ab
Commit
bb93e3ab
authored
Feb 15, 2012
by
Vadim Pisarevsky
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added color canny; improved Algorithm class implementation
parent
716a5d04
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
184 additions
and
133 deletions
+184
-133
core.hpp
modules/core/include/opencv2/core/core.hpp
+24
-5
operations.hpp
modules/core/include/opencv2/core/operations.hpp
+0
-11
algorithm.cpp
modules/core/src/algorithm.cpp
+51
-0
canny.cpp
modules/imgproc/src/canny.cpp
+109
-117
No files found.
modules/core/include/opencv2/core/core.hpp
View file @
bb93e3ab
...
@@ -4288,11 +4288,30 @@ public:
...
@@ -4288,11 +4288,30 @@ public:
void
read
(
Algorithm
*
algo
,
const
FileNode
&
fn
)
const
;
void
read
(
Algorithm
*
algo
,
const
FileNode
&
fn
)
const
;
string
name
()
const
;
string
name
()
const
;
template
<
typename
_Tp
>
void
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
void
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
typename
ParamType
<
_Tp
>::
member_type
&
value
,
const
int
&
value
,
bool
readOnly
=
false
,
bool
readOnly
=
false
,
int
(
Algorithm
::*
getter
)()
=
0
,
typename
ParamType
<
_Tp
>::
member_type
(
Algorithm
::*
getter
)()
=
0
,
void
(
Algorithm
::*
setter
)(
int
)
=
0
,
void
(
Algorithm
::*
setter
)(
typename
ParamType
<
_Tp
>::
const_param_type
)
=
0
,
const
string
&
help
=
string
());
void
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
double
&
value
,
bool
readOnly
=
false
,
double
(
Algorithm
::*
getter
)()
=
0
,
void
(
Algorithm
::*
setter
)(
double
)
=
0
,
const
string
&
help
=
string
());
void
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
string
&
value
,
bool
readOnly
=
false
,
string
(
Algorithm
::*
getter
)()
=
0
,
void
(
Algorithm
::*
setter
)(
const
string
&
)
=
0
,
const
string
&
help
=
string
());
void
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
Mat
&
value
,
bool
readOnly
=
false
,
Mat
(
Algorithm
::*
getter
)()
=
0
,
void
(
Algorithm
::*
setter
)(
const
Mat
&
)
=
0
,
const
string
&
help
=
string
());
void
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
Ptr
<
Algorithm
>&
value
,
bool
readOnly
=
false
,
Ptr
<
Algorithm
>
(
Algorithm
::*
getter
)()
=
0
,
void
(
Algorithm
::*
setter
)(
const
Ptr
<
Algorithm
>&
)
=
0
,
const
string
&
help
=
string
());
const
string
&
help
=
string
());
protected
:
protected
:
AlgorithmInfoData
*
data
;
AlgorithmInfoData
*
data
;
...
...
modules/core/include/opencv2/core/operations.hpp
View file @
bb93e3ab
...
@@ -3833,17 +3833,6 @@ template<typename _Tp> inline void Algorithm::set(const char* name,
...
@@ -3833,17 +3833,6 @@ template<typename _Tp> inline void Algorithm::set(const char* name,
info
()
->
set
(
this
,
name
,
ParamType
<
_Tp
>::
type
,
&
value
);
info
()
->
set
(
this
,
name
,
ParamType
<
_Tp
>::
type
,
&
value
);
}
}
template
<
typename
_Tp
>
inline
void
AlgorithmInfo
::
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
typename
ParamType
<
_Tp
>::
member_type
&
value
,
bool
readOnly
,
typename
ParamType
<
_Tp
>::
member_type
(
Algorithm
::*
getter
)(),
void
(
Algorithm
::*
setter
)(
typename
ParamType
<
_Tp
>::
const_param_type
),
const
string
&
help
)
{
addParam_
(
algo
,
name
,
ParamType
<
_Tp
>::
type
,
&
value
,
readOnly
,
(
Algorithm
::
Getter
)
getter
,
(
Algorithm
::
Setter
)
setter
,
help
);
}
}
}
#endif // __cplusplus
#endif // __cplusplus
...
...
modules/core/src/algorithm.cpp
View file @
bb93e3ab
...
@@ -494,6 +494,57 @@ void AlgorithmInfo::addParam_(const Algorithm* algo, const char* name, int argTy
...
@@ -494,6 +494,57 @@ void AlgorithmInfo::addParam_(const Algorithm* algo, const char* name, int argTy
getter
,
setter
,
help
));
getter
,
setter
,
help
));
}
}
void
AlgorithmInfo
::
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
int
&
value
,
bool
readOnly
,
int
(
Algorithm
::*
getter
)(),
void
(
Algorithm
::*
setter
)(
int
),
const
string
&
help
)
{
addParam_
(
algo
,
name
,
ParamType
<
int
>::
type
,
&
value
,
readOnly
,
(
Algorithm
::
Getter
)
getter
,
(
Algorithm
::
Setter
)
setter
,
help
);
}
void
AlgorithmInfo
::
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
double
&
value
,
bool
readOnly
,
double
(
Algorithm
::*
getter
)(),
void
(
Algorithm
::*
setter
)(
double
),
const
string
&
help
)
{
addParam_
(
algo
,
name
,
ParamType
<
double
>::
type
,
&
value
,
readOnly
,
(
Algorithm
::
Getter
)
getter
,
(
Algorithm
::
Setter
)
setter
,
help
);
}
void
AlgorithmInfo
::
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
string
&
value
,
bool
readOnly
,
string
(
Algorithm
::*
getter
)(),
void
(
Algorithm
::*
setter
)(
const
string
&
),
const
string
&
help
)
{
addParam_
(
algo
,
name
,
ParamType
<
string
>::
type
,
&
value
,
readOnly
,
(
Algorithm
::
Getter
)
getter
,
(
Algorithm
::
Setter
)
setter
,
help
);
}
void
AlgorithmInfo
::
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
Mat
&
value
,
bool
readOnly
,
Mat
(
Algorithm
::*
getter
)(),
void
(
Algorithm
::*
setter
)(
const
Mat
&
),
const
string
&
help
)
{
addParam_
(
algo
,
name
,
ParamType
<
Mat
>::
type
,
&
value
,
readOnly
,
(
Algorithm
::
Getter
)
getter
,
(
Algorithm
::
Setter
)
setter
,
help
);
}
void
AlgorithmInfo
::
addParam
(
const
Algorithm
*
algo
,
const
char
*
name
,
const
Ptr
<
Algorithm
>&
value
,
bool
readOnly
,
Ptr
<
Algorithm
>
(
Algorithm
::*
getter
)(),
void
(
Algorithm
::*
setter
)(
const
Ptr
<
Algorithm
>&
),
const
string
&
help
)
{
addParam_
(
algo
,
name
,
ParamType
<
Algorithm
>::
type
,
&
value
,
readOnly
,
(
Algorithm
::
Getter
)
getter
,
(
Algorithm
::
Setter
)
setter
,
help
);
}
}
}
/* End of file. */
/* End of file. */
modules/imgproc/src/canny.cpp
View file @
bb93e3ab
...
@@ -41,70 +41,32 @@
...
@@ -41,70 +41,32 @@
#include "precomp.hpp"
#include "precomp.hpp"
CV_IMPL
void
cvCanny
(
const
void
*
srcarr
,
void
*
dstarr
,
void
cv
::
Canny
(
InputArray
_src
,
OutputArray
_dst
,
double
low_thresh
,
double
high_thresh
,
double
low_thresh
,
double
high_thresh
,
int
aperture_size
)
int
aperture_size
,
bool
L2gradient
)
{
{
Mat
src
=
_src
.
getMat
();
CV_Assert
(
src
.
depth
()
==
CV_8U
);
_dst
.
create
(
src
.
size
(),
CV_8U
);
Mat
dst
=
_dst
.
getMat
();
#ifdef HAVE_TEGRA_OPTIMIZATION
#ifdef HAVE_TEGRA_OPTIMIZATION
if
(
tegra
::
canny
(
cv
::
cvarrToMat
(
srcarr
),
cv
::
cvarrToMat
(
dstarr
),
low_thresh
,
high_thresh
,
if
(
tegra
::
canny
(
src
,
dst
,
low_thresh
,
high_thresh
,
aperture_size
,
L2gradient
))
aperture_size
&
~
CV_CANNY_L2_GRADIENT
,
(
aperture_size
&
CV_CANNY_L2_GRADIENT
)
==
CV_CANNY_L2_GRADIENT
))
return
;
return
;
#endif
#endif
cv
::
Ptr
<
CvMat
>
dx
,
dy
;
cv
::
AutoBuffer
<
char
>
buffer
;
std
::
vector
<
uchar
*>
stack
;
uchar
**
stack_top
=
0
,
**
stack_bottom
=
0
;
CvMat
srcstub
,
*
src
=
cvGetMat
(
srcarr
,
&
srcstub
);
CvMat
dststub
,
*
dst
=
cvGetMat
(
dstarr
,
&
dststub
);
CvSize
size
;
int
flags
=
aperture_size
;
int
low
,
high
;
int
*
mag_buf
[
3
];
uchar
*
map
;
ptrdiff_t
mapstep
;
int
maxsize
;
int
i
,
j
;
CvMat
mag_row
;
if
(
CV_MAT_TYPE
(
src
->
type
)
!=
CV_8UC1
||
CV_MAT_TYPE
(
dst
->
type
)
!=
CV_8UC1
)
CV_Error
(
CV_StsUnsupportedFormat
,
""
);
if
(
!
CV_ARE_SIZES_EQ
(
src
,
dst
))
CV_Error
(
CV_StsUnmatchedSizes
,
""
);
if
(
low_thresh
>
high_thresh
)
if
(
low_thresh
>
high_thresh
)
{
std
::
swap
(
low_thresh
,
high_thresh
);
double
t
;
CV_SWAP
(
low_thresh
,
high_thresh
,
t
);
}
aperture_size
&=
INT_MAX
;
if
(
(
aperture_size
&
1
)
==
0
||
(
aperture_size
!=
-
1
&&
(
aperture_size
<
3
||
aperture_size
>
7
))
)
if
(
(
aperture_size
&
1
)
==
0
||
aperture_size
<
3
||
aperture_size
>
7
)
CV_Error
(
CV_StsBadFlag
,
""
);
CV_Error
(
CV_StsBadFlag
,
""
);
size
=
cvGetMatSize
(
src
);
Mat
dx
,
dy
;
Sobel
(
src
,
dx
,
CV_16S
,
1
,
0
,
aperture_size
,
1
,
0
,
BORDER_REFLECT_101
);
dx
=
cvCreateMat
(
size
.
height
,
size
.
width
,
CV_16SC1
);
Sobel
(
src
,
dy
,
CV_16S
,
0
,
1
,
aperture_size
,
1
,
0
,
BORDER_REFLECT_101
);
dy
=
cvCreateMat
(
size
.
height
,
size
.
width
,
CV_16SC1
);
cvSobel
(
src
,
dx
,
1
,
0
,
aperture_size
);
cvSobel
(
src
,
dy
,
0
,
1
,
aperture_size
);
/*if( icvCannyGetSize_p && icvCanny_16s8u_C1R_p && !(flags & CV_CANNY_L2_GRADIENT) )
int
low
,
high
;
{
if
(
L2gradient
)
int buf_size= 0;
IPPI_CALL( icvCannyGetSize_p( size, &buf_size ));
CV_CALL( buffer = cvAlloc( buf_size ));
IPPI_CALL( icvCanny_16s8u_C1R_p( (short*)dx->data.ptr, dx->step,
(short*)dy->data.ptr, dy->step,
dst->data.ptr, dst->step,
size, (float)low_thresh,
(float)high_thresh, buffer ));
EXIT;
}*/
if
(
flags
&
CV_CANNY_L2_GRADIENT
)
{
{
Cv32suf
ul
,
uh
;
Cv32suf
ul
,
uh
;
ul
.
f
=
(
float
)
low_thresh
;
ul
.
f
=
(
float
)
low_thresh
;
...
@@ -119,21 +81,23 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -119,21 +81,23 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
high
=
cvFloor
(
high_thresh
);
high
=
cvFloor
(
high_thresh
);
}
}
buffer
.
allocate
(
(
size
.
width
+
2
)
*
(
size
.
height
+
2
)
+
(
size
.
width
+
2
)
*
3
*
sizeof
(
int
)
);
Size
size
=
src
.
size
();
int
i
,
j
,
k
,
mstep
=
size
.
width
+
2
,
cn
=
src
.
channels
();
mag_buf
[
0
]
=
(
int
*
)(
char
*
)
buffer
;
Mat
mask
(
size
.
height
+
2
,
mstep
,
CV_8U
);
mag_buf
[
1
]
=
mag_buf
[
0
]
+
size
.
width
+
2
;
memset
(
mask
.
ptr
<
uchar
>
(
0
),
1
,
mstep
);
mag_buf
[
2
]
=
mag_buf
[
1
]
+
size
.
width
+
2
;
memset
(
mask
.
ptr
<
uchar
>
(
size
.
height
+
1
),
1
,
mstep
);
map
=
(
uchar
*
)(
mag_buf
[
2
]
+
size
.
width
+
2
);
mapstep
=
size
.
width
+
2
;
maxsize
=
MAX
(
1
<<
10
,
size
.
width
*
size
.
height
/
10
);
Mat
mag
(
6
+
cn
,
mstep
,
CV_32S
);
stack
.
resize
(
maxsize
);
mag
=
Scalar
::
all
(
0
);
stack_top
=
stack_bottom
=
&
stack
[
0
];
int
*
mag_buf
[
3
]
=
{
mag
.
ptr
<
int
>
(
0
),
mag
.
ptr
<
int
>
(
1
),
mag
.
ptr
<
int
>
(
2
)
};
short
*
dxybuf
[
3
]
=
{
(
short
*
)
mag
.
ptr
<
int
>
(
3
),
(
short
*
)
mag
.
ptr
<
int
>
(
4
),
(
short
*
)
mag
.
ptr
<
int
>
(
5
)
};
int
*
mbuf
=
mag
.
ptr
<
int
>
(
6
);
memset
(
mag_buf
[
0
],
0
,
(
size
.
width
+
2
)
*
sizeof
(
int
)
);
int
maxsize
=
MAX
(
1
<<
10
,
size
.
width
*
size
.
height
/
10
);
memset
(
map
,
1
,
mapstep
);
std
::
vector
<
uchar
*>
stack
(
maxsize
);
memset
(
map
+
mapstep
*
(
size
.
height
+
1
),
1
,
mapstep
);
uchar
**
stack_top
,
**
stack_bottom
;
stack_top
=
stack_bottom
=
&
stack
[
0
];
/* sector numbers
/* sector numbers
(Top-Left Origin)
(Top-Left Origin)
...
@@ -150,8 +114,6 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -150,8 +114,6 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
#define CANNY_PUSH(d) *(d) = (uchar)2, *stack_top++ = (d)
#define CANNY_PUSH(d) *(d) = (uchar)2, *stack_top++ = (d)
#define CANNY_POP(d) (d) = *--stack_top
#define CANNY_POP(d) (d) = *--stack_top
mag_row
=
cvMat
(
1
,
size
.
width
,
CV_32F
);
// calculate magnitude and angle of gradient, perform non-maxima supression.
// calculate magnitude and angle of gradient, perform non-maxima supression.
// fill the map with one of the following values:
// fill the map with one of the following values:
// 0 - the pixel might belong to an edge
// 0 - the pixel might belong to an edge
...
@@ -159,10 +121,10 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -159,10 +121,10 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
// 2 - the pixel does belong to an edge
// 2 - the pixel does belong to an edge
for
(
i
=
0
;
i
<=
size
.
height
;
i
++
)
for
(
i
=
0
;
i
<=
size
.
height
;
i
++
)
{
{
int
*
_mag
=
mag_buf
[(
i
>
0
)
+
1
]
+
1
;
int
*
_mag
=
mag_buf
[(
i
>
0
)
+
1
]
+
1
;
float
*
_magf
=
(
float
*
)
_mag
;
float
*
_magf
=
(
float
*
)
_mag
;
const
short
*
_dx
=
(
short
*
)(
dx
->
data
.
ptr
+
dx
->
step
*
i
)
;
const
short
*
_dx
,
*
_dy
;
const
short
*
_dy
=
(
short
*
)(
dy
->
data
.
ptr
+
dy
->
step
*
i
)
;
short
*
_ddx
,
*
_ddy
;
uchar
*
_map
;
uchar
*
_map
;
int
x
,
y
;
int
x
,
y
;
ptrdiff_t
magstep1
,
magstep2
;
ptrdiff_t
magstep1
,
magstep2
;
...
@@ -170,45 +132,71 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -170,45 +132,71 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
if
(
i
<
size
.
height
)
if
(
i
<
size
.
height
)
{
{
_mag
[
-
1
]
=
_mag
[
size
.
width
]
=
0
;
_dx
=
dx
.
ptr
<
short
>
(
i
);
_dy
=
dy
.
ptr
<
short
>
(
i
);
_ddx
=
dxybuf
[(
i
>
0
)
+
1
];
_ddy
=
_ddx
+
size
.
width
;
if
(
!
(
flags
&
CV_CANNY_L2_GRADIENT
)
)
if
(
cn
>
1
)
for
(
j
=
0
;
j
<
size
.
width
;
j
++
)
_mag
[
j
]
=
abs
(
_dx
[
j
])
+
abs
(
_dy
[
j
]);
/*else if( icvFilterSobelVert_8u16s_C1R_p != 0 ) // check for IPP
{
{
// use vectorized sqrt
_mag
=
mbuf
;
mag_row.data.fl = _magf;
_magf
=
(
float
*
)
_mag
;
for( j = 0; j < size.width; j++ )
}
if
(
!
L2gradient
)
for
(
j
=
0
;
j
<
size
.
width
*
cn
;
j
++
)
_mag
[
j
]
=
std
::
abs
(
_dx
[
j
])
+
std
::
abs
(
_dy
[
j
]);
else
{
for
(
j
=
0
;
j
<
size
.
width
*
cn
;
j
++
)
{
{
x
=
_dx
[
j
];
y
=
_dy
[
j
];
x
=
_dx
[
j
];
y
=
_dy
[
j
];
_magf[j] =
(float)((double)x*x + (double
)y*y);
_magf
[
j
]
=
sqrtf
((
float
)
x
*
x
+
(
float
)
y
*
y
);
}
}
cvPow( &mag_row, &mag_row, 0.5 );
}
}*/
else
if
(
cn
>
1
)
{
{
_mag
=
mag_buf
[(
i
>
0
)
+
1
]
+
1
;
for
(
j
=
0
;
j
<
size
.
width
;
j
++
)
for
(
j
=
0
;
j
<
size
.
width
;
j
++
)
{
{
x
=
_dx
[
j
];
y
=
_dy
[
j
];
_mag
[
j
]
=
mbuf
[(
j
+
1
)
*
cn
];
_magf
[
j
]
=
(
float
)
std
::
sqrt
((
double
)
x
*
x
+
(
double
)
y
*
y
);
_ddx
[
j
]
=
_dx
[
j
*
cn
];
_ddy
[
j
]
=
_dy
[
j
*
cn
];
}
for
(
k
=
1
;
k
<
cn
;
k
++
)
{
for
(
j
=
0
;
j
<
size
.
width
;
j
++
)
if
(
mbuf
[(
j
+
1
)
*
cn
+
k
]
>
_mag
[
j
]
)
{
_mag
[
j
]
=
mbuf
[(
j
+
1
)
*
cn
+
k
];
_ddx
[
j
]
=
_dx
[
j
*
cn
+
k
];
_ddy
[
j
]
=
_dy
[
j
*
cn
+
k
];
}
}
}
}
}
}
else
else
memset
(
_mag
-
1
,
0
,
(
size
.
width
+
2
)
*
sizeof
(
int
)
);
{
for
(
j
=
0
;
j
<
size
.
width
;
j
++
)
_ddx
[
j
]
=
_dx
[
j
];
_ddy
[
j
]
=
_dy
[
j
];
}
_mag
[
-
1
]
=
_mag
[
size
.
width
]
=
0
;
}
else
memset
(
_mag
-
1
,
0
,
(
size
.
width
+
2
)
*
sizeof
(
_mag
[
0
])
);
// at the very beginning we do not have a complete ring
// at the very beginning we do not have a complete ring
// buffer of 3 magnitude rows for non-maxima suppression
// buffer of 3 magnitude rows for non-maxima suppression
if
(
i
==
0
)
if
(
i
==
0
)
continue
;
continue
;
_map
=
map
+
mapstep
*
i
+
1
;
_map
=
&
mask
.
at
<
uchar
>
(
i
,
1
)
;
_map
[
-
1
]
=
_map
[
size
.
width
]
=
1
;
_map
[
-
1
]
=
_map
[
size
.
width
]
=
1
;
_mag
=
mag_buf
[
1
]
+
1
;
// take the central row
_mag
=
mag_buf
[
1
]
+
1
;
// take the central row
_dx
=
(
short
*
)(
dx
->
data
.
ptr
+
dx
->
step
*
(
i
-
1
))
;
_dx
=
dxybuf
[
1
]
;
_dy
=
(
short
*
)(
dy
->
data
.
ptr
+
dy
->
step
*
(
i
-
1
))
;
_dy
=
_dx
+
size
.
width
;
magstep1
=
mag_buf
[
2
]
-
mag_buf
[
1
];
magstep1
=
mag_buf
[
2
]
-
mag_buf
[
1
];
magstep2
=
mag_buf
[
0
]
-
mag_buf
[
1
];
magstep2
=
mag_buf
[
0
]
-
mag_buf
[
1
];
...
@@ -216,7 +204,7 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -216,7 +204,7 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
if
(
(
stack_top
-
stack_bottom
)
+
size
.
width
>
maxsize
)
if
(
(
stack_top
-
stack_bottom
)
+
size
.
width
>
maxsize
)
{
{
int
sz
=
(
int
)(
stack_top
-
stack_bottom
);
int
sz
=
(
int
)(
stack_top
-
stack_bottom
);
maxsize
=
MAX
(
maxsize
*
3
/
2
,
maxsize
+
8
);
maxsize
=
MAX
(
maxsize
*
3
/
2
,
maxsize
+
size
.
width
);
stack
.
resize
(
maxsize
);
stack
.
resize
(
maxsize
);
stack_bottom
=
&
stack
[
0
];
stack_bottom
=
&
stack
[
0
];
stack_top
=
stack_bottom
+
sz
;
stack_top
=
stack_bottom
+
sz
;
...
@@ -232,8 +220,8 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -232,8 +220,8 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
int
s
=
x
^
y
;
int
s
=
x
^
y
;
int
m
=
_mag
[
j
];
int
m
=
_mag
[
j
];
x
=
abs
(
x
);
x
=
std
::
abs
(
x
);
y
=
abs
(
y
);
y
=
std
::
abs
(
y
);
if
(
m
>
low
)
if
(
m
>
low
)
{
{
int
tg22x
=
x
*
TG22
;
int
tg22x
=
x
*
TG22
;
...
@@ -245,7 +233,7 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -245,7 +233,7 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
{
{
if
(
m
>
_mag
[
j
-
1
]
&&
m
>=
_mag
[
j
+
1
]
)
if
(
m
>
_mag
[
j
-
1
]
&&
m
>=
_mag
[
j
+
1
]
)
{
{
if
(
m
>
high
&&
!
prev_flag
&&
_map
[
j
-
m
ap
step
]
!=
2
)
if
(
m
>
high
&&
!
prev_flag
&&
_map
[
j
-
mstep
]
!=
2
)
{
{
CANNY_PUSH
(
_map
+
j
);
CANNY_PUSH
(
_map
+
j
);
prev_flag
=
1
;
prev_flag
=
1
;
...
@@ -259,7 +247,7 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -259,7 +247,7 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
{
{
if
(
m
>
_mag
[
j
+
magstep2
]
&&
m
>=
_mag
[
j
+
magstep1
]
)
if
(
m
>
_mag
[
j
+
magstep2
]
&&
m
>=
_mag
[
j
+
magstep1
]
)
{
{
if
(
m
>
high
&&
!
prev_flag
&&
_map
[
j
-
m
ap
step
]
!=
2
)
if
(
m
>
high
&&
!
prev_flag
&&
_map
[
j
-
mstep
]
!=
2
)
{
{
CANNY_PUSH
(
_map
+
j
);
CANNY_PUSH
(
_map
+
j
);
prev_flag
=
1
;
prev_flag
=
1
;
...
@@ -274,7 +262,7 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -274,7 +262,7 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
s
=
s
<
0
?
-
1
:
1
;
s
=
s
<
0
?
-
1
:
1
;
if
(
m
>
_mag
[
j
+
magstep2
-
s
]
&&
m
>
_mag
[
j
+
magstep1
+
s
]
)
if
(
m
>
_mag
[
j
+
magstep2
-
s
]
&&
m
>
_mag
[
j
+
magstep1
+
s
]
)
{
{
if
(
m
>
high
&&
!
prev_flag
&&
_map
[
j
-
m
ap
step
]
!=
2
)
if
(
m
>
high
&&
!
prev_flag
&&
_map
[
j
-
mstep
]
!=
2
)
{
{
CANNY_PUSH
(
_map
+
j
);
CANNY_PUSH
(
_map
+
j
);
prev_flag
=
1
;
prev_flag
=
1
;
...
@@ -289,11 +277,16 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -289,11 +277,16 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
_map
[
j
]
=
(
uchar
)
1
;
_map
[
j
]
=
(
uchar
)
1
;
}
}
// scroll the ring buffer
// scroll the ring buffer
s
_mag
=
mag_buf
[
0
];
_mag
=
mag_buf
[
0
];
mag_buf
[
0
]
=
mag_buf
[
1
];
mag_buf
[
0
]
=
mag_buf
[
1
];
mag_buf
[
1
]
=
mag_buf
[
2
];
mag_buf
[
1
]
=
mag_buf
[
2
];
mag_buf
[
2
]
=
_mag
;
mag_buf
[
2
]
=
_mag
;
_ddx
=
dxybuf
[
0
];
dxybuf
[
0
]
=
dxybuf
[
1
];
dxybuf
[
1
]
=
dxybuf
[
2
];
dxybuf
[
2
]
=
_ddx
;
}
}
// now track the edges (hysteresis thresholding)
// now track the edges (hysteresis thresholding)
...
@@ -315,40 +308,39 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
...
@@ -315,40 +308,39 @@ CV_IMPL void cvCanny( const void* srcarr, void* dstarr,
CANNY_PUSH
(
m
-
1
);
CANNY_PUSH
(
m
-
1
);
if
(
!
m
[
1
]
)
if
(
!
m
[
1
]
)
CANNY_PUSH
(
m
+
1
);
CANNY_PUSH
(
m
+
1
);
if
(
!
m
[
-
m
ap
step
-
1
]
)
if
(
!
m
[
-
mstep
-
1
]
)
CANNY_PUSH
(
m
-
m
ap
step
-
1
);
CANNY_PUSH
(
m
-
mstep
-
1
);
if
(
!
m
[
-
m
ap
step
]
)
if
(
!
m
[
-
mstep
]
)
CANNY_PUSH
(
m
-
m
ap
step
);
CANNY_PUSH
(
m
-
mstep
);
if
(
!
m
[
-
m
ap
step
+
1
]
)
if
(
!
m
[
-
mstep
+
1
]
)
CANNY_PUSH
(
m
-
m
ap
step
+
1
);
CANNY_PUSH
(
m
-
mstep
+
1
);
if
(
!
m
[
m
ap
step
-
1
]
)
if
(
!
m
[
mstep
-
1
]
)
CANNY_PUSH
(
m
+
m
ap
step
-
1
);
CANNY_PUSH
(
m
+
mstep
-
1
);
if
(
!
m
[
m
ap
step
]
)
if
(
!
m
[
mstep
]
)
CANNY_PUSH
(
m
+
m
ap
step
);
CANNY_PUSH
(
m
+
mstep
);
if
(
!
m
[
m
ap
step
+
1
]
)
if
(
!
m
[
mstep
+
1
]
)
CANNY_PUSH
(
m
+
m
ap
step
+
1
);
CANNY_PUSH
(
m
+
mstep
+
1
);
}
}
// the final pass, form the final image
// the final pass, form the final image
for
(
i
=
0
;
i
<
size
.
height
;
i
++
)
for
(
i
=
0
;
i
<
size
.
height
;
i
++
)
{
{
const
uchar
*
_map
=
ma
p
+
mapstep
*
(
i
+
1
)
+
1
;
const
uchar
*
_map
=
ma
sk
.
ptr
<
uchar
>
(
i
+
1
)
+
1
;
uchar
*
_dst
=
dst
->
data
.
ptr
+
dst
->
step
*
i
;
uchar
*
_dst
=
dst
.
ptr
<
uchar
>
(
i
)
;
for
(
j
=
0
;
j
<
size
.
width
;
j
++
)
for
(
j
=
0
;
j
<
size
.
width
;
j
++
)
_dst
[
j
]
=
(
uchar
)
-
(
_map
[
j
]
>>
1
);
_dst
[
j
]
=
(
uchar
)
-
(
_map
[
j
]
>>
1
);
}
}
}
}
void
cv
::
Canny
(
InputArray
image
,
OutputArray
_edges
,
void
cvCanny
(
const
CvArr
*
image
,
CvArr
*
edges
,
double
threshold1
,
double
threshold1
,
double
threshold2
,
double
threshold2
,
int
aperture_size
)
int
apertureSize
,
bool
L2gradient
)
{
{
Mat
src
=
image
.
getMat
(
);
cv
::
Mat
src
=
cv
::
cvarrToMat
(
image
),
dst
=
cv
::
cvarrToMat
(
edges
);
_edges
.
create
(
src
.
size
(),
CV_8U
);
CV_Assert
(
src
.
size
==
dst
.
size
&&
src
.
depth
()
==
CV_8U
&&
dst
.
type
()
==
CV_8U
);
CvMat
c_src
=
src
,
c_dst
=
_edges
.
getMat
();
cv
Canny
(
&
c_src
,
&
c_dst
,
threshold1
,
threshold2
,
cv
::
Canny
(
src
,
dst
,
threshold1
,
threshold2
,
aperture_size
&
255
,
apertureSize
+
(
L2gradient
?
CV_CANNY_L2_GRADIENT
:
0
)
);
(
aperture_size
&
CV_CANNY_L2_GRADIENT
)
!=
0
);
}
}
/* End of file. */
/* End of file. */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment