Log-polar轉換表示從笛卡爾座標到極座標的變化

對於二維圖形,Log-polar轉換表示從笛卡爾座標到極座標的變化,廣泛應用在計算機視覺中。此函數模仿人類視網膜中央凹視力,並且對於目標跟蹤等可用於快速尺度和旋轉變換不變模板匹配。

本例程實現極座標變化,並反轉。

----------------------------------------------------------------------------------------------

LogPolar

把圖像映射到極指數空間

void cvLogPolar( const CvArr* src, CvArr* dst,

                CvPoint2D32f center, double M,

                int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );

src

輸入圖像。

dst

輸出圖像。

center

變換的中心,輸出圖像在這裏最精確。

M

幅度的尺度參數,見下面公式。

flags

插值方法和以下選擇標誌的結合

·       CV_WARP_FILL_OUTLIERS-填充輸出圖像所有像素,如果這些點有和外點對應的,則置零。

·       CV_WARP_INVERSE_MAP- 表示矩陣由輸出圖像到輸入圖像的逆變換,並且因此可以直接用於像素插值。否則,函數從map_matrix中尋找逆變換。

fillval

用於填充外點的值。

函數cvLogPolar用以下變換變換輸入圖像:

正變換 (CV_WARP_INVERSE_MAP 未置位):

dst(phi,rho)<-src(x,y)

逆變換 (CV_WARP_INVERSE_MAP 置位):

dst(x,y)<-src(phi,rho),

這裏,

rho=M*log(sqrt(x2+y2))

phi=atan(y/x)

 ----------------------------------------------------------------------------------------------

/*code*/

#include <opencv/cv.h>
#include <opencv/highgui.h>   
#include <opencv2/opencv.hpp>  

using namespace cv;  
 
int main(int argc,char** argv)  
{
CvCapture *capture=0;
	capture=cvCreateFileCapture("../test.avi");
	if(!capture)
	{
		return -1;
	}
	IplImage *bgr_frame=cvQueryFrame(capture);
	double fps=cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
	CvSize size=cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
	CvVideoWriter *writer=cvCreateVideoWriter("../heibai.avi",CV_FOURCC('M','J','P','G'),fps,size);
	IplImage *logpolar_frame=cvCreateImage(size,IPL_DEPTH_8U,3);
	IplImage *logpolar_frame1=cvCreateImage(size,IPL_DEPTH_8U,3);
	cvNamedWindow("Video test",CV_WINDOW_AUTOSIZE);
	while((bgr_frame=cvQueryFrame(capture))!=NULL)
	{
		cvLogPolar(bgr_frame,logpolar_frame,cvPoint2D32f(bgr_frame->width/2,bgr_frame->height/2),50,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);//把圖像映射到極指數空間
		//CV_WARP_FILL_OUTLIERS -填充輸出圖像所有像素,如果這些點有和外點對應的,則置零。
		//cvLogPolar(bgr_frame,logpolar_frame1,cvPoint2D32f(bgr_frame->width/2,bgr_frame->height/2),10,CV_INTER_LINEAR + CV_WARP_INVERSE_MAP);
		//CV_WARP_INVERSE_MAP - 表示矩陣由輸出圖像到輸入圖像的逆變換,並且因此可以直接用於像素插值。否則,函數從map_matrix中尋找逆變換。  
		cvShowImage("Video test",logpolar_frame);
		cvWaitKey((int)fps);
		cvWriteFrame(writer,logpolar_frame);
	}
	cvReleaseVideoWriter(&writer);
	cvReleaseImage(&logpolar_frame);
	cvReleaseImage(&logpolar_frame1);
	cvReleaseImage(&bgr_frame);
	cvReleaseCapture(&capture);
	cvDestroyWindow("Video test");

    return 0;  
} 

/*result*/

依舊水果圖

log-polar:


inverse log-polar:


對於這一轉換在實際應用中有何用途不清楚!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章