Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
a278abdc
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a278abdc
编写于
8月 29, 2016
作者:
M
Maksim Shabunin
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #7140 from Asalle:fix-7136-Bounding_Box_explanation
上级
a21b8ed9
ec5ae4af
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
83 addition
and
14 deletion
+83
-14
doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.markdown
...rs/bounding_rects_circles/bounding_rects_circles.markdown
+43
-0
samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp
.../tutorial_code/ShapeDescriptors/generalContours_demo1.cpp
+40
-14
未找到文件。
doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.markdown
浏览文件 @
a278abdc
...
...
@@ -22,6 +22,49 @@ This tutorial code's is shown lines below. You can also download it from
Explanation
-----------
The main function is rather simple, as follows from the comments we do the following:
-# Open the image, convert it into grayscale and blur it to get rid of the noise.
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp setup
-# Create a window with header "Source" and display the source file in it.
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp createWindow
-# Create a trackbar on the source_window and assign a callback function to it
In general callback functions are used to react to some kind of signal, in our
case it's trackbar's state change.
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp taskbar
-# Explicit one-time call of
`thresh_callback`
is necessary to display
the "Contours" window simultaniously with the "Source" window.
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp callback00
-# Wait for user to close the windows.
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp waitForIt
The callback function
`thresh_callback`
does all the interesting job.
-# Writes to
`threshold_output`
the threshold of the grayscale picture (you can check out about thresholding @ref tutorial_threshold "here").
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp threshold
-# Finds contours and saves them to the vectors
`contour`
and
`hierarchy`
.
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp findContours
-# For every found contour we now apply approximation to polygons
with accuracy +-3 and stating that the curve must me closed.
After that we find a bounding rect for every polygon and save it to
`boundRect`
.
At last we find a minimum enclosing circle for every polygon and
save it to
`center`
and
`radius`
vectors.
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp allthework
We found everything we need, all we have to do is to draw.
-# Create new Mat of unsigned 8-bit chars, filled with zeros.
It will contain all the drawings we are going to make (rects and circles).
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp zeroMat
-# For every contour: pick a random color, draw the contour, the bounding rectangle and
the minimal enclosing circle with it,
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp forContour
-# Display the results: create a new window "Contours" and show everything we added to drawings on it.
@snippet samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp showDrawings
Result
------
...
...
samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp
浏览文件 @
a278abdc
...
...
@@ -25,22 +25,34 @@ void thresh_callback(int, void* );
*/
int
main
(
int
,
char
**
argv
)
{
/// Load source image and convert it to gray
//![setup]
/// Load source image
src
=
imread
(
argv
[
1
],
IMREAD_COLOR
);
/// Convert image to gray and blur it
cvtColor
(
src
,
src_gray
,
COLOR_BGR2GRAY
);
blur
(
src_gray
,
src_gray
,
Size
(
3
,
3
)
);
//![setup]
//![createWindow]
/// Create Window
const
char
*
source_window
=
"Source"
;
namedWindow
(
source_window
,
WINDOW_AUTOSIZE
);
imshow
(
source_window
,
src
);
//![createWindow]
//![taskbar]
createTrackbar
(
" Threshold:"
,
"Source"
,
&
thresh
,
max_thresh
,
thresh_callback
);
//![taskbar]
//![callback00]
thresh_callback
(
0
,
0
);
//![callback00]
//![waitForIt]
waitKey
(
0
);
//![waitForIt]
return
(
0
);
}
...
...
@@ -53,10 +65,15 @@ void thresh_callback(int, void* )
vector
<
vector
<
Point
>
>
contours
;
vector
<
Vec4i
>
hierarchy
;
//![threshold]
/// Detect edges using Threshold
threshold
(
src_gray
,
threshold_output
,
thresh
,
255
,
THRESH_BINARY
);
//![threshold]
//![findContours]
/// Find contours
findContours
(
threshold_output
,
contours
,
hierarchy
,
RETR_TREE
,
CHAIN_APPROX_SIMPLE
,
Point
(
0
,
0
)
);
//![findContours]
/// Approximate contours to polygons + get bounding rects and circles
vector
<
vector
<
Point
>
>
contours_poly
(
contours
.
size
()
);
...
...
@@ -64,15 +81,21 @@ void thresh_callback(int, void* )
vector
<
Point2f
>
center
(
contours
.
size
()
);
vector
<
float
>
radius
(
contours
.
size
()
);
//![allthework]
for
(
size_t
i
=
0
;
i
<
contours
.
size
();
i
++
)
{
approxPolyDP
(
Mat
(
contours
[
i
]),
contours_poly
[
i
],
3
,
true
);
{
approxPolyDP
(
Mat
(
contours
[
i
]),
contours_poly
[
i
],
3
,
true
);
boundRect
[
i
]
=
boundingRect
(
Mat
(
contours_poly
[
i
])
);
minEnclosingCircle
(
contours_poly
[
i
],
center
[
i
],
radius
[
i
]
);
}
//![allthework]
//![zeroMat]
/// Draw polygonal contour + bonding rects + circles
Mat
drawing
=
Mat
::
zeros
(
threshold_output
.
size
(),
CV_8UC3
);
//![zeroMat]
//![forContour]
for
(
size_t
i
=
0
;
i
<
contours
.
size
();
i
++
)
{
Scalar
color
=
Scalar
(
rng
.
uniform
(
0
,
255
),
rng
.
uniform
(
0
,
255
),
rng
.
uniform
(
0
,
255
)
);
...
...
@@ -80,8 +103,11 @@ void thresh_callback(int, void* )
rectangle
(
drawing
,
boundRect
[
i
].
tl
(),
boundRect
[
i
].
br
(),
color
,
2
,
8
,
0
);
circle
(
drawing
,
center
[
i
],
(
int
)
radius
[
i
],
color
,
2
,
8
,
0
);
}
//![forContour]
//![showDrawings]
/// Show in a window
namedWindow
(
"Contours"
,
WINDOW_AUTOSIZE
);
imshow
(
"Contours"
,
drawing
);
//![showDrawings]
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录