《学习OpenCV》 - 初探OpenCV(三)

基本数据类型

白色矩形

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;
}

猜你喜欢

转载自blog.csdn.net/xiyangsu2617/article/details/83338552