Opencv 의 데이터 구조
구조
구성원
의의
CvPoint
int x,y
그림 의 점
CvPoint2D32f
float x,y
2 차원 공간의 점
CvPoint3D32f
float x,y,z
3 차원 공간의 점
CvSize
int width,height
그림 크기
CvRect
int x,y,width,height
그림 의 부분 영역
CvScalar
double val[4]
RGBA 값
Mat 데이터 구조
class CV_EXPORTS Mat
{
public:
// ... a lot of methods ...
...
/*! includes several bit-fields:
- the magic signature
- continuity flag
- depth
- number of channels
*/
int flags;
//! the array dimensionality, >= 2
int dims;
//! the number of rows and columns or (-1, -1) when the array has more than 2 dimensions
int rows, cols;
//! pointer to the data
uchar* data;
//! pointer to the reference counter;
// when array points to user-allocated data, the pointer is NULL
int* refcount;
// other members
...
};
상기 구조 체 를 통 해 알 수 있 듯 이 Mat 도 하나의 매트릭스 헤드 로 두 개의 데이터 부분 으로 구성 된다. 매트릭스 헤드 (매트릭스 사이즈, 저장 방법, 저장 주소 등 정보 포함) 와 모든 픽 셀 값 을 저장 하 는 매트릭스 (선택 한 저장 방법 에 따라 매트릭스 가 서로 다른 차원 일 수 있 음) 를 가리 키 는 지침 이다.기본적으로 메모 리 를 할당 하지 않 고 메모리 만 가리 키 고 있 습 니 다. (읽 기와 쓰기 보호 에 주의 하 십시오.)그러나 행렬 자체 의 사 이 즈 는 이미지 에 따라 다 르 고 행렬 헤드 의 크기 보다 몇 개의 수량 급 이 크다.따라서 프로그램 에서 이미 지 를 전달 하고 복사 본 을 만 들 때 큰 비용 은 정보 헤더 가 아 닌 행렬 에 의 해 발생 한다.이 문 제 를 해결 하기 위해 OpenCV 는 인용 계수 체 제 를 사용한다.그 사고방식 은 모든 Mat 대상 에 게 자신의 정보 헤드 를 가지 게 하지만 같은 행렬 을 공유 하 게 하 는 것 이다.이것 은 행렬 포인터 가 같은 주 소 를 가리 키 도록 함으로써 이 루어 진다.복사 구조 함 수 는 정보 헤드 와 행렬 지침 만 복사 하고 행렬 을 복사 하지 않 습 니 다.
초기 화 사용
create
함수 또는 Mat
그러나 가끔 은 행렬 자체 (정보 헤드 와 행렬 지침 뿐만 아니 라) 를 복사 하려 고 할 때 함수 clone()
나 copyTo()
를 사용 할 수 있 습 니 다./*CV_32FC2 :*/
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
예 초기 화
Mat(nrows, ncols, type, fillValue);
M.create(nrows, ncols, type);
:
Mat M(7,7,CV_32FC2,Scalar(1,3)); /* 1+3j*/
M.create(100, 60, CV_8UC(15)); /* 15 8bit */
/* 100*100*100 8 */
int sz[] = {100, 100, 100};
Mat bigCube(3, sz, CV_8U, Scalar:all(0));
/* */
double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
Mat M = Mat(3, 3, CV_64F, m).inv();
/* */
Mat img(Size(320,240),CV_8UC3);
Mat img(height, width, CV_8UC3, pixels, step); /*const unsigned char* pixels,int width, int height, int step*/
/* Mat*/
IplImage* img = cvLoadImage("greatwave.jpg", 1);
Mat mtx(img); // convert IplImage* -> Mat; /* , */
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;
행렬 의 생 성과 방출
CvMat* cvCreateMat( int rows, int cols, int type ); //
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 );// mat
void cvReleaseMat( CvMat** mat ); //
CvMat, Mat, IplImage 간 의 상호 전환
IpIImage -> CvMat
/*cvGetMat*/
CvMat matheader;
CvMat * mat = cvGetMat(img, &matheader);
/*cvConvert*/
CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3);
cvConvert(img, mat)
IplImage -> Mat
Mat::Mat(const IplImage* img, bool copyData=false);/*default copyData=false, IplImage , */
:
IplImage* iplImg = cvLoadImage("greatwave.jpg", 1);
Mat mtx(iplImg); /* IplImage * -> Mat, ; or : Mat mtx = iplImg;*/
Mat -> IplImage
Mat M
IplImage iplimage = M; /* , */
CvMat -> Mat
Mat::Mat(const CvMat* m, bool copyData=false); /* IplImage -> Mat, */
Mat -> CvMat
( Mat imgMat ):
CvMat cvMat = imgMat;/*Mat -> CvMat, IplImage,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.