IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCV笔记20 PCA -> 正文阅读

[人工智能]OpenCV笔记20 PCA

一、简介与实际应用

PCA 主要用于获取物体的主要方向以及对数据进行降维度处理。

PCA 的主要思想是在一堆维度的数据中找到能体现特性的几个重要的特性,从而降低计算量,把那些不特别重要的属性从这些数据中剔除掉。

二、数学原理推导

?

?

?

三、?opencv中的PCA类

PCA::PCA(InputArray data, InputArray mean, int flags, int maxComponents=0)
data           //输入数据(可以是轮廓点集)
mean           //数据零均值,为空(Mat())时自动计算
flag           //表示数据提供的方式(0表示按行输入,1表示按列输入)
maxComponents  //保留多少特征值(默认全保留)

  • ?原图像,投影到新的空间
Mat PCA::project(InputArray vec) const
  • 进行project之后的数据,反映摄到原始图像
Mat PCA::backProject(InputArray vec) const

变量值有:mean--------原始数据的均值

? ? ? ? ? ? ? ? ? eigenvalues--------协方差矩阵的特征值

? ? ? ? ? ? ? ? ? eigenvectors--------特征向量

四、代码显示

opencv实战——PCA算法的应用 - 唯有自己强大 - 博客园


#if  1 //  PCA算法 算法
//获得构建的主要方向
double getOrientation(vector<Point>& contour, Mat& img)
{
	//构建pca数据。这里做的是将轮廓点的x和y作为两个维压到data_pts中去。
	Mat data_pts = Mat(contour.size(), 2, CV_64FC1);//使用mat来保存数据,也是为了后面pca处理需要
	for (int i = 0; i < data_pts.rows; ++i)
	{
		data_pts.at<double>(i, 0) = contour[i].x;
		data_pts.at<double>(i, 1) = contour[i].y;
	}
	//执行PCA分析
	PCA pca_analysis(data_pts, Mat(), 0);
	//获得最主要分量(均值),在本例中,对应的就是轮廓中点,也是图像中点
	Point pos = Point(pca_analysis.mean.at<double>(0, 0), pca_analysis.mean.at<double>(0, 1));
	//存储特征向量和特征值
	vector<Point2d> eigen_vecs(2);
	vector<double> eigen_val(2);
	for (int i = 0; i < 2; ++i)
	{
		eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), pca_analysis.eigenvectors.at<double>(i, 1));
		eigen_val[i] = pca_analysis.eigenvalues.at<double>(i, 0);//在轮廓/图像中点绘制小圆
		circle(img, pos, 3, CV_RGB(255, 0, 255), 2);
		//计算出直线,在主要方向上绘制直线(每个特征向量乘以其特征值并转换为平均位置。有一个 0.02 的缩放系数,它只是为了确保矢量适合图像并且没有 10000 像素的长度)
		line(img, pos, pos + 0.02 * Point(eigen_vecs[0].x * eigen_val[0], eigen_vecs[0].y * eigen_val[0]), CV_RGB(255, 255, 0));
		line(img, pos, pos + 0.02 * Point(eigen_vecs[1].x * eigen_val[1], eigen_vecs[1].y * eigen_val[1]), CV_RGB(0, 255, 255));
		//最终计算并返回一个最强的(即具有最大特征值)的特征向量的角度
		return atan2(eigen_vecs[0].y, eigen_vecs[0].x);
	}
}
int main(int argc, char** argv)
{

	Mat src = imread("C:\\Users\\19473\\Desktop\\opencv_images\\600.png");
	imshow("输入图像", src);
	Mat gray, binary;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	//阈值处理
	threshold(gray, binary, 150, 255, THRESH_BINARY);
	imshow("二值化", binary);
	//1 、寻找轮廓
	vector<vector<Point> > contours;
	vector<Vec4i> hierarchy;
	findContours(binary, contours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE);
	//轮廓分析,找到工件
	for (size_t i = 0; i < contours.size(); ++i)
	{
		//计算轮廓大小
		double area = contourArea(contours[i]);
		//去除过小或者过大的轮廓区域(科学计数法表示le2表示1X10的2次方)
		if (area < 1e2 || 1e4 < area) continue;
		//绘制轮廓
		drawContours(src, contours, i, Scalar(0, 0, 255), 2, 8, hierarchy, 0);
		//寻找每一个轮廓的方向
		double angle = getOrientation(contours[i], src);
		cout << angle << endl;
	}

	imshow("结果", src);
	waitKey(0);
	return 0;
}

#endif

?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:43:59  更:2022-02-07 13:45:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/25 11:52:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码