|
楼主 |
发表于 2016-3-15 17:10:08
|
显示全部楼层
求人不如求己。。。
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include "opencv2/features2d/features2d.hpp"
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/legacy.hpp>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
using namespace cv;
using namespace std;
#define PA 3.1415926535
float fen1=PA/2,fen2=PA,fen3=3*PA/2,fen4=2*PA;///////划分直角坐标系的4个象限
Mat src,dst,gray,jitu;
int hang=0,lie=0;
//float a=1,b=1.73205081;
int i=0,j=0;
double fenzix=0,fenziy=0;//这里用的double,,本来用int的,但是累加的结果产生了负数,我怀疑是int不够,溢出了
int yuanx=0,yuany=0;//定义重心的 横纵 坐标
int fenmu=0;
int main( )
{
src=imread("221.jpg");
cvtColor(src,gray,CV_BGR2GRAY);
//gray.copyTo(jitu);
Mat jitu=Mat::zeros(866, 866, CV_8UC3);cvtColor(jitu,jitu,CV_BGR2GRAY);////创建并灰度化极图
int jixinx=jitu.rows/2,jixiny=jitu.cols/2;////////////////////////////////////////定义极图的中心坐标
hang=gray.rows,lie=gray.cols;
//cvtColor(gray,dst,CV_GRAY2BGR);
//imshow("灰度1图",gray);
//**********************************************************************计算面积重心************************************************
//**********************************************************************计算面积重心************************************************ ///////
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
fenmu=fenmu+gray.at<uchar>(i,j);
}}
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
fenzix=fenzix+gray.at<uchar>(i,j)*j;//这里不太清楚是乘i还是j
}}
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
fenziy=fenziy+gray.at<uchar>(i,j)*i;//这里不太清楚是乘i还是j
}}
yuanx=fenzix/fenmu;
yuany=fenziy/fenmu;
cvtColor(gray,dst,CV_GRAY2BGR);//灰度图再转回彩图,为了画出彩色的重心
circle( dst, Point(yuanx,yuany),6,Scalar(0,0,250),2, 8);
imshow("灰度图",dst);
///////
//**********************************************************************计算面积重心************************************************
//**********************************************************************计算面积重心************************************************
//float angel=atan2(a,b);
//angel=angel*180/PA;
//float c=0.785398;
//float jiao=tan(c);
//printf("正切角度 %f° \n",angel);
//printf("正切是 %f \n",jiao);
printf("yuanx %d \n",yuanx);
printf("yuany %d \n",yuany);
printf("fenmu %d \n",fenmu);
//**********************************************************************开始弄极坐标************************************************
//**********************************************************************开始弄极坐标************************************************
//jixinx=lie/2,jixiny=hang/2; ///////
int r=0;
float sa=0;//定义r 和 seita.
int p=0,q=0;
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
r=abs(i-yuany);
sa=((j-yuanx)*360/lie)*2*PA/360;//角度转换为弧度,,,,*360/lie是为了是图片的列正好围成一圈,,即360度
//do {sa=sa-2*PA;}while(sa>2*PA);//////这里的宏也需要加分号吗???
p=jixiny-r*sin(sa);
q=jixinx+r*cos(sa);
jitu.at<uchar>(p,q)=gray.at<uchar>(i,j);
}}
imshow("jitu",jitu); ///////
//**********************************************************************开始弄极坐标************************************************
//**********************************************************************开始弄极坐标************************************************
waitKey (0);
return 0;
}
|
|