一、PCA理论介绍

网上已经有许多介绍pca原理的博客,这里就不重复介绍了。详情可参考

http://blog.csdn.net/zhongkelee/article/details/44064401

计算过程

数据互换

二、opencv代码

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std; void calcPCAOrientation(vector<Point>&pts, Mat &image){
int size = static_cast<int>(pts.size());//static_cast强制类型转换
Mat data_pts = Mat(size,,CV_64FC1);//size个对象,2个维度(即平面坐标x,y)
for (int i = ; i < size; i++)
{
data_pts.at<double>(i, ) = pts[i].x;
data_pts.at<double>(i, ) = pts[i].y;
}
//执行PCA的一系列步骤:样本数据-均值,算协方差,算特征值和特征向量……
PCA pca(data_pts, Mat(), CV_PCA_DATA_AS_ROW);
//获取均值(中心)位置
Point cnt = Point(static_cast<int>(pca.mean.at<double>(, )),
static_cast<int>(pca.mean.at<double>(, )));
circle(image,cnt,,Scalar(,,),,,); vector<Point2d>vecs();
vector<double>vals();
for (int i = ; i < ; i++)
{
vals[i] = pca.eigenvalues.at<double>(i, );//特征值
cout << "第" << i << "个特征值:" << vals[i]<<endl;
vecs[i] = Point2d(pca.eigenvectors.at<double>(i, ), //特征向量
(pca.eigenvectors.at<double>(i, )));
}
Point p1 = cnt + 0.02*Point(static_cast<int>(vecs[].x*vals[]), static_cast<int>(vecs[].y*vals[]));
Point p2 = cnt - 0.05*Point(static_cast<int>(vecs[].x*vals[]), static_cast<int>(vecs[].y*vals[])); line(image, cnt, p1, Scalar(, , ), , , );
line(image, cnt, p2, Scalar(, , ), , , ); double angle = atan2(vecs[].y,vecs[].x);
cout << "angle:" << * (angle / CV_PI)<<endl;
} void main()
{
Mat src = imread("E://2.jpg");
imshow("src", src);
Mat gray, binary;
cvtColor(src, gray,CV_BGR2GRAY);
threshold(gray, binary,,, THRESH_BINARY|THRESH_OTSU);//自动阈值:OTSU找到一个它认为最好的阈值
//imshow("binary", binary); //轮廓提取
vector<Vec4i>hierarchy;
vector<vector<Point>>contours;
findContours(binary, contours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE);//查找所有轮廓,存储所有轮廓点
Mat result = src.clone();//复制,不随原图改变
for (int i = ; i < contours.size(); i++)
{
double area = contourArea(contours[i]);
if (area>1e5 || area < 1e2) continue;//面积大于10^5或者小于10^2的轮廓,不要
drawContours(result, contours, i, Scalar(, , ), , ); calcPCAOrientation(contours[i], result);//调用PCA
}
imshow("contours result", result); waitKey();
}

opencv学习之路(39)、PCA的更多相关文章

  1. opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH

    一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...

  2. Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

    在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...

  3. OpenCV 学习之路(1)

    OpenCV的第一个代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #i ...

  4. opencv学习之路(41)、人脸识别

    一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...

  5. opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量

    本文部分内容转自 https://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学概念 二.为什么需要协方差 三.协方差矩阵 注:上述协方差矩阵还需要除以 ...

  6. opencv学习之路(37)、运动物体检测(二)

    一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...

  7. opencv学习之路(36)、运动物体检测(一)

    一.简介 二.背景减法 图片说明 #include "opencv2/opencv.hpp"using namespace cv; void main() { Mat img1 = ...

  8. opencv学习之路(35)、SURF特征点提取与匹配(三)

    一.简介 二.opencv中的SURF算法接口 三.特征点匹配方法 四.代码 1.特征点提取 #include "opencv2/opencv.hpp" #include < ...

  9. opencv学习之路(34)、SIFT特征匹配(二)

    一.特征匹配简介 二.暴力匹配 1.nth_element筛选 #include "opencv2/opencv.hpp" #include <opencv2/nonfree ...

随机推荐

  1. php删除文件夹

    function deldir($dir) { $dh=opendir($dir); while ($file=readdir($dh)) { if($file!="." & ...

  2. Python自动化培训第一周学习总结

    Python自动化培训第一周学习结束,看视频复习,把作业完成了. 总体来说,开卷有益. 首先,工具真是好东西,能够极大提升效率,也是人区别于动物所在.想起前任大领导对工具的不屑,本质也是对效率的不屑, ...

  3. 系统重启后,mr程序不生成当前时间段的MRx文件问题

    系统重启后,mr程序不生成当前时间段的MRx文件问题 2019-4-2 之前使用正常的MR程序,系统重启后无法生成MRE\MRO\MRS文件. 服务器有两个时钟:硬件时钟和系统时钟 硬件时钟从根本上讲 ...

  4. STA 463 Simple Linear Regression Report

    STA 463 Simple Linear Regression ReportSpring 2019 The goal of this part of the project is to perfor ...

  5. IntelliJ IDEA 指定Java编译版本

    在IntelliJ IDEA 15中使用Maven时,IDEA将默认的编译版本.源码版本设置为jdk5.编译项目的时候出现警告:”Warning:Java: 源值1.5已过时, 将在未来所有发行版中删 ...

  6. idea将maven项目打包成war包

    1.单击红色方框处 2.在IDEA右侧出现maven project选项 3.单击maven project选项,出现Spring MVC Basic Feature菜单,选择 其中的Lifecycl ...

  7. Linux基础命令2

    1.修改网络状态: 1).Cd  /etc/sysconfig/network-scripts/network-scripts 2).vi ifcfg-eth0   编辑  onboot=yes: 3 ...

  8. js导航栏单击事件背景颜色变换

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  9. what's the 白盒测试

    what's the 白盒测试 白盒测试又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试.盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的.白盒要考虑测试 ...

  10. c#之AES加密解密

    .Net已封装好算法,直接调用即可,代码如下: 转载请注明出处:https://www.cnblogs.com/jietian331/p/9707771.html using System; usin ...