利用OpenCV求取图像的重心
转自:http://blog.csdn.net/lxiaoxiaot/article/details/6539834
不规则区域的矩,表示把一个归一化的灰度级图像函数理解为一个二维随机变量的概率密度。
这个随机变量的属性可以用统计特征--矩(Moments)来描述。通过假设非零的像素值表示区域,矩可以用于二值或灰度级的区域描述。
Mpq = sigma(i)sigma(j) ip jq f(i,j)
其中x,y,i,j是区域点的坐标(在数字图像中的像素坐标)。
令Xc,Yc表示区域重心的坐标,则:
Xc = M10/M00;
Yc = M01/M00;
在二值图像的情况下,M00表示区域的面积。
OpenCV中可以使用函数cvMoments来计算二值图像的矩信息。
使用函数cvGetSpatialMoment获得指定维的矩信息。
例如:
// 计算二值化图像imgYellowThresh中物体的重心坐标
CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments));
cvMoments(imgYellowThresh, moments, 1); // The actual moment values double moment10 = cvGetSpatialMoment(moments, 1, 0); double moment01 = cvGetSpatialMoment(moments, 0, 1); double area = cvGetSpatialMoment(moments, 0, 0);
// 计算重心
posX = moment10 / area;
posY = moment01 / area;
转自:http://blog.163.com/forever_871226/blog/static/34424308201141851736984/
/** 计算二值图像的重心
* @param[in] src 输入的待处理图像
* @param[out] center 重心坐标
* @retval 0 操作成功
* @retval -1 操作失败
* @note 输入图像是二值化图像
* @note xc=M10/M00, yc=M01/M00, 其中 Mx_order,y_order=SUMx,y(I(x,y)*x^x_order*y^y_order)
*/
static int aoiGravityCenter(IplImage *src, CvPoint ¢er)
{
//if(!src)
// return GRAVITYCENTER__SRC_IS_NULL;
double m00, m10, m01;
CvMoments moment;
cvMoments( src, &moment, 1);
m00 = cvGetSpatialMoment( &moment, 0, 0 );
if( m00 == 0)
return 1;
m10 = cvGetSpatialMoment( &moment, 1, 0 );
m01 = cvGetSpatialMoment( &moment, 0, 1 );
center.x = (int) (m10/m00);
center.y = (int) (m01/m00);
return 0;
}
转自:http://www.opencv.org.cn/forum/viewtopic.php?p=1016
#include "cv.h"
#include "highgui.h"
void main( int argc, char** argv )
{
IplImage* src;
CvMoments moments;
CvMat *region;
CvPoint pt1,pt2;
double m00 = 0, m10, m01, mu20, mu11, mu02, inv_m00;
double a, b, c;
int xc, yc;
// 第一条命令行参数确定了图像的文件名。
if( (src=cvLoadImage("two.bmp", 0))!= 0)
//if( (src=cvLoadImage("fbb.jpg", 0))!= 0)
//if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0)
{
IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;
cvThreshold( src, src, 100, 255, CV_THRESH_BINARY );//100 is the thredhold
cvNot( src, src );
cvNamedWindow( "Source", 1 );
cvShowImage( "Source", src );
//cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0) );
cvFindContours( src, storage, &contour, sizeof(CvContour),CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
cvZero( dst );
for( ; contour != 0; contour = contour->h_next )
{
//CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
CvScalar color = CV_RGB( 255, 0,0 );
/* 用1替代 CV_FILLED 所指示的轮廓外形 */
cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8,cvPoint(0,0) );//you can change 1 to CV_FILLED
contour = cvApproxPoly( contour, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 3, 1 );
//CvRect* r = (CvRect*)cvGetSeqElem( contour,1);
region=(CvMat*)contour;
cvMoments( region, &moments,0 );
//cvMoments( &contour, &moments,0 );
// cvDrawContours( cnt_img, _contours, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels, 3, CV_AA, cvPoint(0,0) ); CV_FILLED
/
m00 = moments.m00;
m10 = moments.m10;
m01 = moments.m01;
mu11 = moments.mu11;
mu20 = moments.mu20;
mu02 = moments.mu02;
//if( fabs(m00) < DBL_EPSILON )break;
inv_m00 = 1. / m00;
xc = cvRound( m10 * inv_m00 );
yc = cvRound( m01 * inv_m00 );
a = mu20 * inv_m00;
b = mu11 * inv_m00;
c = mu02 * inv_m00;
/
pt1.x=xc-1;pt1.y=yc;
pt2.x=xc+1;pt2.y=yc;
cvLine( dst, pt1, pt2, CV_RGB(0,255,0), 2, CV_AA, 0 );
pt1.x=xc;pt1.y=yc-1;
pt2.x=xc;pt2.y=yc+1;
cvLine( dst, pt1, pt2, CV_RGB(0,255,0), 2, CV_AA, 0 );
}
cvNamedWindow( "Components", 1 );
cvShowImage( "Components", dst );
cvWaitKey(0);
}
}
利用OpenCV求取图像的重心相关推荐
- 利用OpenCV建立视差图像
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...
- matlab中利用xy求取多项式z,将(x y z)^10展开为多项式,经过合并同类项
如何在matlab中展开多项式 symssps=((s^2+1))^3*(s+5)^2*(s^4+4*s^2+7)ps1=expand(ps)结果:ps=(s^2+1)^3*(s+5)^2*(s^4+ ...
- 利用OpenCV求矩阵的特征值和特征向量
来源: 互联网 首先安转和配置OpenCV windows版,在此不赘述! 首先看看OpenCV中的矩阵运算的相关知识:CvMat(多通道矩阵) CvMat的结构定义: typedef struct ...
- c++ opencv实现区域填充_利用opencv之为图像添加边框
我们经常会有对图像边缘做扩展的需求.比如 希望卷积后得到的矩阵大小不变 希望改变图像大小,但是不改变宽高比 opencv实现 opencv中使用copyMakeBorder()来完成这一功能 api ...
- MATLAB利用遗传算法求取最优解
MATLAB内置GA函数,用以求解全局最优化问题,适用于求解目标函数最优解问题. 一.GA函数原型: 二.函数介绍 常用的两种分别是: 1.X = ga(fitnessfcn,nvars) 2.X = ...
- matlab中利用xy求取多项式z,matlab基础练习题
3. 求有理分式()()()()3323230.522521x x x R x x x x ++=+-++的商多项式和余多项式 4. 一元多项式42234p x x x =-+,写出表示p 的MATL ...
- 利用shell求取两个文件的交集、差集、并集等
求文件行数 cat a.txt | wc -l 交集 sort a.txt b.txt | uniq -d 并集 sort a.txt b.txt | uniq 差集 (1) a.txt-b.txt ...
- 如何利用SQL求取微信的共同好友数?
「哎呀,我们竟然有共同好友」 「哎呀,没想到你们也认识」 经常在朋友圈评论区能够看到类似的评论,这些评论反映的其实就是共同好友这个概念.那如果你是负责微信的数据分析师,现在业务方想看下微信中任意两个人 ...
- 图像局部均值、中值、方差求取结合opencv
结合opencv求取图像的局部均值.中值.方差: //src 为待处理图像 //indexrows 为图像遍历的行数 //indexcols 为图像遍历的列数 //meanv 保存均值 //ker 窗 ...
最新文章
- Spring Cloud Greenwich版本已发布!
- 谷歌工程师:聊一聊深度学习的weight initialization
- 纯脚本搞掂DataGrid表表头不动,表身滚动
- tkinter 笔记:列表部件 listbox (莫烦python 笔记)
- C++语言基础 例程 设计模式简介
- c++ 嵌套私有类_嵌套类和私有方法
- java分子分母题,JAVA黄金分割点练习题
- webuploader上传多张照片的基本功能
- 深入浅出学python_深入浅出Python机器学习 (段小手) 完整pdf高清版[176MB]
- 在微博投放广告有哪些优势呢?微博广告推广位置介绍!
- 教你用Python制作微信好友背景墙
- Windows电脑垃圾的清理
- 内网渗透系列:隐匿攻击方法
- 存储卡中各种文件夹用处
- 信息量,信息熵,纯度
- 辨析 dB、dBm、dBw
- oralc 日期操作
- 苹果手机怎么编辑word文档_Word文档怎么转化为pdf格式?办公必备方法!
- mysql支持ASCII_MySQL ASCII()函数返回字符的ASCII码值
- 科研项目一般流程介绍
热门文章
- 【机器视觉案例】(6) AI视觉,距离测量,自制AI小游戏,附python完整代码
- php会员中心模板,会员中心模板
- extjs2.0 ie8 下拉树_extjs自定义下拉树
- fprintf()中的stderr解析
- c++的:: . :-的区别
- 【实现手机端上滑滚动加载列表】判断页面是否滚动到底部或者指定元素位置
- 编写Makefile中遇到的各种奇葩问题汇总
- ATS中用到的sscanf高级用法说明
- 从Java类库看设计模式
- Rocksdb 的一些参数调优策略