[OpenCV 2] 주요 함수

Sinaenjuni·2023년 7월 8일
0

OpenCV

목록 보기
2/25

창 관련 함수

namedWindow()

새로운 창을 생성하는 함수이다.

void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
//! Flags for cv::namedWindow
enum WindowFlags {
       WINDOW_NORMAL     = 0x00000000, 
       //!< the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size.
       WINDOW_AUTOSIZE   = 0x00000001, 
       //!< the user cannot resize the window, the size is constrainted by the image displayed.
       WINDOW_OPENGL     = 0x00001000, 
       //!< window with opengl support.
       WINDOW_FULLSCREEN = 1,          
       //!< change the window to fullscreen.
       WINDOW_FREERATIO  = 0x00000100, 
       //!< the image expends as much as it can (no ratio constraint).
       WINDOW_KEEPRATIO  = 0x00000000, 
       //!< the ratio of the image is respected.
       WINDOW_GUI_EXPANDED=0x00000000, 
       //!< status bar and tool bar
       WINDOW_GUI_NORMAL = 0x00000010, 
       //!< old fashious way
    };

moveWindow()

창의 위치를 이동, 주어진 이름에 해당하는 창의 위치를 x, y 좌표로 이동시키는 함수이다.

void moveWindow(const String& winname, int x, int y);

resizeWindow()

창의 크기를 조정, 주어진 이름에 해당하는 창의 크기를 조절하는 함수이다. 창을 생성하는 namedWindow 함수의 flagsWINDOW_NORMAL 속성으로 창을 생성해야 하며, imshow() 함수보다 나중에 호출 되어야 정상적으로 동작한다.

void resizeWindow(const String& winname, int width, int height);

waitKey()

키 입력을 대기하는 함수로 프로그램이 종료되어 창이 닫히는 것을 방지한다. 인자로 정수 형태로 시간을 입력받는다. 이때 정수는 milliseconds 단위이다. 또한 입력받을 키의 코드(ESC=27, ENTER=13, TAB=9)를 반환한다. 특수 키를 입력받고 싶다면 waitKetEx()함수를 이용하면 된다. 스페이스바의 경우 공백(' ')과 비교하면 된다.

int waitKey(int delay = 0);
int waitKeyEx(int delay = 0);

destroyWindow()

주어진 이름에 해당하는 창을 닫는 함수이다.

void destroyWindow(const String& winname);

destroyAllWindows()

열려있는 모든 창을 닫는 함수이다.

void destroyAllWindows();

영상 관련 함수

imread()

이미지 파일을 읽어 Mat 객체로 반환하는 함수이다. flags는 이미지 파일을 불러올 때, 색상 옵션을 설정하는 부분이다. 주로 IMREAD_UNCHANGED, IMREAD_GRAYSCALE 그리고 IMREAD_COLOR를 주로 사용한다. 각 옵션은 원본 이미지의 색상 특성을 그대로 반영해서 불러오는 방법이며, 흑백 그리고 색상 모드로 이미지를 불러오는 방법이다.

Mat imread( const String& filename, int flags = IMREAD_COLOR );
//! Imread flags
enum ImreadModes {
       IMREAD_UNCHANGED            = -1, 
       //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation.
       IMREAD_GRAYSCALE            = 0,  
       //!< If set, always convert image to the single channel grayscale image (codec internal conversion).
       IMREAD_COLOR                = 1,  
       //!< If set, always convert image to the 3 channel BGR color image.
       IMREAD_ANYDEPTH             = 2,  
       //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
       IMREAD_ANYCOLOR             = 4,  
       //!< If set, the image is read in any possible color format.
       IMREAD_LOAD_GDAL            = 8,  
       //!< If set, use the gdal driver for loading the image.
       IMREAD_REDUCED_GRAYSCALE_2  = 16, 
       //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.
       IMREAD_REDUCED_COLOR_2      = 17, 
       //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.
       IMREAD_REDUCED_GRAYSCALE_4  = 32, 
       //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.
       IMREAD_REDUCED_COLOR_4      = 33, 
       //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.
       IMREAD_REDUCED_GRAYSCALE_8  = 64, 
       //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.
       IMREAD_REDUCED_COLOR_8      = 65, 
       //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.
       IMREAD_IGNORE_ORIENTATION   = 128 
       //!< If set, do not rotate the image according to EXIF's orientation flag.
     };

imshow()

주어진 이름의 창에 영상을 출력한다. 만약 창이 없다면 새로운 창을 만들고 그 위에 이미지를 출력한다. 입력 이미지의 데이터 타입이 InputArray인 이유는 Mat 형식 외에도 다양한 타입의 데이터를 시각화할 수 있도록 하기 위함이다.

void imshow(const String& winname, InputArray mat);

imwrite()

InputArray 타입의 변수를 파일로 저장하는 함수이다. 마지막 인자인 params는 JPG로 저장할 경우, 압축율을 지정할 때 사용되는 인자이다(e.g. {IMWRITE_JEPG_QUARITY, 90} : 압축율을 90%로 지정). 파일 저장이 정상적으로 이루어지면, true 그렇지 않으면 false를 반환한다.

bool imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
//! Imwrite flags
enum ImwriteFlags {
       IMWRITE_JPEG_QUALITY        = 1,  
       //!< For JPEG, it can be a quality from 0 to 100 (the higher is the better). Default value is 95.
       IMWRITE_JPEG_PROGRESSIVE    = 2,  
       //!< Enable JPEG features, 0 or 1, default is False.
       IMWRITE_JPEG_OPTIMIZE       = 3,  
       //!< Enable JPEG features, 0 or 1, default is False.
       IMWRITE_JPEG_RST_INTERVAL   = 4,  
       //!< JPEG restart interval, 0 - 65535, default is 0 - no restart.
       IMWRITE_JPEG_LUMA_QUALITY   = 5,  
       //!< Separate luma quality level, 0 - 100, default is -1 - don't use.
       IMWRITE_JPEG_CHROMA_QUALITY = 6,  
       //!< Separate chroma quality level, 0 - 100, default is -1 - don't use.
       IMWRITE_JPEG_SAMPLING_FACTOR = 7, 
       //!< For JPEG, set sampling factor. See cv::ImwriteJPEGSamplingFactorParams.
       IMWRITE_PNG_COMPRESSION     = 16, 
       //!< For PNG, it can be the compression level from 0 to 9. A higher value means a smaller size and longer compression time. If specified, strategy is changed to IMWRITE_PNG_STRATEGY_DEFAULT (Z_DEFAULT_STRATEGY). Default value is 1 (best speed setting).
       IMWRITE_PNG_STRATEGY        = 17, 
       //!< One of cv::ImwritePNGFlags, default is IMWRITE_PNG_STRATEGY_RLE.
       IMWRITE_PNG_BILEVEL         = 18, 
       //!< Binary level PNG, 0 or 1, default is 0.
       IMWRITE_PXM_BINARY          = 32, 
       //!< For PPM, PGM, or PBM, it can be a binary format flag, 0 or 1. Default value is 1.
       IMWRITE_EXR_TYPE            = (3 << 4) + 0, /* 48 */ 
       //!< override EXR storage type (FLOAT (FP32) is default)
       IMWRITE_EXR_COMPRESSION     = (3 << 4) + 1, /* 49 */ 
       //!< override EXR compression type (ZIP_COMPRESSION = 3 is default)
       IMWRITE_EXR_DWA_COMPRESSION_LEVEL = (3 << 4) + 2, /* 50 */ 
       //!< override EXR DWA compression level (45 is default)
       IMWRITE_WEBP_QUALITY        = 64, 
       //!< For WEBP, it can be a quality from 1 to 100 (the higher is the better). By default (without any parameter) and for quality above 100 the lossless compression is used.
       IMWRITE_HDR_COMPRESSION     = (5 << 4) + 0, /* 80 */ 
       //!< specify HDR compression
       IMWRITE_PAM_TUPLETYPE       = 128,
       //!< For PAM, sets the TUPLETYPE field to the corresponding string value that is defined for the format
       IMWRITE_TIFF_RESUNIT        = 256,
       //!< For TIFF, use to specify which DPI resolution unit to set; see libtiff documentation for valid values
       IMWRITE_TIFF_XDPI           = 257,
       //!< For TIFF, use to specify the X direction DPI
       IMWRITE_TIFF_YDPI           = 258,
       //!< For TIFF, use to specify the Y direction DPI
       IMWRITE_TIFF_COMPRESSION    = 259,
       //!< For TIFF, use to specify the image compression scheme. See libtiff for integer constants corresponding to compression formats. Note, for images whose depth is CV_32F, only libtiff's SGILOG compression scheme is used. For other supported depths, the compression scheme can be specified by this flag; LZW compression is the default.
       IMWRITE_JPEG2000_COMPRESSION_X1000 = 272 
       //!< For JPEG2000, use to specify the target compression rate (multiplied by 1000). The value can be from 0 to 1000. Default is 1000.
     };

Mat 데이터 나누기 및 합치기

void ex_split_merge(){
    Mat img = imread("../data/lenna.bmp");

    vector<Mat> channels;
    split(img, channels);
    
    imshow("img1", channels[0]);
    imshow("img2", channels[1]);
    imshow("img3", channels[2]);

    swap(channels[0], channels[2]);

    Mat merged;
    merge(channels, merged);
    imshow("merged", merged); 

    waitKey();
    destroyAllWindows();
}

시간 측정

void ex_tick_count(){
    int64 start = getTickCount();
    my_function();
    int64 end = getTickCount();
    double ms = (end - start) * 1000 / getTickFrequency();
}
void ex_tick_count(){
    TickMeter tm;
    tm.start();
    // my_function();
    tm.stop();
    cout << tm.getTimeMilli() << endl;
    tm.reset();

    tm.start();
    // my_function2();
    tm.stop();
    cout << tm.getTimeMilli() << endl;
}

마스킹을 이용한 영상 합치기

void ex_masking1(){
    Mat src = imread("../data/airplane.bmp");
    Mat mask = imread("../data/mask_plane.bmp");
    Mat det = imread("../data/field.bmp");

    copyTo(src, det, mask);

    imshow("src", src);
    imshow("mask", mask);
    imshow("det", det);

    waitKey();
    destroyAllWindows();
}

void ex_masking2(){
    Mat src = imread("../data/cat.bmp");
    Mat logo = imread("../data/opencv-logo-white.png", IMREAD_UNCHANGED);
    // 투명도 정보를 가져오기 위해서 IMREAD_UNCHANGED 플래그를 사용한다.
    Rect rect(10, 10, logo.cols, logo.rows);
    vector<Mat> planes;
    split(logo, planes);
    merge(vector<Mat>(planes.begin(), planes.begin()+3), logo);
    // 투명도를 제외한 BGR 채널만 합쳐서 3채널 이미지를 만든다.
    
    
    copyTo(logo, src(rect), planes[3]);

    imshow("rect", src(rect));
    imshow("src", src);
    cout << rect;

    waitKey();
    destroyAllWindows();
}


예외처리 관련 함수

Assert는 인자로 주어진 조건이 true가 아닌 경우에 프로그램을 종료하는 매크로 함수이다.

#define CV_Assert( expr ) do { if(!!(expr)) ; else cv::error( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ ); } while(0)

0개의 댓글