LogPolar 座標變換
阿新 • • 發佈:2019-01-03
對於二維影象,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; }