//获得构建的主要方向
double getOrientation(vector
<Point
>
&pts, Mat
&img)
{
//构建pca数据。这里做的是将轮廓点的x和y作为两个维压到data_pts中去。
Mat data_pts
= Mat(pts.size(),
2, CV_64FC1);
//使用mat来保存数据,也是为了后面pca处理需要
for (
int i
=
0; i
< data_pts.rows;
++i)
{
data_pts.at
<
double
>(i,
0)
= pts[i].x;
data_pts.at
<
double
>(i,
1)
= pts[i].y;
}
//执行PCA分析
PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW);
//获得最主要分量,在本例中,对应的就是轮廓中点,也是图像中点
Point pos
= Point(pca_analysis.mean.at
<
double
>(
0,
0),pca_analysis.mean.at
<
double
>(
0,
1));
//存储特征向量和特征值
vector
<Point2d
> eigen_vecs(
2);
vector
<
double
> eigen_val(
2);
for (
int i
=
0; i
<
2;
++i)
{
eigen_vecs[i]
= Point2d(pca_analysis.eigenvectors.at
<
double
>(i,
0),pca_analysis.eigenvectors.at
<
double
>(i,
1));
eigen_val[i]
= pca_analysis.eigenvalues.at
<
double
>(i,
0);
//注意,这个地方原代码写错了
}
//在轮廓/图像中点绘制小圆
circle(img, pos,
3, CV_RGB(
255,
0,
255),
2);
//计算出直线,在主要方向上绘制直线
line(img, pos, pos
+
0.
02
* Point(eigen_vecs[
0].x
* eigen_val[
0], eigen_vecs[
0].y
* eigen_val[
0]) , CV_RGB(
255,
255,
0));
line(img, pos, pos
+
0.
02
* Point(eigen_vecs[
1].x
* eigen_val[
1], eigen_vecs[
1].y
* eigen_val[
1]) , CV_RGB(
0,
255,
255));
//返回角度结果
return atan2(eigen_vecs[
0].y, eigen_vecs[
0].x);
}