📄 testseq.cpp
字号:
p->pImg?(float)(p->pImg->height-1):1.0f);
}
}/* next record */
else
{ /* several transforms */
int i0,i1;
double v0;
double v1;
CvFileNode* pTN = (CvFileNode*)cvGetSeqElem(pTransSeq,0);
v0 = cvReadRealByName(fs, pTN,name,defv);
for(i1=1,i0=0;i1<KeyFrameNum;++i1)
{
int f0,f1;
int i;
CvFileNode* pTN = (CvFileNode*)cvGetSeqElem(pTransSeq,i1);
CvFileNode* pVN = cvGetFileNodeByName(fs,pTN,name);
if(pVN)v1 = cvReadReal(pVN,defv);
else if(pVN == NULL && i1 == KeyFrameNum-1) v1 = defv;
else continue;
f0 = KeyFrames[i0];
f1 = KeyFrames[i1];
if(i1==(KeyFrameNum-1)) f1++;
for(i=f0;i<f1;++i)
{
double val;
double t = (float)(i-f0);
int li = i - p->FrameBegin;
if(li<0) continue;
if(li>= p->TransNum) break;
if(KeyFrames[i1]>KeyFrames[i0]) t /=(float)(KeyFrames[i1]-KeyFrames[i0]);
val = t*(v1-v0)+v0;
icvUpdateTrans(
p->pTrans+li, param, val,
p->pImg?(float)(p->pImg->width-1):1.0f,
p->pImg?(float)(p->pImg->height-1):1.0f);
}/* next transform */
i0 = i1;
v0 = v1;
}/* next value run */
} /* several transforms */
}/* next parameters */
}/* next record */
}/* more complex transform */
}/* read transfroms */
return pElem;
}/* icvTestSeqReadElemOne */
static CvTestSeqElem* icvTestSeqReadElemAll(CvTestSeq_* pTS, CvFileStorage* fs, const char* name)
{
CvTestSeqElem* pElem = NULL;
CvFileNode* node;
if(name == NULL) return NULL;
node = cvGetFileNodeByName( fs, NULL, name );
if(node == NULL)
{
printf("WARNING!!! - Video %s does not exist!\n", name);
return NULL;
}
printf("Read node %s\n",name);
if(CV_NODE_IS_SEQ(node->tag))
{/* read all element in sequence */
int i;
CvSeq* seq = node->data.seq;
CvTestSeqElem* pElemLast = NULL;
for(i=0;i<seq->total;++i)
{
CvFileNode* next_node = (CvFileNode*)cvGetSeqElem( seq, i );
CvTestSeqElem* pElemNew = icvTestSeqReadElemOne(pTS, fs, next_node );
CvFileNode* pDurNode = cvGetFileNodeByName( fs, next_node,"Dur");
if(pElemNew == NULL )
{
printf("WARNING in parsing %s record!!! Can not read array element\n", name);
continue;
}
if(pElem && pElemLast)
{
pElemLast->next = pElemNew;
if(pDurNode)
{
pElemNew->FrameBegin = pElemLast->FrameBegin + pElemLast->FrameNum;
}
}
else
{
pElem = pElemNew;
}
/* find last elem */
for(pElemLast=pElemNew;pElemLast && pElemLast->next;pElemLast= pElemLast->next);
}/* next elemnt */
}/* read all element in sequence */
else
{/* read one element */
pElem = icvTestSeqReadElemOne(pTS, fs, node );
}
return pElem;
}/* icvTestSeqReadElemAll */
static void icvTestSeqReleaseAll(CvTestSeqElem** ppElemList)
{
CvTestSeqElem* p = ppElemList[0];
while(p)
{
CvTestSeqElem* pd = p;
if(p->pAVI)
{
//cvReleaseCapture(&p->pAVI);
}
if(p->pImg)cvReleaseImage(&p->pImg);
if(p->pImgMask)cvReleaseImage(&p->pImgMask);
if(p->pPos)cvFree(&p->pPos);
if(p->pTrans)cvFree(&p->pTrans);
if(p->pSize)cvFree(&p->pSize);
p=p->next;
cvFree(&pd);
}/* next element */
ppElemList[0] = NULL;
}/* icvTestSeqReleaseAll */
CvTestSeq* cvCreateTestSeq(char* pConfigfile, char** videos, int numvideo, float Scale, int noise_type, double noise_ampl)
{
int size = sizeof(CvTestSeq_);
CvTestSeq_* pTS = (CvTestSeq_*)cvAlloc(size);
CvFileStorage* fs = cvOpenFileStorage( pConfigfile, NULL, CV_STORAGE_READ);
int i;
if(pTS == NULL || fs == NULL) return NULL;
memset(pTS,0,size);
pTS->pFileStorage = fs;
pTS->noise_ampl = noise_ampl;
pTS->noise_type = noise_type;
pTS->IVar_DI = 0;
pTS->ObjNum = 0;
/* read all videos */
for(i=0;i<numvideo;++i)
{
CvTestSeqElem* pElemNew = icvTestSeqReadElemAll(pTS, fs, videos[i]);
if(pTS->pElemList==NULL)pTS->pElemList = pElemNew;
else
{
CvTestSeqElem* p = NULL;
for(p=pTS->pElemList;p->next;p=p->next);
p->next = pElemNew;
}
}/* read all videos */
{/* Calculate elements and image size and video length */
CvTestSeqElem* p = pTS->pElemList;
int num = 0;
CvSize MaxSize = {0,0};
int MaxFN = 0;
for(p = pTS->pElemList;p;p=p->next,num++)
{
int FN = p->FrameBegin+p->FrameNum;
CvSize S = {0,0};
if(p->pImg && p->BG)
{
S.width = p->pImg->width;
S.height = p->pImg->height;
}
if(MaxSize.width < S.width) MaxSize.width = S.width;
if(MaxSize.height < S.height) MaxSize.height = S.height;
if(MaxFN < FN)MaxFN = FN;
}
pTS->ListNum = num;
if(MaxSize.width == 0)MaxSize.width = 320;
if(MaxSize.height == 0)MaxSize.height = 240;
MaxSize.width = cvRound(Scale*MaxSize.width);
MaxSize.height = cvRound(Scale*MaxSize.height);
pTS->pImg = cvCreateImage(MaxSize,IPL_DEPTH_8U,3);
pTS->pImgMask = cvCreateImage(MaxSize,IPL_DEPTH_8U,1);
pTS->FrameNum = MaxFN;
for(p = pTS->pElemList;p;p=p->next)
{
if(p->FrameNum<=0)p->FrameNum=MaxFN;
}
}/* Calculate elements and image size */
return (CvTestSeq*)pTS;
}/* cvCreateTestSeq */
void cvReleaseTestSeq(CvTestSeq** ppTestSeq)
{
CvTestSeq_* pTS = (CvTestSeq_*)ppTestSeq[0];
icvTestSeqReleaseAll(&pTS->pElemList);
if(pTS->pImg) cvReleaseImage(&pTS->pImg);
if(pTS->pImgMask) cvReleaseImage(&pTS->pImgMask);
if(pTS->pFileStorage)cvReleaseFileStorage(&pTS->pFileStorage);
cvFree(ppTestSeq);
}/* cvReleaseTestSeq */
void cvTestSeqSetFrame(CvTestSeq* pTestSeq, int n)
{
CvTestSeq_* pTS = (CvTestSeq_*)pTestSeq;
pTS->CurFrame = n;
}
IplImage* cvTestSeqQueryFrame(CvTestSeq* pTestSeq)
{
CvTestSeq_* pTS = (CvTestSeq_*)pTestSeq;
CvTestSeqElem* p = pTS->pElemList;
IplImage* pImg = pTS->pImg;
IplImage* pImgAdd = cvCloneImage(pTS->pImg);
IplImage* pImgAddG = cvCreateImage(cvSize(pImgAdd->width,pImgAdd->height),IPL_DEPTH_8U,1);
IplImage* pImgMask = pTS->pImgMask;
IplImage* pImgMaskAdd = cvCloneImage(pTS->pImgMask);
CvMat* pT = cvCreateMat(2,3,CV_32F);
if(pTS->CurFrame >= pTS->FrameNum) return NULL;
cvZero(pImg);
cvZero(pImgMask);
for(p=pTS->pElemList;p;p=p->next)
{
int DirectCopy = FALSE;
int frame = pTS->CurFrame - p->FrameBegin;
//float t = p->FrameNum>1?((float)frame/(p->FrameNum-1)):0;
CvTSTrans* pTrans = p->pTrans + frame%p->TransNum;
assert(pTrans);
if( p->FrameNum > 0 && (frame < 0 || frame >= p->FrameNum) )
{ /* current frame is out of range */
//if(p->pAVI)cvReleaseCapture(&p->pAVI);
p->pAVI = NULL;
continue;
}
cvZero(pImgAdd);
cvZero(pImgAddG);
cvZero(pImgMaskAdd);
if(p->noise_type == CV_NOISE_NONE)
{/* for not noise */
/* get next frame */
icvTestSeqQureyFrameElem(p, frame);
if(p->pImg == NULL) continue;
#if 1 /* transform using T filed in Trans */
{/* calc transform matrix */
float W = (float)(pImgAdd->width-1);
float H = (float)(pImgAdd->height-1);
float W0 = (float)(p->pImg->width-1);
float H0 = (float)(p->pImg->height-1);
cvZero(pT);
{/* calc invert matrxi */
CvMat mat = cvMat(2,3,CV_32F, pTrans->T);
mat.width--;
pT->width--;
cvInvert(&mat, pT);
pT->width++;
}
CV_MAT_ELEM(pT[0], float, 0, 2) =
CV_MAT_ELEM(pT[0], float, 0, 0)*(W0/2-pTrans->T[2])+
CV_MAT_ELEM(pT[0], float, 0, 1)*(H0/2-pTrans->T[5]);
CV_MAT_ELEM(pT[0], float, 1, 2) =
CV_MAT_ELEM(pT[0], float, 1, 0)*(W0/2-pTrans->T[2])+
CV_MAT_ELEM(pT[0], float, 1, 1)*(H0/2-pTrans->T[5]);
CV_MAT_ELEM(pT[0], float, 0, 0) *= W0/W;
CV_MAT_ELEM(pT[0], float, 0, 1) *= H0/H;
CV_MAT_ELEM(pT[0], float, 1, 0) *= W0/W;
CV_MAT_ELEM(pT[0], float, 1, 1) *= H0/H;
}/* calc transform matrix */
#else
{/* calc transform matrix */
float SX = (float)(p->pImg->width-1)/((pImgAdd->width-1)*pTrans->Scale.x);
float SY = (float)(p->pImg->height-1)/((pImgAdd->height-1)*pTrans->Scale.y);
float DX = pTrans->Shift.x;
float DY = pTrans->Shift.y;;
cvZero(pT);
((float*)(pT->data.ptr+pT->step*0))[0]=SX;
((float*)(pT->data.ptr+pT->step*1))[1]=SY;
((float*)(pT->data.ptr+pT->step*0))[2]=SX*(pImgAdd->width-1)*(0.5f-DX);
((float*)(pT->data.ptr+pT->step*1))[2]=SY*(pImgAdd->height-1)*(0.5f-DY);
}/* calc transform matrix */
#endif
{/* check for direct copy */
DirectCopy = TRUE;
if( fabs(CV_MAT_ELEM(pT[0],float,0,0)-1) > 0.00001) DirectCopy = FALSE;
if( fabs(CV_MAT_ELEM(pT[0],float,1,0)) > 0.00001) DirectCopy = FALSE;
if( fabs(CV_MAT_ELEM(pT[0],float,0,1)) > 0.00001) DirectCopy = FALSE;
if( fabs(CV_MAT_ELEM(pT[0],float,0,1)) > 0.00001) DirectCopy = FALSE;
if( fabs(CV_MAT_ELEM(pT[0],float,0,2)-(pImg->width-1)*0.5) > 0.5) DirectCopy = FALSE;
if( fabs(CV_MAT_ELEM(pT[0],float,1,2)-(pImg->height-1)*0.5) > 0.5) DirectCopy = FALSE;
}
/* extract image and mask */
if(p->pImg->nChannels == 1)
{
if(DirectCopy)
{
cvCvtColor( p->pImg,pImgAdd,CV_GRAY2BGR);
}
else
{
cvGetQuadrangleSubPix( p->pImg, pImgAddG, pT);
cvCvtColor( pImgAddG,pImgAdd,CV_GRAY2BGR);
}
}
if(p->pImg->nChannels == 3)
{
if(DirectCopy)
cvCopyImage(p->pImg, pImgAdd);
else
cvGetQuadrangleSubPix( p->pImg, pImgAdd, pT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -