基本数据类型
白色矩形
void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,
int thickness=1, int line_type=8, int shift=0 );参数1:图像;
参数2:矩形的一个顶点
参数3:矩形另一个顶点
参数4:线条颜色(RGB)或亮度(灰度图像)
可省略(有重载函数):
参数5:线条粗细程度,取CV_FILLED表填充色彩矩阵
参数6:线条类型
参数7:坐标点的小数
#include "cv.h"
#include "highgui.h"
#include "pch.h"
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char* argv[])
{
IplImage* img = cvLoadImage("C:\\Users\\MR_Z\\Desktop\\1.jpg");
cvNamedWindow("first", CV_WINDOW_AUTOSIZE);
//********************
//
cvRectangle(img, cvPoint(5, 5), cvPoint(20, 100), cvScalar(255, 255, 255));
cvShowImage("first", img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("first");
}
矩阵和图像类型
cvMat* cvCreateMat(int rows, int cols, int type); //新建二维矩阵
3-1:CvMat结构:矩阵头
typedef struct CvMat{
int type;
int step;
int* refcount;
union{
uchar* ptr;
short* s;
int* i;
float* f1;
double* db;
}data;
union{
int rows;
int height;
};
union{
int cols;
int width;
};
} CvMat;
创建矩阵方法:
1.cvCreateMat();//由多个原函数租成,如cvCreateMatHeader();创建结构不分配内存;cvCreateData();分配内存
2.cvCreateMatHeader();
3.cvCloneMat(cvMat*);//从现有矩阵创建新的矩阵,cvReleaseMat(CvMat*)释放
3-2:矩阵创建与释放
//创建一个矩阵
CvMat* cvCreateMat( int rows, int cols, int type );
// Create only matrix header without allocating data
//创建一个头矩阵(没有分配空间)
CvMat* cvCreateMatHeader( int rows, int cols, int type );
//在现在的矩阵初始化头文件
CvMat* cvInitMatHeader(
CvMat* mat,
int rows,
int cols,
int type,
void* data = NULL,
int step = CV_AUTOSTEP
);
//初始化并分配空间
CvMat cvMat(
int rows,
int cols,
int type,
void* data = NULL
);
//赋值一个矩阵
CvMat* cvCloneMat( const cvMat* mat );
//释放矩阵内存
void cvReleaseMat( CvMat** mat );
3-3:固定数据创建OpenCV矩阵
float vals = [0.866025, -0.500000, 0.500000, 0.866025];
cvMat rotmat;
cvInitMatHeader(
&rotmat,
2,
2,
CV_32FC1,
vals);
矩阵创建之后常用操作:
cvGetElemType(const CvArr* arr);//返回数据中元素类型
cvGetDiams(const CvArr* arr, int* sizes=NULL);//返回矩阵维度
cvGetDiamSize(const CvArr* arr, int index);//返回矩阵在某一个维数上矩阵的大小
3-4/3-5:存取矩阵
//宏存取矩阵
//3-4
CvMat* mat = cvCreateMat(5,5,CV_32FC1);
float element_3_2 = CV_MAT_ELEM(*mat, float,3,2);
//3-5
CvMat* mat = cvCreateMat(5,5,CV_32FC1);
float element_3_2 = 7.7;
*((float*)CV_MAT_ELEM_PTR(*mat,3,2)) = element_3_2;
//指针访问矩阵结构
//3-6
uchar* cvPtr1D(
const CvArr* arr,
int idx0,
int* type = NULL
);
uchar* cvPtr2D(
const CvArr* arr,
int idx0,
int idx1,
int* type = NULL
);
uchar* cvPtr3D(
const CvArr* arr,
int idx0,
int idx1,
int idx2,
int* type = NULL
);
uchar* cvPtrND(
const CvArr* arr,
int* idx,
int* type = NULL,
int create_node = 1,
unsigned* precalc_hashval = NULL
);
3-7/3-8:
恰当的访问方式:
数据是按光栅扫描顺序存储,列(x)是变化最快的变量
#include "cv.h"
#include "highgui.h"
#include "pch.h"
#include <opencv2/opencv.hpp>
using namespace cv;
float sum(CvMat* mat) {
float s = 0.0f;
for (int row = 0; row < mat->height; row++) {
float* ptr = mat->data.fl + row * mat->step / 4;
for (int col = 0; col < mat->width; col++) {
s += *ptr++;
}
}
return(s);
};
int main(int argc, char** argv)
{
CvMat *mat = cvCreateMat(5, 5, CV_32FC1);
float element_3_2 = 7.7;
*((float*)CV_MAT_ELEM_PTR(*mat, 3, 2)) = element_3_2;
cvmSet(mat, 4, 4, 0.5000);
cvSetReal2D(mat, 3, 3, 0.5000);
float s = sum(mat);
printf("%f\n", s);
system("pause");
return 0;
}