一、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. LeetCode 50 - Pow(x, n) - [快速幂]

    实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 1: 输入: 2.00000, 10输出: 1024.00000 示例 2: 输入: 2.10000, 3输出: 9.26100 示例 ...

  2. docker安装,err:exit status 255,提示找不到虚拟机IP

    我遇到这个问题是因为,BIOS没有打开虚拟化技术,导致虚拟机无法成功创建,自然找不到IP. 解决: 1.进入BIOS,高级选项卡下,找到虚拟化技术开关,打开即可.具体做法,可搜网文. 2.删除原来自动 ...

  3. oracle学习笔记第三天

    --DML(Data Manipulation Language)--insert关键字 插入 ---语法1.元祖值式插入(一次插入一条记录)---格式:insert into 表名(列名1,列名2. ...

  4. 2019/4/22 kmp模板

    题目连接:传送门!!! 这里是从头到尾彻底理解KMP的一篇博客,写的非常好 :https://blog.csdn.net/v_JULY_v/article/details/7041827 题意:输入多 ...

  5. 流程控制:顺序结构: 代码默认从上到下依次执行 分支结构: 细分在分为如下 循环结构: while .. for ..

    # ### 流程控制: ''' 流程: 代码执行的过程 流程控制: 对代码执行的过程进行管控 顺序结构: 代码默认从上到下依次执行 分支结构: 细分在分为如下 循环结构: while .. for . ...

  6. CDIE2019中国数字化创新展暨首席信息官峰会上海站来袭~

    China Digital Innovation Expo & CIO Summit 2019是由Dot Connector(上海华昂商务咨询有限公司)主办的第五届聚焦中国技术领袖,探索创新, ...

  7. c++简单程序设计 实验一

    实验内容: 2-28 实现一个简单的菜单程序,运行时显示“Menu:A(dd) D(elete) S(ort) Q(uit),Selete one:”提示用户输入.A表示增加,D表示删除, S表示排序 ...

  8. nuxt 2

    原文出处: 

  9. 解决Qt下ssl出错的办法

    在使用 QNetworkAccessManager 时出现的ssl错误:qt.network.ssl: QSslSocket: cannot resolve SSL_set_psk_client_ca ...

  10. PAT (Basic Level) Practice (中文)1001 害死人不偿命的(3n+1)猜想

    1001 害死人不偿命的(3n+1)猜想 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下去,最后一 ...