opencv PCA 求轮廓的形心

PCA的详细功能不是很了解。但是,发现用它来求形心非常好。输入为findcontours之后的轮廓点,输出为形心的坐标。

话不多说,上代码。

//开发环境,opencv3.1.0+vs2013

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

cv::Point chao_getCentroid(std::vector<cv::Point> list);//得到形心坐标,

int main()
{
	Mat src = imread("1.png");
	if (!src.data || src.empty())
		{
			cout << "Problem loading image!!!" << endl;
			return -1;
		}

	imshow("src", src);
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	Mat bw;
	threshold(gray, bw, 50, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
	vector<Vec4i> hierarchy;
	vector<vector<Point> > contours;
	Mat bw_back = 255 - bw;
	findContours(bw_back, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
	for (size_t i = 0; i < contours.size(); ++i)
	{
		
		drawContours(src, contours, static_cast<int>(i), Scalar(0, 0, 255), 2, 8, hierarchy, 0);
		
		Point center = chao_getCentroid(contours[i]);
		circle(src,center,5,Scalar(0,0,255),-1,8);
	}
	imshow("output", src);
    waitKey(0);
	return 0;
}

cv::Point chao_getCentroid(std::vector<cv::Point> list)
{
	Point result_point(0,0);
	//Construct a buffer used by the pca analysis
	int sz = static_cast<int>(list.size());
	Mat data_pts = Mat(sz, 2, CV_64FC1);
	for (int i = 0; i < data_pts.rows; ++i)
	{
		data_pts.at<double>(i, 0) = list[i].x;
		data_pts.at<double>(i, 1) = list[i].y;
	}

	//Perform PCA analysis
	PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW);

	//Store the center of the object
	Point cntr = Point(static_cast<int>(pca_analysis.mean.at<double>(0, 0)),
		static_cast<int>(pca_analysis.mean.at<double>(0, 1)));
	return cntr;
}
效果如下图所示




关于PCA详细使用,可参考官方例程,opencv3.1.0\sources\samples\cpp\tutorial_code\ml\introduction_to_pca文件夹下的introduction_to_pca.cpp文件

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV中的PCA是指主成分分析(Principal Component Analysis)。PCA是一种常用的降维技术,用于将高维数据转换为低维表示,同时保留数据的主要特征。在OpenCV中,可以使用cv::PCA类来进行PCA计算。 PCA的计算过程包括以下几个步骤: 1. 组织数据集:将数据集按照样本放置在一个矩阵中,每一行代表一个样本,每一列代表一个特征。 2. 计算经验均值:计算数据集每个特征的均值,得到一个均值向量。 3. 计算与均值的偏差:将每个样本减去均值向量,得到一个偏差矩阵。 4. 寻找协方差矩阵:计算偏差矩阵的协方差矩阵。 5. 协方差矩阵的特征向量和特征值:对协方差矩阵进行特征值分解,得到特征向量矩阵和特征值矩阵。 通过PCA计算得到的特征向量矩阵可以用于降维、特征提取等任务。在OpenCV中,可以使用cv::PCA类的成员函数来进行PCA计算,并可以通过成员变量获取计算结果。 如果你需要使用OpenCV进行PCA计算,可以参考相关的文档和示例代码。\[1\]提供了关于PCA的介绍和源代码解释,\[2\]和\[3\]提供了关于特征向量和特征值的计算的相关信息。 #### 引用[.reference_title] - *1* *2* *3* [OpenCV PCA介绍](https://blog.csdn.net/qq_28087491/article/details/126478846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值