LogPolar 坐标变换

来源:互联网 发布:网络代运营 编辑:程序博客网 时间:2024/06/03 12:52

对于二维图像,Log-Polar表示从笛卡尔坐标到极坐标的变换。

OpenCV中对于数极坐标转换的函数是cvLogPolar():

void cvLogPolar(const CvArr * src , CvArr * det , CvPoint2D32f center , double n , int flags = CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS)

src 和 dst是单通道或三通道的彩色或灰度图像。

center是对数极坐标变换的中心点;

m是缩放比例;

下面以《学习OpenCV》课后题10为例子进行练习

10.进行LogPolar转换

a:如果logPolar的中心点在正方形的一角,画出log-polar的结果;

b:如果中心点在圆里边靠近边缘,那么log-polar变换中的圆的外观?

c:如果中心点在圆的外边,画出圆的外观


#include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/highgui.hpp>using namespace std;using namespace cv;int main(int argc, const char * argv[]) {    /*1、生成一个图像*/    IplImage * Src1 = cvCreateImage(cvSize(250,250), IPL_DEPTH_32F, 1);    cvSetZero(Src1);        /*2、克隆图像Src2 和 Src3,生成矩形和圆*/    IplImage * Src2 = cvCloneImage(Src1);    Src2->origin = Src1->origin;  //设置相同原点    cvSetZero(Src2);        cvRectangle(Src1, cvPoint(100, 100), cvPoint(200, 200), CV_RGB(255, 255, 255));    cvCircle(Src2, cvPoint(150, 150), 50, CV_RGB(255,255,255));        cvShowImage("Rect_1", Src1);    cvShowImage("Circle", Src2);        double M = 50;        //缩放比例        /*3、中心点在正方形的中心进行极坐标变换 */    IplImage * Ipolar1 = cvCloneImage(Src1);    Ipolar1->origin = Src1->origin;    cvSetZero(Ipolar1);    CvPoint2D32f center1 = cvPoint2D32f(150, 150); //在矩形中心    cvLogPolar(Src1, Ipolar1, center1, M , CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS);    cvShowImage("Ipolar1", Ipolar1);        /*4、中心点在正方形的一角进行极坐标变换*/    IplImage * Ipolar2 = cvCloneImage(Src1);    Ipolar2->origin = Src1->origin;    cvSetZero(Ipolar2);    CvPoint2D32f center2 = cvPoint2D32f(100, 100); //矩形边角    cvLogPolar(Src1,Ipolar2 , center2, M , CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS);    cvShowImage("Ipolar2", Ipolar2);        /*5、中心点在圆里面靠近边缘进行极坐标变换*/    IplImage * Ipolar3 = cvCloneImage(Src2);    Ipolar3->origin = Src2->origin;    cvSetZero(Ipolar3);    CvPoint2D32f center3 = cvPoint2D32f(150, 102);    cvLogPolar(Src2, Ipolar3, center3, M , CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS);    cvShowImage("Ipolar3", Ipolar3);        /*6、中心点在圆里面外边边缘进行极坐标变换*/    IplImage * Ipolar4 = cvCloneImage(Src2);    Ipolar4->origin = Src2->origin;    cvSetZero(Ipolar4);    CvPoint2D32f center4 = cvPoint2D32f(150, 98);    cvLogPolar(Src2, Ipolar4, center4, M , CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS);    cvShowImage("Ipolar4", Ipolar4);        cvWaitKey(0);    cvReleaseImage(&Src1);    cvReleaseImage(&Src2);    cvReleaseImage(&Ipolar1);    cvReleaseImage(&Ipolar2);    cvReleaseImage(&Ipolar3);    cvReleaseImage(&Ipolar4);    return 0;}