CvMat資料結構的操作1
#include <cv.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
uchar Array[]={1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,
5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,
9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12};
double Channel1[3][4];
double Channel2[3][4];
double Channel3[3][4];
double Channel4[3][4];
CvMat Matrix1,*Matrix2;
Matrix1=cvMat(3,4,CV_8UC4,Array);
CvScalar Scalar1;
Matrix2=cvCloneMat(
&
Matrix1);/*Load Matrix Channels*/
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
Scalar1=cvGet2D(
&
Matrix1,i,j);Channel1[i][j]=Scalar1.val[0];
Channel2[i][j]=Scalar1.val[1];
Channel3[i][j]=Scalar1.val[2];
Channel4[i][j]=Scalar1.val[3];
}
}
/*Implement Algorithms*/
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%.lf\n",Channel1[i][j]);
}
}
/*Save Matrix Channels*/
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
Scalar1.val[0]=Channel1[i][j];
Scalar1.val[1]=Channel2[i][j];
Scalar1.val[2]=Channel3[i][j];
Scalar1.val[3]=Channel4[i][j];
cvSet2D(Matrix2,i,j,Scalar1);
}
}
system("pause");
}
執行結果:
這裡做的是一個CvMat通道四的實作,而用cvCloneMat()複製了一份CvMat資料結構再將結果存回被複製的資料結構中,這邊要注意的是指標的運算,用cvMat()開啟矩陣,跟cvCloneMat()複製一份矩陣是有些微差異的,而再做cvGet2D(),cvSet2D()存取時規定要用double型別,用cvGet2D()的方法實際上就可以減少前面CvMat資料結構直接存取的一維陣列的運算,j的for迴圈也不需要一次跳4了,用這種方式來寫CvMat的Code是在好不過了.
cvCloneMat()
複製一份相同的CvMat資料結構,如果用cvMat()創造矩陣,則需要注意到指標的問題.
cvCloneMat(CvMat資料結構)
2 意見:
你好 请问cvmMul是否支持3通道矩阵运算?我的这样却不行!
float array1[]={3,1,2,0,1,5,1,2,0
,1,2,3,4,7,5,1,2,0};
void PrintMatrix(CvMat *Matrix,int Rows,int Cols,int Channels);
int main()
{
CvMat *A=cvCreateMat(2,3,CV_32FC3);
CvMat *B=cvCreateMat(3,2,CV_32FC3);
CvMat *ResultMatrix=cvCreateMat(2,2,CV_32FC3);
cvSetData(A,array1,A->step);
cvSetZero(B);
cvTranspose(A,B);
printf("cvmMul():\n");
cvmMul(A,B,ResultMatrix);
PrintMatrix(ResultMatrix,2,2,3);
system("pause");
return 1;
}
显示矩阵输出函数不能打上去,很抱歉哦 ,难道说3通道以上就不支持了?
嗯~
是的,不過你可以改用IplImage資料結構,用COI的方法對每個通道做個別的運算,或者是用cvSplit()的方法做通道分割再個別運算,
張貼留言