一、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. ubuntu16.04安装mrpt

    源码地址 https://github.com/MRPT/mrpt 安装教程 https://github.com/MRPT/mrpt/blob/master/README.md#32-build-f ...

  2. 使用ajax分页查询

    controller: /** * 查询所有用户/查找指定用户 * 分页+搜索 * */@RequestMapping("/findClientBySize")@ResponseB ...

  3. 【动态规划dp】青蛙的烦恼

    青蛙的烦恼(frog) 原文:https://blog.csdn.net/xyc1719/article/details/79844952 [题目描述] 池塘中有 n 片荷叶恰好围成了一个凸多边形,有 ...

  4. Python-第一章(开发基础)

    1.    机器语言 = 机器指令 = 二进制代码 汇编语言就是把二进制变成了英文,开发效率低. 编译型语言:C   C++   Delphi  ... 解译型语言:Python  php   jav ...

  5. KXO151 Programming & Problem Solving

    Page 1 of 9KXO151 Programming & Problem SolvingAIEN-SOU - 2019Assignment 2Deadline for Submissio ...

  6. JDK1.8 LongAdder 空间换时间: 比AtomicLong还高效的无锁实现

    我们知道,AtomicLong的实现方式是内部有个value 变量,当多线程并发自增,自减时,均通过CAS 指令从机器指令级别操作保证并发的原子性. // setup to use Unsafe.co ...

  7. 【Solution】MySQL 5.8 this is incompatible with sql_mode=only_full_group_by

    [42000][1055] Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated colu ...

  8. AIX stack_hard参数

    OS:AIX 7.1 root.oracle.grid用户查看资源限制,其中stack受限,需要在/etc/security/limits中增加stack_hard = -1,受硬限制限制! [ora ...

  9. linux中巧用ctrl-z后台运行程序

    我们知道后台运行任务时,可以用 () 和 &,但是有的时候我们会忘记加&,对于执行需要很长时间的任务来说,Ctrl+Z可能是一个比较好的把任务转入后台的方法. 当我们按下Ctrl+Z时 ...

  10. 如何通过轮询实现session自动注销

    每个用户在访问完网站后,经常会忽略注销账户,session默认存在的时间为30分钟,因此如果需要立即关闭session而又不用麻烦用户则可以通过轮询的方法来实现. 以下通过代码的讲解: xml配置文件 ...