//运行参数:girl.jpg
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"ml.lib")
#pragma comment(lib,"cvaux.lib")
#pragma comment(lib,"cvcam.lib")
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
inline void cvDoubleMatPrint( const CvMat* mat );
int main( int argc, char** argv )
{
IplImage* pImg; //声明IplImage指针
//载入图像,强制转化为Gray
if( argc == 2 && (pImg = cvLoadImage( argv[1], CV_LOAD_IMAGE_UNCHANGED)) != 0 )
{
// 在点 (100,100) 和 (200,200) 之间绘制一矩形,边线用红色、宽度为 1
cvRectangle(pImg, cvPoint(100,100), cvPoint(200,200), cvScalar(0,0,255), 1);
// 圆心为(100,100)、半径为20. 圆周绿色、宽度为1
cvCircle(pImg, cvPoint(100,100), 20, cvScalar(0,255,0), 1);
// 在 (100,100) 和 (200,200) 之间、线宽为 1 的绿色线段
cvLine(pImg, cvPoint(100,100), cvPoint(200,200), cvScalar(0,255,0), 1);
//printf("sizeof(double)=%d\n",sizeof(double)); //=8
//CvMat* cvCreateMat(int rows, int cols, int type);
/*
type: 矩阵元素类型.
按CV_<bit_depth>(S|U|F)C<number_of_channels> 方式指定. 例如: CV_8UC1 、CV_32SC2.
示例:
*/
//CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
CvMat* M1 = cvCreateMat(4,4,CV_64FC1);
cvSetIdentity(M1);//初始化矩阵为单位矩阵
int i,j;
//cvmSet(M1,1,1,2.0); // Set M(i,j)
int n = M1->cols;
float *data = M1->data.fl;
//data[i*n+j] = 3.0;
printf("\n=====赋值为3.0==============\n");
//void cvmSet( CvMat* mat, int row, int col, double value )
for(i=0;i<4;i++)
for(j=0;j<4;j++)
//cvmSet(M1,i,j,3.0);
data[i*n+j] = 3.0;
//cvmGet(M,i,j); // Get M(i,j)
//CV_INLINE double cvmGet( const CvMat* mat, int row, int col )
for( i=0;i<4;i++)
{
for( j=0;j<4;j++)
printf("%f ",cvmGet(M1,i,j));
printf("\n");
}
printf("\n===End:赋值为3.0==============\n");
CvMat* M2;
M2=cvCloneMat(M1);//复制矩阵
printf("=============================\n");
{
printf("=======方式一、逐点赋值式====\n");
CvMat* mat = cvCreateMat( 2, 2, CV_64FC1 );
cvZero( mat );
cvmSet( mat, 0, 0, 1 );
cvmSet( mat, 0, 1, 2 );
cvmSet( mat, 1, 0, 3 );
cvmSet( mat, 1, 1, 4 );
cvDoubleMatPrint(mat);
cvReleaseMat( &mat );
printf("\n=====End:方式一、逐点赋值式====\n");
}
//初始化矩阵
{
double a[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
CvMat Ma=cvMat(3, 4, CV_64FC1, a);
printf("===使用数组初始化====================\n");
for( i=0;i<3;i++)
{
for( j=0;j<4;j++)
printf("%lf ",cvmGet(&Ma,i,j));
printf("\n");
}
printf("===修改数组值=================\n");
a[1*4+1] = 2.0; // Ma(i,j)=2.0;
for( i=0;i<3;i++)
{
for( j=0;j<4;j++)
printf("%f ",cvmGet(&Ma,i,j));
printf("\n");
}
printf("=====End:使用数组初始化============\n");
//等价于:
{
CvMat Ma;
cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
}
}
//printf("%x\n",M1);
cvReleaseMat(&M1);//释放矩阵内存:CVAPI(void) cvReleaseMat( CvMat** mat );
//printf("%x\n",M1);//成功释放后M1被置为了NULL
cvReleaseMat(&M2);
cvNamedWindow( "Image", 1 ); // 创建窗口
cvShowImage( "Image", pImg ); // 显示图像
cvWaitKey(0); // 等待按键
cvDestroyWindow( "Image" ); // 销毁窗口
cvReleaseImage( &pImg ); // 释放图像
return 0;
}
return -1;
}
inline void cvDoubleMatPrint( const CvMat* mat )
{
int i, j;
for( i = 0; i < mat->rows; i++ )
{
for( j = 0; j < mat->cols; j++ )
{
printf( "%lf ",cvmGet( mat, i, j ) );
}
printf( "\n" );
}
}
=====赋值为3.0==============
32.000008 32.000008 32.000008 32.000008
32.000008 32.000008 32.000008 32.000008
0.000000 0.000000 1.000000 0.000000
0.000000 0.000000 0.000000 1.000000
===End:赋值为3.0==============
=============================
=======方式一、逐点赋值式====
1.000000 2.000000
3.000000 4.000000
=====End:方式一、逐点赋值式====
===使用数组初始化====================
1.000000 2.000000 3.000000 4.000000
5.000000 6.000000 7.000000 8.000000
9.000000 10.000000 11.000000 12.000000
===修改数组值=================
1.000000 2.000000 3.000000 4.000000
5.000000 2.000000 7.000000 8.000000
9.000000 10.000000 11.000000 12.000000
=====End:使用数组初始化============