转自:http://blog.csdn.net/lxiaoxiaot/article/details/6539834
不规则区域的矩,表示把一个归一化的灰度级图像函数理解为一个二维随机变量的概率密度。
这个随机变量的属性可以用统计特征--矩(Moments)来描述。通过假设非零的像素值表示区域,矩可以用于二值或灰度级的区域描述。
Mpq = sigma(i)sigma(j) ipjqf(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提取目标质心
使用opencv编写的求取连通区域重心的部分代码,不是完整的例子。不过是正确的。
Linux环境,利用Opencv freetype在图像上写中文字符,含字体文件、源码、CMakeLists配置
OpenCV求取RGB分量源代码
利用Opencv的相关函数,可以实现图像的读入,
利用PCL库,通过滤波,分割,求长宽高,计算物体的体积,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
基于opencv2做的图像处理程序,实现了冈萨雷斯那本著名的《数字图像处理》中的一些算法,目前已提供的包括:对比度拉伸变换,直方图均衡化,直方图匹配变换,灰度变换,对数变换,伽马变换等。
对图像ROI的处理是识别跟踪的重要环节。
利用opencv函数实现图像处理,环境:VC6.0 && OpenCV1.0 程序说明: 1)image文件里保存着标定图片 2)calibdata.txt 保持标定图片的路径(根据实际设置) 3)在标定源文件中 calibration.cpp 根据不同的标定标...
OpenCV+C++图像处理设计-遥感图像配准系统源码
基于spring boot + maven + opencv 实现的图像深度学习Demo项目,包含车牌识别、人脸识别、证件识别等功能,贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点。 基于spring boot + maven + opencv ...
利用图像处理可以实现对视频流的读取,对目标进行分割,提取特征点等等,最后实现跟踪
利用opencv一系列图像处理方式获得目标四边形
使用python+OpenCV实现多张图像拼接,完成拼接后进行图像黑边去除。里面代码每一行都有中文注释和附带的实验图像。
几何操作,图像处理,直方图,阈值分割,边缘检测,轮廓检测,霍夫变换,角点检测
基于OPENCV的超声图像增强 项目中用了基本的OPENCV 函数 实现了 超声图像的增强 OPENCV 是 计算机视觉领域一个 不错的 开发工具 项目中用提出了一个新的方法来处理数字图像 同时也对比了直方图均衡化 和数学形态学...
这是利用openCV实现图像缩放的C++程序源代码,在VC++ 6.0里面编译成功的。
ubuntu14.04利用opencv获取realsense图像.docx
这是利用openCV画出图像直方图的C++程序源代码,在VC++ 6.0下面编译成功的。多谢试用!
OpenCV计算IplImage类型图像灰度均值