📄 video.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 + -