OpenCV中文网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 安装 配置
查看: 634|回复: 3

求解opencv编写的 直角坐标系转为极坐标系程序

[复制链接]
发表于 2016-3-14 22:10:01 | 显示全部楼层 |阅读模式
最近在看基于圆投影的旋转模板匹配,,要用到极坐标的匹配,如果这个程序能写出来,那么论坛里前几天别人问的几个问题也能一并解决了
回复

使用道具 举报

 楼主| 发表于 2016-3-14 22:11:09 | 显示全部楼层
我实在看的有点头晕,大神帮帮忙啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
}
回复 支持 反对

使用道具 举报

发表于 2019-7-5 22:38:27 | 显示全部楼层
老哥厉害呀
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站  

GMT+8, 2019-7-23 21:38 , Processed in 0.023290 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表