基本數據類型
白色矩形
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;
}