opencv学习之路(39)、PCA
一、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的更多相关文章
- opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH
一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...
- Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练
在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...
- OpenCV 学习之路(1)
OpenCV的第一个代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #i ...
- opencv学习之路(41)、人脸识别
一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...
- opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量
本文部分内容转自 https://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学概念 二.为什么需要协方差 三.协方差矩阵 注:上述协方差矩阵还需要除以 ...
- opencv学习之路(37)、运动物体检测(二)
一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...
- opencv学习之路(36)、运动物体检测(一)
一.简介 二.背景减法 图片说明 #include "opencv2/opencv.hpp"using namespace cv; void main() { Mat img1 = ...
- opencv学习之路(35)、SURF特征点提取与匹配(三)
一.简介 二.opencv中的SURF算法接口 三.特征点匹配方法 四.代码 1.特征点提取 #include "opencv2/opencv.hpp" #include < ...
- opencv学习之路(34)、SIFT特征匹配(二)
一.特征匹配简介 二.暴力匹配 1.nth_element筛选 #include "opencv2/opencv.hpp" #include <opencv2/nonfree ...
随机推荐
- Android手机camera和IMU的标定
https://qingsimon.github.io/post/2018-12-28-android%E6%89%8B%E6%9C%BA%E7%9B%B8camera%E5%92%8Cimu%E7% ...
- 简述移动端开发前端和app间的关系
<p>前端页面嵌套进app内部,一般有时候会进行一些交互,类似于前端页面请求后台接口一样,通常会起一个前端开发人员和app开发人员会相互协定一个协议;双方就协议而言去进行请求接口和返回数据 ...
- webapi 利用webapiHelp和swagger生成接口文档
webapi 利用webapiHelp和swagger生成接口文档.均依赖xml(需允许项目生成注释xml) webapiHelp:微软技术自带,仅含有模块.方法.请求-相应参数的注释. swagge ...
- vue加载流程
首先加载main.js,main.js中new一个vue实例,这个实例中会有一个id="app"映射到app.vue,启动时候首页映射到index.html,其中<div i ...
- IAB303 Data Analytics Assessment Task
Assessment TaskIAB303 Data Analyticsfor Business InsightSemester I 2019Assessment 2 – Data Analytics ...
- windows 启动停止 java进程
本案例以 xxx.jar 为列子 我们一般启动的jar 在任务管理器中查看进程都是javaw.exe ,无法用命令来 kill,所以我们得给自己的java 进程设置个新 title 1: 首先 ...
- esp32固件烧录
正常使用IO0置空即可.烧录时需要en引脚接高电平,IO0接地,使用乐鑫的烧录工具烧录即可.注意如果启用wifi,供电一定要不小于500ma,普通的usb转ttl模块无法满足wifi启动的,被坑的好惨 ...
- css 修改svg图标的颜色(不修改fill)
给icon加样式 (利用原图标的阴影区域,同时将原图标移动超过之前父元素范围)filter: drop-shadow(red 80px 0);transform: translateX(-80px); ...
- 安卓demo
https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README-CN.md
- 搭建Sonar代码走查环境
1.下载SonarQube并解压(查看检测结果用) 2.根据自己系统下载SonarQube Runner(检测代码用,旧版名叫Sonar Scanner) 3.在自己要检测的工程目录下建立sonar- ...