搜档网
当前位置:搜档网 › 视频稳像处理代码-C语言opencv

视频稳像处理代码-C语言opencv

#include "iostream.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main(int argc, char* argv[])
{

//输入原始视频
IplImage * pFrame;
CvCapture * pCapture = cvCreateFileCapture( "AAA.avi" ); //读入视频流
// CvCapture * pCapture = cvCaptureFromCAM(0);SampleVideo
CvSize size = cvSize(
(int)cvGetCaptureProperty( pCapture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty( pCapture, CV_CAP_PROP_FRAME_HEIGHT)
);
//稳定处理后输出视频

// int isColor = 1;
int fps = 25; // or 30
// int frameW = 640; // 744 for firewire cameras
// int frameH = 480; // 480 for firewire cameras
#ifndef NOWRITE
CvVideoWriter* writer = cvCreateVideoWriter(
"out1AAAVideo.avi",
CV_FOURCC('M','J','P','G'),
fps,
size

);
#endif

//稳像处理过程

pFrame = cvQueryFrame( pCapture ); //第一帧

IplImage * pGrayImg = cvCreateImage( cvGetSize(pFrame), 8, 1 ); //由第一帧灰度信息 创建一个8位灰度图像
pGrayImg->origin = pFrame->origin;
uchar * pGrayData = (uchar *)pGrayImg->imageData;
int nStep = pGrayImg->widthStep/(sizeof(uchar));

//显示通道
IplImage * pStableImg = cvCreateImage( cvGetSize(pFrame), 8, 3 );//建立稳定后图像通道
pStableImg->origin = pFrame->origin;
uchar * pStableData = (uchar *)pStableImg->imageData;
int nCStep = pStableImg->widthStep/(sizeof(uchar));
cvZero(pStableImg);

IplImage * pHisHorImg = cvCreateImage( cvSize(256,240), 8, 3 );//垂直宽高
pHisHorImg->origin = 1;
cvZero(pHisHorImg);

IplImage * pCHisHorImg = cvCreateImage( cvSize(256,480), 8, 3 );//动态
pCHisHorImg->origin = 1;
cvZero(pCHisHorImg);

IplImage * pHisVerImg = cvCreateImage( cvSize(320,256), 8, 3 );
pHisVerImg->origin = 1;
cvZero(pHisVerImg);

IplImage * pCHisVerImg = cvCreateImage( cvSize(640,256), 8, 3 );
pCHisVerImg->origin = 1;
cvZero(pCHisVerImg);


cvNamedWindow("Origin");
cvNamedWindow("Stabilization");
// cvNamedWindow("HisHor");
cvNamedWindow("HisVer");
// cvNamedWindow("CHisHor");
cvNamedWindow("CHisVer");

int nWidth = cvGetSize(pFrame).width;
int nHeight = cvGetSize(pFrame).height;
int i,j;
long numFrame = 0;

//投影数组 视频处理
int horPrj[360] = {0};
int verPrj[480] = {0};

int CurHorPrj[480] = {0};
int CurVerPrj[640] = {0};
int m , n ;
int DevX, DevY;

pFrame = cvQueryFrame( pCapture );
cvWaitKey(800);
pFrame = cvQueryFrame( pCapture );

cvCvtColor( pFrame, pGrayImg, CV_BGR2GRAY );
cvSmooth( pGrayImg, pGrayImg, CV_MEDIAN) ;

//参考帧投影
// for ( i = 120; i < 360 ; i++)
// {
// temp = i*nStep + 160;
// horPrj[m] = 0;
// for ( j = 160 ; j < 480; j++)
// {
// horPrj[m] += pGrayData[ temp++ ] ;


// }
// horPrj[m] /= 320;
// m++;
// }
//
// for ( j = 160; j < 480 ; j++)
// {
// temp = 120*nStep + j;
// verPrj[n] =
0;
// for ( i = 120 ; i < 360; i++)
// {
// verPrj[n] += pGrayData[ temp ] ;
// temp += nStep;
// }
// verPrj[n] /= 240;
// n++;
// }
//
// for ( i = 0; i < 240 ; i++)
// {
// cvLine(pHisHorImg, cvPoint(i,0), cvPoint(i,horPrj[i]), CV_RGB(255,100,100), 1, 8);
// }
// for ( i = 0; i < 320 ; i++)
// {
// cvLine(pHisVerImg, cvPoint(i,0), cvPoint(i,verPrj[i]), CV_RGB(100,255,100), 1, 8);
// }
//参考帧投影
m = 0;
n = 0;

for ( i = 120; i < 350; i++)
{
horPrj[m] = 0;
for ( j = 160 ; j < 480; j++)
{
horPrj[m] += pGrayData[ i*nStep + j ] ;
}
horPrj[m] /= 320;
m++;
}

for ( j = 160; j < 480 ; j++)
{
verPrj[n] = 0;
for ( i = 120 ; i < 350; i++)
{
verPrj[n] += pGrayData[ i*nStep + j ] ;
}
verPrj[n] /= 240;
n++;
}

for ( i = 0; i < 240 ; i++)
{
cvLine(pHisHorImg, cvPoint(0,i), cvPoint(horPrj[i],i), CV_RGB(255,100,100), 1, 8);
}
for ( i = 0; i < 320 ; i++)
{
cvLine(pHisVerImg, cvPoint(i,0), cvPoint(i,verPrj[i]), CV_RGB(100,255,100), 1, 8);
}
//

// cvShowImage("HisHor",pHisHorImg);
cvShowImage("HisVer",pHisVerImg);

while( pFrame = cvQueryFrame( pCapture ) )
{
// cvWriteFrame(writer,pFrame);
numFrame++;
cvCvtColor( pFrame, pGrayImg, CV_BGR2GRAY );
cvSmooth( pGrayImg, pGrayImg, CV_MEDIAN) ;

m = 0;
n = 0;

//当前帧投影

for ( i = 0; i < 480 ; i++)
{
CurHorPrj[m] = 0;
for ( j = 120 ; j < 480; j++)
{
CurHorPrj[m] += pGrayData[ i*nStep + j ] ;

}
CurHorPrj[m] /= 320;
m++;
}

for ( j = 0; j < 640 ; j++)
{
CurVerPrj[n] = 120;
for ( i = 120 ; i < 360; i++)
{
CurVerPrj[n] += pGrayData[ i*nStep + j ] ;
}
CurVerPrj[n] /= 240;
n++;
}

for ( i = 0; i < 480 ; i++)
{
cvLine(pCHisHorImg, cvPoint(0,i), cvPoint(CurHorPrj[i],i), CV_RGB(255,100,100), 1, 8);
}
cvLine(pCHisHorImg, cvPoint(0,120), cvPoint(255,120), CV_RGB(255,100,100), 1, 8);

for ( i = 0; i < 640 ; i++)
{
cvLine(pCHisVerImg, cvPoint(i,0), cvPoint(i,CurVerPrj[i]), CV_RGB(100,255,100), 1, 8);
}
cvLine(pCHisVerImg, cvPoint(120,0), cvPoint(120,255), CV_RGB(100,255,100), 1, 8);


//相关运算绝对误差和
long MinY = 1000000000;
long SumY = 0;
long MinX = 1000000000;
long SumX = 0;

for ( i = 80; i < 220; i++)
{
SumY = 0;
for ( j = 0; j < 240; j++)
{
SumY += abs(horPrj[j] - CurHorPrj[j+i]);
}
if (SumY < MinY)
{
MinY = SumY;
DevY = i - 120;
}
}
for ( i = 80; i < 240; i++)
{
SumX = 0;
for ( j = 0; j < 320; j++)
{
SumX += abs(verPrj[j] - CurVerPrj[j+i]);
}
if (SumX < MinX)
{
MinX = SumX;
DevX = i - 160;
}
}

cout<<"Y "<<DevY<<" X "<<DevX<<endl;

//运动补偿区域 写处理后视频大小有


稳定内存相关
/* */
for ( i =70; i < 360 ; i++)
{
for ( j =100; j < 550; j++)

{
pStableData[i*nCStep + 3*j] = pFrame->imageData[(i+DevY)*nCStep + 3*(j+DevX)] ;
pStableData[i*nCStep + 3*j + 1] = pFrame->imageData[(i+DevY)*nCStep + 3*(j+DevX) + 1] ;
pStableData[i*nCStep + 3*j + 2] = pFrame->imageData[(i+DevY)*nCStep + 3*(j+DevX) + 2] ;
}
}


cvRectangle(pFrame, cvPoint(80, 60), cvPoint(nWidth-130, nHeight-110), CV_RGB(0,255,100), 1, 8);

// cvLine(pFrame, cvPoint(60,20), cvPoint(260,20), CV_RGB(255,0,0), 1, 8);

//窗体显示
cvSetImageROI(pFrame, cvRect(80,30,480,350));
cvSetImageROI(pStableImg, cvRect(80,60,480,320));

cvShowImage("Origin",pFrame);
cvShowImage("Stabilization",pStableImg);
cvResetImageROI(pFrame);

// cvShowImage("CHisHor",pCHisHorImg);
cvShowImage("CHisVer",pCHisVerImg);
cvZero(pCHisHorImg);
cvZero(pCHisVerImg);



//writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),
// fps,cvSize(frameW,frameH),isColor);
//cvGrabFrame(capture); // capture a frame
//img=cvRetrieveFrame(capture); // retrieve the captured frame
//写视频
cvWriteToAVI( writer, pStableImg ); // add the frame to the file
char c = cvWaitKey(80);
if( c == 30 )
break;
}

// cvReleaseVideoWriter(&writer);
cvReleaseCapture( &pCapture );
cvReleaseVideoWriter( &writer );
cvDestroyAllWindows();
return 0;


}














相关主题