OpenCV - Mat 구조 상세 설명

6181 단어 opencv
OpenCV 를 능숙 하 게 사용 하려 면 먼저 가장 중요 한 것 은 Mat 데이터 구 조 를 배 우 는 것 이다. 다음은 그 응용 을 상세히 소개 한다.opencv 에서 Mat 는 하나의 클래스 로 정의 되 고 데이터 구조 로 볼 수 있 으 며 행렬 의 형식 으로 데 이 터 를 저장 합 니 다.여기 서 먼저 Mat 의 기본 속성 을 소개 합 니 다.
Mat 의 흔 한 속성
data  uchar    。Mat        :               ,data           。 
dims      ,  5*6       , dims=2,    dims=3. 
rows        
cols         
size      ,size(cols,rows) 
channels           ,         ,      RGB 
type                      ,            ,      CV_(  )+(    )+(   ) :,CV_8UC3 
depth                 ,    type    。   type  CV_8UC3,  2   16       。  ,depth  CV_8UC 
elemSize              

Mat 는 매우 많은 생 성 방법 이 있 습 니 다. 다음은 몇 가지 흔히 볼 수 있 는 방식 을 소개 합 니 다.
1. Mat M 은 데이터 가 없 는 매트릭스 헤드 를 만 듭 니 다.2、Mat M(2,2,CV_8UC3,Scalar(0,0,1)); 2 * 2 크기 의 행렬, 각 요 소 는 3 채널 8 비트 부호 없 는 정수 입 니 다. 다음 과 같 습 니 다. 0, 01, 0, 1, 0, 1, 0, 1, 3, Mat M (2, 2, CV 8UC1, Scalar (10);위 와 유사: 10, 10, 10, 4, Mat M (2, 2, CV 8UC 1, Scalar:: all (0);데이터 가 모두 0 입 니 다.5、Mat M = (Mat_(3,3) << 1,2,3,4,5,6,7,8,9); 초기 화 할당 주의 문제: Mat 는 row (), col () 함 수 를 통 해 각 줄 에 접근 할 수 있 습 니 다. Mat 구 조 는 clone (), copy To () 함 수 를 통 해 복사 할 수 있 습 니 다. 직접 할당 하면 새 Mat 의 data 를 원래 Mat 의 data 에 만 가리 키 고 데이터 필드 를 다시 만 들 지 않 습 니 다.
그 밖 에 Mat 는 행렬 을 만 들 고 초기 화 하 는 데 자주 사용 되 는 함수 도 있 습 니 다. Mat E = Mat: eye (4, 4, CV 64F);Mat Z = Mat::zeros(4,4,CV_32F); Mat O = Mat::ones(4,4,CV_8UC1); 각각 4 * 4 의 단위 행렬, 0 행렬, 1 행렬 을 만 드 는 데 사 용 됩 니 다. Matlab 의 행렬 과 유사 합 니 다.
Mat 데이터 출력
vs 에서 Mat 출력 데 이 터 는 매우 편리 합 니 다. cout 를 직접 사용 하면 Mat 의 데 이 터 를 데이터 할 수 있 고 서로 다른 출력 형식 도 포함 되 어 있 습 니 다.format (Mat, ") 함 수 를 통 해 이 루어 질 수 있 습 니 다." "의 서로 다른 값 은 서로 다른 출력 형식 을 대표 합 니 다. C, python, csv, numpy, 기본 형식 은 matlab 와 같 습 니 다.
Mat 데이터 읽 기와 옮 겨 다 니 기
Mat 는 주로 이미지 데 이 터 를 저장 하 는 데 사용 되 기 때문에 데이터 의 옮 겨 다 니 는 방법 을 상세 하 게 설명 하지 않 습 니 다. 구체 적 인 방법 은 다음 OpenCV - 이미지 의 기본 동작 을 볼 수 있 습 니 다.
다음은 Mat 에 행렬 을 만 드 는 테스트 코드 입 니 다.
#include<iostream> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;  

int main()
{
    Mat E = Mat::eye(4,4,CV_64F);
    Mat Z = Mat::zeros(4,4,CV_32F);
    Mat O = Mat::ones(4,4,CV_8UC1);
    cout << "E:
"
<< E << endl; cout << "Z:
"
<< Z << endl; cout << "O:
"
<< O << endl; Mat M(2,2,CV_8UC3,Scalar(0,0,1)); Mat M1(2,2,CV_8UC1,Scalar::all(0)); Mat M2; M2.create(2,2,CV_8UC1); Mat M3 = (Mat_<double>(3,3) << 1,2,3,4,5,6,7,8,9); Mat M4 = M3.row(1); Mat M5(5,5,CV_8UC1,Scalar(10)); cout << "M:
"
<< M << endl; cout << "M1:
"
<< M1 << endl; cout << "M2:
"
<< M2 << endl; cout << "M3:
"
<< M3 << endl; cout << "M4:
"
<< M4 << endl; cout << "M4(Format C):
"
<< format(M4,"C") << endl; // cout << "M5:
"
<< M5 << endl; waitKey(0); return 0; }

다음으로 이동:http://blog.sina.com.cn/s/blog_6a0e04380100r289.html
매트릭스 데이터 형식:
  CV_<bit_depth>(S|U|F)C<number_of_channels>

S = 기호 정형 U = 부호 없 는 정형 F = 부동 소수점 형
E.g.:
CV_8UC1 은 8 비트 부호 없 는 단일 채널 행렬 을 말한다.
CV_32FC 2 는 32 비트 부동 소수점 형 2 채널 행렬 을 말한다.
CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1 CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2 CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3 CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4 CV_32SC1 CV_32FC1 CV_64FC1 CV_32SC2 CV_32FC2 CV_64FC2 CV_32SC3 CV_32FC3 CV_64FC3 CV_32SC4 CV_32FC4 CV_64FC4
그 중에서 통 로 는 점 마다 몇 개의 수 를 저장 할 수 있 는 지 를 나타 내 는데 RGB 컬러 그림 의 모든 픽 셀 점 은 세 개의 값, 즉 세 개의 채널 과 유사 하 다.
그림 속 의 깊이 는 각 값 이 몇 자리 에 저장 되 는 지 를 나타 내 는 정밀도 문제 이 고 일반 그림 은 8bit (비트) 이면 깊이 는 8 이다.

좋은 웹페이지 즐겨찾기