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 analysisint 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 analysisPCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW);//Store the center of the objectPoint 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文件

opencv PCA 求轮廓的形心相关推荐

  1. opencv之求轮廓的凸包

    import cv2 import numpy as npimage = cv2.imread("C:\\Users\\PC\\Desktop\\22.bmp") img = im ...

  2. OpenCV的minEllipse函数(求轮廓的外接椭圆)一定要判断输入点是否大于5个

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 如题,如果不判断,是要报错的,如下图所示: Op ...

  3. OpenCV+python:轮廓发现与对象测量

    1,轮廓发现 当通过阈值分割提取到图像中的目标物体后,就需要通过边缘检测来提取目标物体的轮廓,使用这两种方法基本能够确定物体的边缘或者前景.接下来,通常需要做的是拟合这些边缘的前景,如拟合出包含前景或 ...

  4. OpenCV-Python 中文教程15——OpenCV 中的轮廓

    OpenCV-Python 中文教程15--OpenCV 中的轮廓 一.初识轮廓 目标 • 理解什么是轮廓 • 学习找轮廓,绘制轮廓等 • 函数: cv2.findContours(), cv2.dr ...

  5. 基于OpenCV的视频轮廓识别与图像匹配【手影识别】

    本人初学OpenCV做的项目,这个项目初始是用于手影识别,即使用摄像头拍摄,双手在摄像头前做出相关手影动作,程序使用匹配算法识别出用户正在模仿的动物,并触发对应事件.其实也可以识别并匹配其他内容(由模 ...

  6. OpenCV检测图像轮廓

    轮廓只不过是图像中连接的曲线,或者图像中连通部分的边界,轮廓通常以图像中的边缘来计算,但是,边缘和轮廓的区别在于轮廓是闭合的,而边缘可以是任意的.边缘的概念局限于点及其邻域像素,轮廓将目标作为整体进行 ...

  7. 计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours()介绍

    计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours(),用于轮廓的绘制或填充. cv2.drawContours(image, contours, contourIdx, co ...

  8. 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍

    计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours说明如下: 示例代码: #!/usr/bin/env python3import cv2image = cv2.imread( ...

  9. OpenCV PCA提取对象的方向的实例(附完整代码)

    OpenCV PCA提取对象的方向的实例 OpenCV PCA提取对象的方向的实例 OpenCV PCA提取对象的方向的实例 #include "opencv2/core.hpp" ...

最新文章

  1. Fiddler抓包工具总结(转)
  2. 5分钟教程,手把手带你安装使用抓包神器:Whistle ,内含精选爬虫资料
  3. 实现量子计算,我们还需要做些什么?
  4. mysql 安装以及配置
  5. Unet实现图像分割(一)
  6. 解决Missing artifact com.sun:tools:jar:1.5.0方法
  7. 【AC Saber】二分
  8. Java基础课程---权限修饰符
  9. python发送文件_Python实现基于HTTP文件传输实例
  10. weblogic启动失败案例(root启动引起的权限问题)
  11. 计算机录音机应用程序在哪,windows7如何给电脑录音 windows7录音机在哪
  12. linux自学笔记--DNS服务器
  13. VUE常用插件库总结
  14. ORACLE索引分裂(enq: TX - index contention)
  15. 190824-英雄联盟传记爬取
  16. js find(),findIndex()方法的使用
  17. 前端森林:万物皆可快速上手之Electron(第一弹)
  18. Unity 计算角度和方向
  19. 微信网页Audio自动播放(IOS安卓)
  20. ThinkPad物理机安装Linux系统实战企业级项目之CentOS安装

热门文章

  1. day02 设计模式-外观模式
  2. 商城项目-实现商品分类查询
  3. 暴涨买卖有望趋势线顶底选股公式 通达信波段趋势顶底指标
  4. notepad html5 mac,用notepad++将DPL格式转为通用格式
  5. [iOS开发]AFNetworking源码学习
  6. 深度强化学习主流算法介绍(二):DPG系列
  7. JAVA实现输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
  8. 台式电脑没鼠标怎么移动光标_没有鼠标怎么移动光标【设置措施】
  9. long与int转换线上问题解决(必看)
  10. iSubtitle for Mac(视频字幕制作软件)