【矩阵处理】
1.
因为OpenCV使用C语言来进行矩阵操作,但是用C++的替代方案可以更加高效地完成操作。
在OpenCV中向量被当做是有一个维数为1的N维矩阵。
矩阵按照行—行方式存储,每行4byte(32bit)对齐。
2.
CvMat
其中
Eg: CvMat * M=cvCreateMat(4,4,CV_32FC1);
3.
CvMat
cvReleaseMat(&M);
4.
CvMat *M1=cvCreateMat(4,4,CV_32FC1);
cvMat *M2;
M2=cvCloneMat(M1);
5.
double
CvMat
等价于
CvMat Ma;
cvInitMatHeader(&Ma,3,4,CV_64FC1,a);
6.
CvMat *M=cvCreateMat(4,4,CV_32FC1);
cvSetIdentity(M);
7.
假设我们现在需要访问一个2D浮点型矩阵的第(i,j)个单元
1.
cvmSet(M,I,j,2.0); //设置M的(I,j)位置的值为2.0
t=cvmGet(M,I,j)
2.
CvMat *M=cvCreateMat(4,4,CV_32FC1);
Int
Float *data= M->data.f1;
Data[i*n+j]=3.0;
3.
CvMat *M=cvCreateMat(4,4,CV_32FC1);
Int
Float *data=M->data.f1;
(data+i*step)[j]=3.0;
4.
double a[16];
CvMat Ma=cvMat(3,4,CV_64FC1,a);
a[i*4+j]=2.0
【基本运算】
1.
CvMat *Ma,*Mb,*Mc;
cvAdd(Ma,Mb,Mc);
cvSub(Ma,Mb,Mc);
cvMatMul(Ma,Mb,Mc);
2.
CvMat
cvMul(Ma,Mb, Mc);
cvDiv(Ma,Mb,Mc);
cvAddS(Ma,cvScalar(-10.0),Mc); //Ma-10->Mc
3.
double
double
double
CvMat Va=cvMat(3,1,CV_64FC1,va);
CvMat Vb=cvMat(3,1,CV_64FC1,vb);
CvMat Vc=cvMat(3,1,CV_64FC1,vc);
Double res=cvDotProduct(&Va,&Vb);//向量点乘
cvCrossProduct(&Va,&Vb,&vc);//向量叉乘
4.
CvMat * Ma,* Mb;
cvTranspos(Ma,Mb);//转置
CvScalar t=cvTrace(Ma);
cvInvert(Ma,Mb);//逆矩阵 inv(Ma)->Mb
5.
cvMat *A=cvCreateMat(3,3,CV_32FC1);
cvMat *x=cvCreateMat(3,1,CV_32FC1);
CvMat *b=cvCreateMat(3,1,CV_32FC1);
cvSolve(&A,&b,&x);
6.
CvMat *A=cvCreateMat(3,3,CV_32FC1);
CvMat *E=cvCreateMat(3,3,CV_32FC1);
CvMat *I=cvCreateMat(3,1,CV_32FC1);
cvEigenVV(A,E,l);//l=A的特征值(递减顺序)
7.
CVMat *A=cvCreateMat(3,3,CV_32FC1);
标志位使得矩阵U或者V按照转置的形式返回(若不转置可能运算出错)
【OpenCV视频处理】
1.
(1)
(2)
CvCapture *capture=cvCaptureFromCAM(0);
(3)
CvCapture *capture=cvCaptureFromAVI(“infile.avi”);
(4)
IplImage *img=0;
If(!cvGrabFrame(capture)){
}
Img=cvRetrieveFrame(capture);
(5)
cvReleaseCapture(&capture);
2.
(1)
CvQueryFrame(capture);//在读取视频流信息之前,要先执行此操作
int
int
int
int numFrames=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);
fps仅仅对于视频文件有效,但是不太准确
(2)
float posMsec=cvGetCaptureProperty(capture,CV_CAP_PROP_POS_MSEC):
int posFrames=(int) cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES):
float posRatio=cvGetCaptureProperty(capture,CV_CAP_PROP_POS_AVI_RATIO);
(3)
CvSetCaptureProperty(capture,CV_CAP_PROP_POS_AVI_RATIO,(double)0.9);
3.
(1)
CvVideoWriter *writer=0;
int isColor=1;
int fps=25;
int frameW =640;
int frameH=480;
write=cvCreateVideoWriter(“out.avi”,CV_FOURCC(‘P’,’I’,’M’,’1’),
其他的编码器代号包括:
其它的编码器代号包括: CV_FOURCC('P','I','M','1') = MPEG-1 codec CV_FOURCC('M','J','P','G') = motion-jpeg codec (does not work well) CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec CV_FOURCC('U', '2', '6', '3') = H263 codec CV_FOURCC('I', '2', '6', '3') = H263I codec CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec 若编码器代号为 -1,则运行时会弹出一个编码器选择框.
(2)
IplImage *img=0;
Int nFrames=50;
for(i=0;i
{
}
要查看所抓取到的帧画面,在循环中加入下列语句即可:
注意显示的时候cvWaitkey不能小于20ms,否则画面的显示可能出错。
(3)
cvReleaseVideoWriter(&writer);