一、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. Python 学习笔记7 条件语句 If

    Python中条件语句if 是通过一条或者多条的执行语句的结果,来判断是否执行其包含的代码块. 通常会配合else.elif一起使用,达到根据条件进行多个代码块的执行操作. 简单的if score = ...

  2. [ipsec][crypto] IKEv2的协商交互分析

    一: 无论协商了什么样的加密算法.DH都交换一块长度为32byte的内存,作为key. IKE和esp的key,分别基于这块内存生成. 二: 当esp的算法协商没有指定dh group时,rekey将 ...

  3. PySe-008-开启浏览器的手机模式

    以 Chrome 为例,通过设置 chromeoption 的参数即可实现启动浏览器后,开启手机模式.相应设置的源代码如下所示: chromeOptions = webdriver.ChromeOpt ...

  4. Spring Boot web简介及原理 day04

    一.SpringBoot创建web开发(三部曲) 1.快速构建SpringBoot项目,并以jar包的形式构建 2.选择对应的功能模块 (选定场景,配置少量的配置就可运行,不配置有默认值) 3.编写自 ...

  5. 44-0-STM32的CAN外设

    1.RS-485 协议主要是把 RS-232 的信号改进成差分信号,从而大大提高了抗干扰特性: 在 RS-485 通讯网络中,节点中的串口控制器使用 RX 与 TX信号线连接到收发器上,而收发器通过差 ...

  6. Android系统架构与系统源码目录

    前言 技术博客终于可以恢复正常的更新速度了,原因是我编写的进阶书籍的初稿已经完成,窃以为它将会是Android应用书籍中最有深度的一本,可以说是<Android开发艺术探索>的姊妹篇.在这 ...

  7. git reset与git revert的区别

    http://alpha-blog.wanglianghome.org/2010/07/30/git-partial-rollback/ reset(版本撤回) 格式 git reset [-q] [ ...

  8. ESP8266 RTOS SDK烧写环境构建

    简介 esptool是一个Python软件程序,适用于ESP8266等一系列芯片的烧写,灵活高效. 环境构建 在官网下载安装最新2.7版python (linux和os x一般会自带python2.7 ...

  9. 关于网站的一些js和css常见问题的记录

    1. 文字超过宽度,给这个后面超过的文字用...来表示  white-space: nowrap;

  10. eclipse中tomcat的add and Remove找不到项目

    在我们运行项目前,都需要将项目部署到tomcat上,但是有时我们会遇到这种情况:项目明明存在,但是eclipse中tomcat的add and remove找不到项目,无法部署,那么这个问题该如何解决 ...