#
include
"stdafx.h"
#
include
"opencv2/core/core.hpp"
#
include
"opencv2/highgui/highgui.hpp"
#
include
"opencv2/imgproc/imgproc.hpp"
#
include
<iostream
>
#
include
<stdio.h
>
#
include
<stdlib.h
>
#
include
<math.h
>
#
include
"GOCVHelper.h"
using
namespace cv;
using
namespace std;
using
namespace GO;
RNG rng2(
12345);
//根据轮廓的圆的特性进行选择
vector
<VP
> selectShapeCircularity(Mat src,Mat
& draw,vector
<VP
> contours,
float minvalue,
float maxvalue);
vector
<VP
> selectShapeCircularity(vector
<VP
> contours,
float minvalue,
float maxvalue);
//计算轮廓的圆的特性
float calculateCircularity(VP contour);
//根据轮廓的圆的特性进行选择
vector
<VP
> selectShapeCircularity(Mat src,Mat
& draw,vector
<VP
> contours,
float minvalue,
float maxvalue){
vector
<VP
> result_contours;
draw
= Mat
:
:zeros(src.rows,src.cols,CV_8UC3);
for (
int i
=
0;i
<contours.size();i
++){
float fcompare
= calculateCircularity(contours[i]);
if (fcompare
>
=minvalue
&& fcompare
<
=maxvalue)
result_contours.push_back(contours[i]);
}
for (
int i
=
0;i
<result_contours.size();i
++){
Scalar color
= Scalar(rng2.uniform(
0,
255),rng2.uniform(
0,
255),rng2.uniform(
0,
255));
drawContours(draw,result_contours,i,color,
-
1);
}
return result_contours;
}
vector
<VP
> selectShapeCircularity(vector
<VP
> contours,
float minvalue,
float maxvalue){
vector
<VP
> result_contours;
for (
int i
=
0;i
<contours.size();i
++){
float fcompare
= calculateCircularity(contours[i]);
if (fcompare
>
=minvalue
&& fcompare
<
=maxvalue)
result_contours.push_back(contours[i]);
}
return result_contours;
}
//计算轮廓的圆的特性
float calculateCircularity(VP contour){
Point2f center;
float radius
=
0;
minEnclosingCircle((Mat)contour,center,radius);
//以最小外接圆半径作为数学期望,计算轮廓上各点到圆心距离的标准差
float fsum
=
0;
float fcompare
=
0;
for (
int i
=
0;i
<contour.size();i
++){
Point2f ptmp
= contour[i];
float fdistenct
= sqrt((
float)((ptmp.x
- center.x)
*(ptmp.x
- center.x)
+(ptmp.y
- center.y)
*(ptmp.y
-center.y)));
float fdiff
= abs(fdistenct
- radius);
fsum
= fsum
+ fdiff;
}
fcompare
= fsum
/(
float)contour.size();
return fcompare;
}
int _tmain(
int argc, _TCHAR
* argv[])
{
//读入灰度的手部图像
Mat src
= imread(
"e:/sandbox/kong.jpg");
Mat dst
= src.clone();
Mat tmp;
Mat draw;
vector
<VP
> contours;
vector
<VP
> results;
vector
<Mat
> planes;
cvtColor(src,src,COLOR_BGR2HSV);
split(src,planes);
//v通道
tmp
= planes[
2].clone();
//去除毛刺
GaussianBlur(tmp,tmp,Size(
3,
3),
0);
//阈值处理
threshold(tmp,tmp,
100,
255,THRESH_OTSU);
//反向
bitwise_not(tmp,tmp);
//形态学
erode(tmp,tmp,Mat());
dilate(tmp,tmp,Mat());
//绘制联通区域
contours
= GO
:
:connection2(tmp,draw);
//轮廓分析(圆特性)
results
= selectShapeCircularity(tmp,draw,contours,
100,
500);
//原图绘制
drawContours(dst,results,
0,Scalar(
0,
0,
255),
3);
imshow(
"result",dst);
waitKey();
return
0;
}