⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video.cpp

📁 360度全角镜头圆形图像自动展开成全景图像
💻 CPP
字号:

#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
#include<iostream>
 
float CalculateFisheye_x( int u, int v, float x0, float y0, float r);
float CalculateFisheye_y( int u, int v, float x0, float y0, float r);

int main( int argc, char** argv )
{
	float x0=325;
	float y0=210;
	float r=230;
	

	IplImage* pImg = NULL; 
	CvCapture* pCapture = NULL;
	CvVideoWriter* fvideowrite = NULL;
 
	int nFrmNum = 0;
 
	cvNamedWindow("video", 1);
	cvNamedWindow("panorama", 1);
	cvNamedWindow("left", 1);
	cvNamedWindow("up", 1);
	cvNamedWindow("right", 1);
	cvNamedWindow("bottom", 1);

	cvMoveWindow("video", 300, -20);
	cvMoveWindow("panorama", 130, 455); 
	cvMoveWindow("left", 100, 610); 
	cvMoveWindow("up", 350, 610); 
	cvMoveWindow("right", 600, 610); 
	cvMoveWindow("bottom", 850, 610); 

    //Open video file
	if(argc == 1)
		if( !(pCapture = cvCaptureFromCAM(-1)))
		{
		fprintf(stderr, "Can not open video file %s\n", argv[1]);
		return -2;
		}
 
    //Input video file frame by frame
	while(pImg = cvQueryFrame( pCapture ))
    {
    nFrmNum++;

	IplImage* imgTemp = pImg;

	IplImage* imgout = cvCreateImage(cvSize(4*r,r/2), IPL_DEPTH_8U, 3);
	IplImage* imgout1 = cvCreateImage(cvSize(r,r/2), IPL_DEPTH_8U, 3);
	IplImage* imgout2 = cvCreateImage(cvSize(r,r/2), IPL_DEPTH_8U, 3);
	IplImage* imgout3 = cvCreateImage(cvSize(r,r/2), IPL_DEPTH_8U, 3);
	IplImage* imgout4 = cvCreateImage(cvSize(r,r/2), IPL_DEPTH_8U, 3);

	printf("width=%d \n",imgTemp->width);
	printf("height=%d \n",imgTemp->height);

	// Generate the panoramic viedo
	for( int j = 0; j < imgout->height; j++)  
		for( int i= 0; i < imgout->width; i++)	
		{
			//Calculate (x,y) in original image coordinates
			float x = CalculateFisheye_x( i, j+r/2, x0, y0 , r);
			float y= CalculateFisheye_y( i, j+r/2, x0, y0 , r )+20;   // 20 is the error correction

			int ix = (int)x;
			int iy= (int)y;

			// No interpolation
			((uchar*)(imgout->imageDataOrigin))[i*3+(imgout->widthStep)*j] =
					((uchar*)(imgTemp->imageDataOrigin))[ix*3+(imgTemp->widthStep)*iy];//* (1-abs(x-ix))*(1-abs(y-iy))+
				//	((uchar*)(imgTemp->imageDataOrigin))[(ix+1)*3+(imgTemp->widthStep)*iy] * abs(x-ix)*(1-abs(y-iy))+ 
                //  ((uchar*)(imgTemp->imageDataOrigin))[ix*3+(imgTemp->widthStep)*(iy+1)] * (1-abs(x-ix))*abs(y-iy)+
				//	((uchar*)(imgTemp->imageDataOrigin))[(ix+1)*3+(imgTemp->widthStep)*(iy+1)] * abs(x-ix)*abs(y-iy);

			((uchar*)(imgout->imageDataOrigin))[i*3+1+(imgout->widthStep)*j] =
					((uchar*)(imgTemp->imageDataOrigin))[ix*3+1+(imgTemp->widthStep)*iy];//* (1-abs(x-ix))*(1-abs(y-iy))+
				//	((uchar*)(imgTemp->imageDataOrigin))[(ix+1)*3+1+(imgTemp->widthStep)*iy] * abs(x-ix)*(1-abs(y-iy))+ 
                //  ((uchar*)(imgTemp->imageDataOrigin))[ix*3+1+(imgTemp->widthStep)*(iy+1)] * (1-abs(x-ix))*abs(y-iy)+
				//	((uchar*)(imgTemp->imageDataOrigin))[(ix+1)*3+1+(imgTemp->widthStep)*(iy+1)] * abs(x-ix)*abs(y-iy);

			((uchar*)(imgout->imageDataOrigin))[i*3+2+(imgout->widthStep)*j] =
					((uchar*)(imgTemp->imageDataOrigin))[ix*3+2+(imgTemp->widthStep)*iy];//* (1-abs(x-ix))*(1-abs(y-iy))+
				//	((uchar*)(imgTemp->imageDataOrigin))[(ix+1)*3+2+(imgTemp->widthStep)*iy] * abs(x-ix)*(1-abs(y-iy))+ 
                //  ((uchar*)(imgTemp->imageDataOrigin))[ix*3+2+(imgTemp->widthStep)*(iy+1)] * (1-abs(x-ix))*abs(y-iy)+
				//	((uchar*)(imgTemp->imageDataOrigin))[(ix+1)*3+2+(imgTemp->widthStep)*(iy+1)] * abs(x-ix)*abs(y-iy);

		}

	
	// Generate left viedo
	for(int j1 = 0; j1 < imgout1->height; j1++)  
		for(int  i1 = 0; i1 < imgout1->width; i1++)	
		{
			float x1 = CalculateFisheye_x( i1-r/2, j1+r/2, x0, y0 , r);
			float y1 = CalculateFisheye_y( i1-r/2, j1+r/2, x0, y0 , r )+20;
			int ix1 = (int)x1;
			int iy1 = (int)y1;

			// Bilinear interpolation
			((uchar*)(imgout1->imageDataOrigin))[i1*3+(imgout1->widthStep)*j1] =
					((uchar*)(imgTemp->imageDataOrigin))[ix1*3+(imgTemp->widthStep)*iy1]* (1-abs(x1-ix1))*(1-abs(y1-iy1))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix1+1)*3+(imgTemp->widthStep)*iy1] * abs(x1-ix1)*(1-abs(y1-iy1))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix1*3+(imgTemp->widthStep)*(iy1+1)] * (1-abs(x1-ix1))*abs(y1-iy1)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix1+1)*3+(imgTemp->widthStep)*(iy1+1)] * abs(x1-ix1)*abs(y1-iy1);

			((uchar*)(imgout1->imageDataOrigin))[i1*3+1+(imgout1->widthStep)*j1] =
					((uchar*)(imgTemp->imageDataOrigin))[ix1*3+1+(imgTemp->widthStep)*iy1]* (1-abs(x1-ix1))*(1-abs(y1-iy1))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix1+1)*3+1+(imgTemp->widthStep)*iy1] * abs(x1-ix1)*(1-abs(y1-iy1))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix1*3+1+(imgTemp->widthStep)*(iy1+1)] * (1-abs(x1-ix1))*abs(y1-iy1)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix1+1)*3+1+(imgTemp->widthStep)*(iy1+1)] * abs(x1-ix1)*abs(y1-iy1);

			((uchar*)(imgout1->imageDataOrigin))[i1*3+2+(imgout1->widthStep)*j1] =
					((uchar*)(imgTemp->imageDataOrigin))[ix1*3+2+(imgTemp->widthStep)*iy1]* (1-abs(x1-ix1))*(1-abs(y1-iy1))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix1+1)*3+2+(imgTemp->widthStep)*iy1] * abs(x1-ix1)*(1-abs(y1-iy1))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix1*3+2+(imgTemp->widthStep)*(iy1+1)] * (1-abs(x1-ix1))*abs(y1-iy1)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix1+1)*3+2+(imgTemp->widthStep)*(iy1+1)] * abs(x1-ix1)*abs(y1-iy1);
		}
	

	// Generate upper viedo
	for(int j2 = 0; j2 < imgout2->height; j2++)  
		for(int  i2 = 0; i2 < imgout2->width; i2++)	
		{
			float x2 = CalculateFisheye_x( i2+r/2, j2+r/2, x0, y0 , r);
			float y2 = CalculateFisheye_y( i2+r/2, j2+r/2, x0, y0 , r )+20;
			int ix2 = (int)x2;
			int iy2 = (int)y2;

			// Bilinear interpolation
			((uchar*)(imgout2->imageDataOrigin))[i2*3+(imgout2->widthStep)*j2] =
					((uchar*)(imgTemp->imageDataOrigin))[ix2*3+(imgTemp->widthStep)*iy2]* (1-abs(x2-ix2))*(1-abs(y2-iy2))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix2+1)*3+(imgTemp->widthStep)*iy2] * abs(x2-ix2)*(1-abs(y2-iy2))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix2*3+(imgTemp->widthStep)*(iy2+1)] * (1-abs(x2-ix2))*abs(y2-iy2)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix2+1)*3+(imgTemp->widthStep)*(iy2+1)] * abs(x2-ix2)*abs(y2-iy2);

			((uchar*)(imgout2->imageDataOrigin))[i2*3+1+(imgout2->widthStep)*j2] =
					((uchar*)(imgTemp->imageDataOrigin))[ix2*3+1+(imgTemp->widthStep)*iy2]* (1-abs(x2-ix2))*(1-abs(y2-iy2))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix2+1)*3+1+(imgTemp->widthStep)*iy2] * abs(x2-ix2)*(1-abs(y2-iy2))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix2*3+1+(imgTemp->widthStep)*(iy2+1)] * (1-abs(x2-ix2))*abs(y2-iy2)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix2+1)*3+1+(imgTemp->widthStep)*(iy2+1)] * abs(x2-ix2)*abs(y2-iy2);

			((uchar*)(imgout2->imageDataOrigin))[i2*3+2+(imgout2->widthStep)*j2] =
					((uchar*)(imgTemp->imageDataOrigin))[ix2*3+2+(imgTemp->widthStep)*iy2]* (1-abs(x2-ix2))*(1-abs(y2-iy2))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix2+1)*3+2+(imgTemp->widthStep)*iy2] * abs(x2-ix2)*(1-abs(y2-iy2))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix2*3+2+(imgTemp->widthStep)*(iy2+1)] * (1-abs(x2-ix2))*abs(y2-iy2)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix2+1)*3+2+(imgTemp->widthStep)*(iy2+1)] * abs(x2-ix2)*abs(y2-iy2);
		}


	// Generate right viedo
	for(int j3 = 0; j3 < imgout3->height; j3++)  
		for(int  i3 = 0; i3 < imgout3->width; i3++)	
		{
			float x3 = CalculateFisheye_x( i3+3*r/2, j3+r/2, x0, y0 , r);
			float y3 = CalculateFisheye_y( i3+3*r/2, j3+r/2, x0, y0 , r )+20;
			int ix3 = (int)x3;
			int iy3 = (int)y3;

			// Bilinear interpolation
			((uchar*)(imgout3->imageDataOrigin))[i3*3+(imgout3->widthStep)*j3] =
					((uchar*)(imgTemp->imageDataOrigin))[ix3*3+(imgTemp->widthStep)*iy3]* (1-abs(x3-ix3))*(1-abs(y3-iy3))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix3+1)*3+(imgTemp->widthStep)*iy3] * abs(x3-ix3)*(1-abs(y3-iy3))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix3*3+(imgTemp->widthStep)*(iy3+1)] * (1-abs(x3-ix3))*abs(y3-iy3)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix3+1)*3+(imgTemp->widthStep)*(iy3+1)] * abs(x3-ix3)*abs(y3-iy3);

			((uchar*)(imgout3->imageDataOrigin))[i3*3+1+(imgout3->widthStep)*j3] =
					((uchar*)(imgTemp->imageDataOrigin))[ix3*3+1+(imgTemp->widthStep)*iy3]* (1-abs(x3-ix3))*(1-abs(y3-iy3))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix3+1)*3+1+(imgTemp->widthStep)*iy3] * abs(x3-ix3)*(1-abs(y3-iy3))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix3*3+1+(imgTemp->widthStep)*(iy3+1)] * (1-abs(x3-ix3))*abs(y3-iy3)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix3+1)*3+1+(imgTemp->widthStep)*(iy3+1)] * abs(x3-ix3)*abs(y3-iy3);

			((uchar*)(imgout3->imageDataOrigin))[i3*3+2+(imgout3->widthStep)*j3] =
					((uchar*)(imgTemp->imageDataOrigin))[ix3*3+2+(imgTemp->widthStep)*iy3]* (1-abs(x3-ix3))*(1-abs(y3-iy3))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix3+1)*3+2+(imgTemp->widthStep)*iy3] * abs(x3-ix3)*(1-abs(y3-iy3))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix3*3+2+(imgTemp->widthStep)*(iy3+1)] * (1-abs(x3-ix3))*abs(y3-iy3)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix3+1)*3+2+(imgTemp->widthStep)*(iy3+1)] * abs(x3-ix3)*abs(y3-iy3);
		}


	// Generate bottom viedo
	for(int j4 = 0; j4 < imgout4->height; j4++)  
		for(int  i4 = 0; i4 < imgout4->width; i4++)	
		{
			float x4 = CalculateFisheye_x( i4+5*r/2, j4+r/2, x0, y0 , r);
			float y4 = CalculateFisheye_y( i4+5*r/2, j4+r/2-8, x0, y0 , r )+20;
			int ix4 = (int)x4;
			int iy4 = (int)y4;

			// Bilinear interpolation
			((uchar*)(imgout4->imageDataOrigin))[i4*3+(imgout4->widthStep)*j4] =
					((uchar*)(imgTemp->imageDataOrigin))[ix4*3+(imgTemp->widthStep)*iy4]* (1-abs(x4-ix4))*(1-abs(y4-iy4))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix4+1)*3+(imgTemp->widthStep)*iy4] * abs(x4-ix4)*(1-abs(y4-iy4))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix4*3+(imgTemp->widthStep)*(iy4+1)] * (1-abs(x4-ix4))*abs(y4-iy4)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix4+1)*3+(imgTemp->widthStep)*(iy4+1)] * abs(x4-ix4)*abs(y4-iy4);

			((uchar*)(imgout4->imageDataOrigin))[i4*3+1+(imgout4->widthStep)*j4] =
					((uchar*)(imgTemp->imageDataOrigin))[ix4*3+1+(imgTemp->widthStep)*iy4]* (1-abs(x4-ix4))*(1-abs(y4-iy4))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix4+1)*3+1+(imgTemp->widthStep)*iy4] * abs(x4-ix4)*(1-abs(y4-iy4))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix4*3+1+(imgTemp->widthStep)*(iy4+1)] * (1-abs(x4-ix4))*abs(y4-iy4)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix4+1)*3+1+(imgTemp->widthStep)*(iy4+1)] * abs(x4-ix4)*abs(y4-iy4);

			((uchar*)(imgout4->imageDataOrigin))[i4*3+2+(imgout4->widthStep)*j4] =
					((uchar*)(imgTemp->imageDataOrigin))[ix4*3+2+(imgTemp->widthStep)*iy4]* (1-abs(x4-ix4))*(1-abs(y4-iy4))+
					((uchar*)(imgTemp->imageDataOrigin))[(ix4+1)*3+2+(imgTemp->widthStep)*iy4] * abs(x4-ix4)*(1-abs(y4-iy4))+ 
                    ((uchar*)(imgTemp->imageDataOrigin))[ix4*3+2+(imgTemp->widthStep)*(iy4+1)] * (1-abs(x4-ix4))*abs(y4-iy4)+
					((uchar*)(imgTemp->imageDataOrigin))[(ix4+1)*3+2+(imgTemp->widthStep)*(iy4+1)] * abs(x4-ix4)*abs(y4-iy4);
		}

	cvShowImage("video", pImg);
	cvShowImage("panorama", imgout);	  
	cvShowImage("left", imgout1);
	cvShowImage("up", imgout2);
	cvShowImage("right", imgout3);
	cvShowImage("bottom", imgout4);	  

	if( cvWaitKey(2) >= 0 )
	    break;

    }

	if( ! ( fvideowrite = cvCreateVideoWriter("video1.avi",CV_FOURCC('D','I','V','X'), 30,cvSize(4*r,r),1) ) )
		{
			return 0;
		}

	cvDestroyWindow("video");
	cvDestroyWindow("panorama");
	cvDestroyWindow("letf");
	cvDestroyWindow("up");
	cvDestroyWindow("right");
	cvDestroyWindow("bottom");

	cvReleaseCapture(&pCapture);

	cvReleaseVideoWriter(&fvideowrite);

	return 0;
}

float CalculateFisheye_x( int u, int v, float x0, float y0, float r)
{
	float angle= 3.1415926*u/(2*r);
	float x = v*cos(angle)+x0;
	return x;
}

float CalculateFisheye_y( int u, int v, float x0, float y0, float r)
{
	float angle= 3.1415926*u/(2*r);
	float y = v*sin(angle)+y0;
	return y;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -