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 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 求轮廓的形心相关推荐
- opencv之求轮廓的凸包
import cv2 import numpy as npimage = cv2.imread("C:\\Users\\PC\\Desktop\\22.bmp") img = im ...
- OpenCV的minEllipse函数(求轮廓的外接椭圆)一定要判断输入点是否大于5个
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 如题,如果不判断,是要报错的,如下图所示: Op ...
- OpenCV+python:轮廓发现与对象测量
1,轮廓发现 当通过阈值分割提取到图像中的目标物体后,就需要通过边缘检测来提取目标物体的轮廓,使用这两种方法基本能够确定物体的边缘或者前景.接下来,通常需要做的是拟合这些边缘的前景,如拟合出包含前景或 ...
- OpenCV-Python 中文教程15——OpenCV 中的轮廓
OpenCV-Python 中文教程15--OpenCV 中的轮廓 一.初识轮廓 目标 • 理解什么是轮廓 • 学习找轮廓,绘制轮廓等 • 函数: cv2.findContours(), cv2.dr ...
- 基于OpenCV的视频轮廓识别与图像匹配【手影识别】
本人初学OpenCV做的项目,这个项目初始是用于手影识别,即使用摄像头拍摄,双手在摄像头前做出相关手影动作,程序使用匹配算法识别出用户正在模仿的动物,并触发对应事件.其实也可以识别并匹配其他内容(由模 ...
- OpenCV检测图像轮廓
轮廓只不过是图像中连接的曲线,或者图像中连通部分的边界,轮廓通常以图像中的边缘来计算,但是,边缘和轮廓的区别在于轮廓是闭合的,而边缘可以是任意的.边缘的概念局限于点及其邻域像素,轮廓将目标作为整体进行 ...
- 计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours()介绍
计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours(),用于轮廓的绘制或填充. cv2.drawContours(image, contours, contourIdx, co ...
- 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍
计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours说明如下: 示例代码: #!/usr/bin/env python3import cv2image = cv2.imread( ...
- OpenCV PCA提取对象的方向的实例(附完整代码)
OpenCV PCA提取对象的方向的实例 OpenCV PCA提取对象的方向的实例 OpenCV PCA提取对象的方向的实例 #include "opencv2/core.hpp" ...
最新文章
- Fiddler抓包工具总结(转)
- 5分钟教程,手把手带你安装使用抓包神器:Whistle ,内含精选爬虫资料
- 实现量子计算,我们还需要做些什么?
- mysql 安装以及配置
- Unet实现图像分割(一)
- 解决Missing artifact com.sun:tools:jar:1.5.0方法
- 【AC Saber】二分
- Java基础课程---权限修饰符
- python发送文件_Python实现基于HTTP文件传输实例
- weblogic启动失败案例(root启动引起的权限问题)
- 计算机录音机应用程序在哪,windows7如何给电脑录音 windows7录音机在哪
- linux自学笔记--DNS服务器
- VUE常用插件库总结
- ORACLE索引分裂(enq: TX - index contention)
- 190824-英雄联盟传记爬取
- js find(),findIndex()方法的使用
- 前端森林:万物皆可快速上手之Electron(第一弹)
- Unity 计算角度和方向
- 微信网页Audio自动播放(IOS安卓)
- ThinkPad物理机安装Linux系统实战企业级项目之CentOS安装
热门文章
- day02 设计模式-外观模式
- 商城项目-实现商品分类查询
- 暴涨买卖有望趋势线顶底选股公式 通达信波段趋势顶底指标
- notepad html5 mac,用notepad++将DPL格式转为通用格式
- [iOS开发]AFNetworking源码学习
- 深度强化学习主流算法介绍(二):DPG系列
- JAVA实现输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
- 台式电脑没鼠标怎么移动光标_没有鼠标怎么移动光标【设置措施】
- long与int转换线上问题解决(必看)
- iSubtitle for Mac(视频字幕制作软件)