OpenCV 소 백 학습 노트 (3) 이미지 처리

21510 단어 opencv컴퓨터 시각
이미지 처리 (3)
매트 대상
**1.Mat   IplImage  
2.Mat    
3.Mat    **

Mat 대상 OpenCV 2.0 이후 도 입 된 이미지 데이터 구조, 자동 할당 메모리, 메모리 누 출 문제 가 없 는 대상 지향 데이터 구조 다.두 부분 으로 나 뉘 어 져 있 습 니 다. 머리 와 데이터 부분 인 IplImage 는 2001 년 OpenCV 발표 이후 존재 해 왔 습 니 다. C 언어 스타일 의 데이터 구조 로 개발 자가 스스로 메모 리 를 분배 하고 관리 해 야 합 니 다. 큰 프로그램 을 사용 하면 메모리 누 출 문제 가 발생 하기 쉽 습 니 다.
Mat 대상 상용 구조 함수
1. Mat () 는 Mat 대상 을 만 들 고 구조 할 때 어떠한 조작 도 하지 않 습 니 다.
//    Mat  
Mat img;

2. Mat (int rows, int cols, int type) 사용자 가 지정 한 줄 수, 열 수, 유형 에 따라 Mat 대상 을 만 듭 니 다.
//    3*3   ,    8      uchar  ,     1 Mat  
Mat img= Mat(3,3,CV_8UC1);

3. Mat (Size size, int type) 사용자 가 지정 한 크기 와 유형 에 따라 Mat 대상 을 만 듭 니 다.
//         Mat  src,  src   ,    3*3   ,    8      uchar  ,     1 Mat  
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat img= Mat(src.size(),CV_8UC1);

4. Mat (int rows, int cols, int type, const Scalar & s) 는 사용자 가 지정 한 줄 수, 열 수, 유형 에 따라 Mat 대상 을 만 들 고 모든 픽 셀 의 값 을 초기 화 합 니 다. 벡터 길 이 는 채널 수 에 대응 해 야 합 니 다.
//    3*3   ,    8      uchar  ,     3 Mat  ,        (127,0,255)
Mat img= Mat(3,3,CV_8UC3,Scalar(127,0,255))

5. Mat (Size size, int type, const Scalar & s) 사용자 가 지정 한 크기 와 유형 에 따라 Mat 대상 을 만 들 고 모든 픽 셀 의 값 을 초기 화 합 니 다. 벡터 길 이 는 채널 수 에 대응 해 야 합 니 다.
//         Mat  src,  src   ,    3*3   ,    8      uchar  ,     3 Mat  ,        (127,0,255)
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat img= Mat(src.size(),CV_8UC3,Scalar(127,0,255));

6. 배열 구 조 는 행렬 데이터 로 Mat 대상 을 구성한다.
//  3*3
// 0  -1  0
// -1  5  -1
//  0  -1  0
// Mat  
Mat mat = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);

Mat 대상 상용 방법
1. void copyTo (Mat mat) Mat 대상 딥 카피
// src        dst   
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
src.copyTo(dst);

2. void converto (Mat dst, int type) Mat 대상 전환 함수
// src       8      uchar  ,     3 Mat  (               )
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
str.converto(dst,CV_8UC3);

3. Mat clone () Mat 대상 딥 카피
// src        dst   
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
dst.clone(src);

4. int channels () 현재 그림 을 가 져 오 는 채널 수
//  src    
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
int channel = src.channels();

5. int depth () 현재 그림 의 깊이 가 져 오기
//  src   
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
int channel = src.depth();

6. bool empty () 그림 이 비어 있 는 지 판단 합 니 다.
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
src.empty(); //false
dst.empty(); //true

7. uchar * ptr (i = 0) 현재 그림 의 지침 가 져 오기
//  src          
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
const unchar* fisrtRow = src.ptr(0);

8. Mat zeros (int rows, int cols, int type) 는 0 개의 Mat 대상 을 만 듭 니 다.
//  2*2    8      uchar  ,     1  0 Mat  
Mat img = Mat::zeros(2,2,CV_8UC1)

9. Mat eye (int rows, int cols, int type) 대각선 이 1 인 Mat 대상 만 들 기
//  2*2    8      uchar  ,     1     1 Mat  
//1  0
//0  1
Mat img = Mat::eye(2,2,CV_8UC1)
  • _Tp & at (int row, int col) 는 그림 의 이전 점 의 픽 셀 을 가 져 옵 니 다. 가 져 오 거나 수정 할 수 있 습 니 다. 그 레이스 케 일 이미지 와 RGB 이미 지 는 차이 가 있 습 니 다. / 그 레이스 케 일 이미지 에 대해 픽 셀 점 가 져 오기 및 수정 / / / 원본 이미지 Mat src = imread ("E: / OpenCV / OpenCVPicture / horse. png") 를 엽 니 다.Mat gray_src; //RGB 그림 을 그 레이스 케 일 이미지 cvtColor (src, gray src, CV BGR2GRAY) 로 변환 합 니 다. /그 레이스 케 일 이미지 가 져 오기 (0, 0) 의 픽 셀 값 uchar test = graysrc.at(0,0); //그 레이스 케 일 이미지 가 (0, 0) 있 는 픽 셀 값 을 수정 합 니 다 graysrc. at (0, 0) = 0 / RGB 이미지 에 픽 셀 점 가 져 오기 및 수정 / Mat src = imread ("E: / OpenCV / OpenCVPicture / horse. png"); /RGB 픽 셀 uchar blue = src. at (0, 0) [0] 가 져 오기; /파란색 채널 픽 셀 값 uchar green = src. at (0, 0) [1]; /녹색 채널 픽 셀 값 uchar red = src. at (0, 0) [2]; /빨간색 채널 픽 셀 값 / RGB 픽 셀 src. at (0, 0) [0] = 0; /파란색 채널 픽 셀 을 0 src. at (0, 0) [1] = 0 으로 변경 합 니 다. /녹색 채널 픽 셀 을 0 src. at (0, 0) [2] = 0 으로 변경 합 니 다. /빨간색 채널 픽 셀 을 0 으로 변경
  • 매트 대상 사용 - 네 가지 포인트
    1. 그림 을 출력 하 는 메모 리 는 자동 으로 분 배 됩 니 다. 2. OpenCV 의 C + + 인 터 페 이 스 를 사용 합 니 다. 메모리 배분 문 제 를 고려 할 필요 가 없습니다. 3. 할당 작업 과 복사 구조 함 수 는 머리 부분 만 복사 합 니 다. 4. clone 과 copy To 두 함수 로 데 이 터 를 완전히 복사 합 니 다.
    Mat 개체 생 성 (추가)
    cv:: Mat:: Mat 구조 함수 Mat M (2, 2, CV 8UC 3, Scalar (0, 0, 255) 그 중에서 앞의 두 매개 변 수 는 각각 줄 (row) 과 열 (column), 세 번 째 CV 를 나타 낸다.8UC3 중의 8 은 각 채널 이 8 위 를 차지 하고 U 는 기호 가 없 음 을 나타 내 며 C 는 Char 유형 을 나타 내 고 3 은 채널 수 를 3 으로 나타 내 며 네 번 째 매개 변 수 는 벡터 로 각 픽 셀 수 치 를 초기 화 하 는 것 이 얼마 인지 나타 내 고 벡터 길 이 는 대응 채널 수 와 일치 합 니 다.
    다 차원 배열 cv:: Mat:: create int sz [3] = {2, 2, 2} 만 들 기;Mat L(3,sz, CV_8UC1, Scalar::all(0));
    cv:: Mat:: create 실현
    Mat M;
    M.create(4, 3, CV_8UC2);
    M = Scalar(127,127);
    cout << "M = " << endl << " " << M << endl << endl;
    uchar* firstRow = M.ptr<uchar>(0);
    printf("%d", *firstRow);
    
    

    코드 사례
    #include  
    #include  
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    int main(int argc, char** args) {
         
    Mat image = imread("D:/test.jpg", IMREAD_GRAYSCALE);
    if (image.empty()) {
         
    cout << "could not find the image resource..." << std::endl;
    return -1;
    }
    namedWindow("My Image", CV_WINDOW_AUTOSIZE);
    imshow("My Image", image);
    
    Mat M;
    M.create(4, 3, CV_8UC2);
    M = Scalar(127,127);
    cout << "M = " << endl << " " << M << endl << endl;
    uchar* firstRow = M.ptr<uchar>(0);
    printf("%d
    "
    , *firstRow); Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); cout << "C = " << endl << " " << C << endl << endl; waitKey(0); return 0; }

    영상 조작
    1. 그림 읽 기 2. 픽 셀 읽 기 3. 픽 셀 값 수정
    그림 읽 기
    imread 는 그 레이스 케 일이 나 RGB 이미지 Imwrite 로 불 러 와 그림 파일 을 저장 할 수 있 습 니 다. 형식 은 확장자 에 의 해 결 정 됩 니 다.
    읽 기와 쓰기 픽 셀
    1. GRAY 픽 셀 점 의 픽 셀 값 (CV 8UC1) Scalar intensity = img. at (y, x) 읽 기;또는 Scalar intensity = img. at (Point (x, y);
    2. RGB 픽 셀 점 의 픽 셀 값 Vec3f intensity = img. at (y, x) 읽 기;float blue = intensity.val[0]; float green = intensity.val[1]; float red = intensity.val[2];
    픽 셀 값 수정
    그 레이스 케 일 이미지 img. at (y, x) = 128;
    RGB 3 채널 이미지 img. at (y, x) [0] = 128; /blue img.at(y,x)[1]=128; // green img.at(y,x)[2]=128; // red
    공백 이미지 할당 img = Scalar (0);
    ROI 는 Rect r (10, 10, 100, 100) 를 선택한다.Mat smallImg = img®;
    Vec3b 와 Vec3F
    Vec3b 가 대응 하 는 3 채널 의 순 서 는 blue, green, red 의 uchar 형식 데이터 입 니 다.
    Vec3f 3 채널 에 대응 하 는 float 형식 데이터
    CV 를8UC1 을 CV32F 1 로 전환 하면 다음 과 같다. src. convertto (dst, CV 32F);
    코드 사례
    #include  
    #include  
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    int main(int argc, char** args) {
         
    Mat image = imread("D:/test.jpg", IMREAD_COLOR);
    if (image.empty()) {
         
    cout << "could not find the image resource..." << std::endl;
    return -1;
    }
    
    int height = image.rows;
    int width = image.cols;
    int channels = image.channels();
    printf("height=%d width=%d channels=%d", height, width, channels);
    for (int row = 0; row < height; row++) {
         
           for (int col = 0; col < width; col++) {
         
                    if (channels == 3) {
         
                             image.at<Vec3b>(row, col)[0] = 0; // blue
                             image.at<Vec3b>(row, col)[1] = 0; // green
                    }
             }
    }
    
    namedWindow("My Image", CV_WINDOW_AUTOSIZE);
    imshow("My Image", image);
    waitKey(0);
    return 0;
    }
    
    

    좋은 웹페이지 즐겨찾기