#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
#define N (4-3*width%4)
void main ()
{
IplImage* img =cvLoadImage("2.jpg",0); // 载入图像
/* IplImage* img_gray=0 ;*/
IplImage* img_bw =0;
int height,width,step,channels,i=1,j=1;
float m00 = 0, m10 = 0, m01 = 0,x,y;
uchar *data=0,tmp;
/*img_gray =cvCreateImage( cvGetSize(img), img->depth,1);*/
img_bw =cvCreateImage( cvGetSize(img), img->depth,1);
/*cvCvtColor(img,img_gray,CV_BGR2GRAY);*/
cvThreshold(img/*_gray*/, img_bw ,10, 255, CV_THRESH_BINARY);
// 获取图像数据
height = img_bw->height;
width = img_bw->width;
step = img_bw->widthStep;
channels = img_bw->nChannels;
data = (uchar *) img_bw->imageData;
float fun1(int height,int width,int channels,uchar *data);
x=fun1( height, width,channels, data);
float fun2(int height,int width,int channels,uchar *data);
y=fun2( height,width, channels, data );
float fun(int height,int width,int channels,uchar *data);
tmp=fun(height,width,channels,data);
printf("Processing a %dx%d image with %d channels\n",height,width,channels);
printf("输出质心坐标:\n");
printf("x=%.15f,y=%.15f",x,y);
cvReleaseImage(&img);
/*cvReleaseImage(&img_gray);*/
cvReleaseImage(&img_bw);
}
//求图像质心
float fun1( int height,int width,int channels,uchar *data)
{
int i,j;
uchar tmp;
float x,m00 = 0, m10 = 0, m01 = 0;
if(width%4==0)
{
for(i=0;i<height;i++)
for(j=0;j<width;j++)
{
tmp = data[i*width+j];
m00 += tmp;
m10 += tmp * j;
}
}
else
{
for(i=0;i<height;i++)
for(j=0;j<(width+N);j++)
{
tmp = data[i*(width+N)+j];
m00 += tmp;
m10 += tmp * j;
}
}
if(m00 != 0)
{
x = ((m10 / m00)+1);
}
return x;
}
float fun2( int height,int width,int channels,uchar *data)
{
int i,j;
uchar tmp;
float y,m00 = 0, m10 = 0, m01 = 0;
if(width%4==0)
{
for(i=0;i<height;i++)
for(j=0;j<width;j++)
{
tmp = data[i*width+j];
m00 += tmp;
m01 += tmp * i;
}
}
else
{
for(i=0;i<height;i++)
for(j=0;j<(width+N);j++)
{
tmp = data[i*(width+N)+j];
m00 += tmp;
m01 += tmp * i;
}
}
if(m00 != 0)
{
y = ((m01 / m00)+1);
}
return y;
}
float fun(int height,int width,/*int step,*/int channels,uchar *data)
{
uchar tmp;
int i=0/*,j=1,k=1*/;
for(i=0;i</*height*/100;i++)
/*for(j=1;j<=width;j++)
for(k=1;k<=channels;k++)*/
{
tmp = data[/*i*width*channels+j*channels+k*/i];
printf("%3d ",tmp);
if ((i+1)%102==0)
printf("\n");
}
printf("\n");
return tmp;
}
评论0