《學習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;
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章