OpenCV计算物体的重心坐标(2值图像)

效果图:

代码:

// FindGravity.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include "cv.h"
#include "highgui.h" 

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

#pragma comment(lib,"opencv_core2410d.lib")
#pragma comment(lib,"opencv_highgui2410d.lib")
#pragma comment(lib,"opencv_imgproc2410d.lib")   

using namespace std;
using namespace cv;

void FindGravity()
{

}
/** 计算二值图像的重心
* @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;
 } 

 IplImage* binary_image(IplImage* src)
 {

		// cvThreshold( src, src, 100, 255, CV_THRESH_BINARY );//100 is the thredhold
		 IplImage* one_channel = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,0);

		 for(int y = 0;y < src->height;y++)
		 {
			 char *ptr= src->imageData + y * src->widthStep;
			 char *p_one_channel = one_channel->imageData + y * one_channel->widthStep;
			 for(int x = 0;x < src->width;x++)
			 {
				 int temp = ptr[3*x];
				 if (temp != 0)//不是黑色也就是说不是背景
				 {
					 p_one_channel[x] = 255;//设置为白色
				 }
				 else
				 {
					 p_one_channel[x] = 0;

				 }
				 //ptr[3*x]=
				 //ptr[3*x+1]=
				 //ptr[3*x+2]=;
			 }
		 }
		 return one_channel;

 }

int _tmain(int argc, _TCHAR* argv[])
{
	string str_name = "seg_right.bmp";

	IplImage* src;
	IplImage* draw = cvLoadImage(str_name.c_str(),1);//绘制重心的图像

	if ((src = cvLoadImage(str_name.c_str(),1))!=0)
	{
		//src = binary_image(src);
		cvNamedWindow( "binary image", 1 );
		cvShowImage( "binary image", binary_image(src) );
	}
	CvPoint xy;
	aoiGravityCenter(binary_image(src),xy);
	cout<<xy.x<<endl;
	cout<<xy.y<<endl;

	cvCircle(draw,cvPoint(xy.x,xy.y),3,CV_RGB(0,0,255),5);

	cvNamedWindow( "重心", 1 );
	cvShowImage( "重心", draw ); 

	cvWaitKey(0);
	return 0;
}

我调试好的工程:点击打开链接

http://download.csdn.net/detail/wangyaninglm/9389338 

时间: 2024-10-21 23:13:04

OpenCV计算物体的重心坐标(2值图像)的相关文章

OpenCV中读取视频帧像素值的一般方法

OpenCV中读取视频帧像素值的一般方法可以分为以下几个步骤: 1.打开AVI格式的视频 CvCapture *capture=NULL; IplImage *img=NULL; capture = cvCaptureFromFile("E:\\Sequence_mask\\crossroad.avi"); if(!capture) { cout<<endl<<"failed to open mask file"<<endl; r

opencv调用函数进行阈值二值化为什么会出现中断错误

问题描述 opencv调用函数进行阈值二值化为什么会出现中断错误 #include "cv.h" #include #include "highgui.h" IplImage Thres(IplImage src); int main(int argc, char** argv) { IplImage* i; IplImage* ii; i=cvLoadImage("D:\ceshi.jpg"); ii = Thres(i); cvNamedWi

安装VSTO文件时,提示为文件dll计算出的哈希值与清单中的指定值不同

问题描述 用VS2010生成的VSTO文件,安装时提示错误:为文件Word.UI.dll计算出的哈希值与清单中的指定值不同.项目也没有使用clickonce发布,详细提示如下:System.Deployment.Application.InvalidDeploymentException:为文件Word.UI.dll计算出的哈希值与清单中的指定值不同.在Microsoft.VisualStudio.Tools.Applications.Deployment.ClickOnceAddInDeplo

OpenCV轮廓检测,计算物体旋转角度

    效果还是有点问题的,希望大家共同探讨一下     // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include <opencv2/cor

OpenCV中获取图像某一像素值

This is a basic example for the OpenCV. First we must know the structure of IplImage: IPL image: IplImage |-- int nChannels; // Number of color channels (1,2,3,4) |-- int depth; // Pixel depth in bits: | // IPL_DEPTH_8U, IPL_DEPTH_8S, | // IPL_DEPTH_

由GDTR计算GDT的一些相关值

读张银奎老师的<软件调试>一书,其中一节讲保护模式中分段机制,举了一个例子,用WinDBG观察GDTR和LDTR值,并由此得出一些结论,实例如下: kd> r gdtr gdtr=8003f00 kd> r idtr idtr=8003f400 kd>r gdtl gdtl=000003ff kd>r idtl idtl=000007ff   结论是:GDT的边界是1023,总长度是1024字节,共有128个表项        IDT的表长度是2048字节,共有256项

delphi编程计算数据库某字段的值

在数据库中,有时需要做汇总工作,那么就要对某个字段的所有记录进行求和,我们使用如下代码: 先定义一个全局变量i,再加入Table1的OnCalcFields事件,那么就得出了数据库中"金额"字段的合计值 var i:double;{$R *.DFM} procedure TForm1.Table1CalcFields(dataset: Tdataset);varGoodsgold:double;beginGoodsgold:=table1.fieldbyname(金额).asfloat

《Mastering Opencv读书笔记》第一章 实现图像卡通效果

这本书和配套代码网上都有得下载. 要实现书中的效果,只要三步:1.使用拉普拉斯算子提取轮廓  2.使用双边滤波器对图像进行平滑 3.根据第一步得到的轮廓模版图,将第二步的结果拷贝过去[填充轮廓图中全白的部分] 由于我的笔记本摄像头坏了,故我的程序读取的是手机拍摄的视频. 下面给出我整理的两段代码: 1.边缘提取: // GetMySketch.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #in

用PHP编程计算中序表达式的值

编程 过程: 用class 模拟链表实现堆栈 .:p 完整测试程序地址: http://test.hightman.net/stack/stack_05.php 在表单里可输入: (3+5)/2 之类的表达试,支持 ()+-/*以下为全部代码 <?php/* =================== Program Description ==================== *//* Written by MingLian Mar. (hightman)