728x90

관련 설명은 앞에 블로그 "OpenCV Graph API 설명과 활용 방법"를 참고해 보시면 됩니다. Python에서도 G-API를 활용하면 가독성 높은 파이프라인 구성과 연산 최적화가 가능하여 이미지 처리 코드의 유지보수성이 크게 향상됩니다.

OpenCV G-API Python 이미지 처리 예제

아래 예제는 컬러 이미지를 입력받아 그레이스케일 변환 후 캐니 엣지 검출을 수행하는 OpenCV G-API Python 이미지 처리 파이프라인입니다.


import cv2 as cv

# 그래프 입력 정의
in_gmat = cv.GMat()

# 그래프 연산 정의
gray = cv.gapi.RGB2Gray(in_gmat)
edges = cv.gapi.Canny(gray, 50, 150)

# 그래프 컴파일
graph = cv.GComputation(cv.GIn(in_gmat), cv.GOut(edges))

# 이미지 로드
input_img = cv.imread("input.jpg")

# 그래프 실행
output = graph.apply(cv.gin(input_img))

# 결과 출력
cv.imshow("G-API Edges", output)
cv.waitKey(0)
cv.destroyAllWindows()

예제 코드 설명

cv.GMat은 실제 이미지 데이터가 아닌 그래프 상의 입력 노드를 의미합니다. RGB2Gray와 Canny 함수는 즉시 실행되지 않고 그래프 연산으로 등록됩니다.


GComputation 객체는 전체 이미지 처리 파이프라인을 정의하며, apply 호출 시 그래프가 최적화되어 한 번에 실행됩니다. 이 방식은 불필요한 중간 결과 생성을 줄이는 데 효과적입니다.

 

 

처리 결과는 아래와 같이 원본 이미지와 처리 이미지이며 속도에 최적화 되어 있습니다. Canny Edge 결과를 볼 수 있습니다.

 

OpenCV G-API Canny Edge Result

728x90
728x90

OpenCV Graph API 정의

OpenCV Graph API(G-API)는 영상 처리 파이프라인을 그래프 구조로 정의하고, 이를 효율적으로 실행하기 위한 API입니다. 기존 OpenCV 함수 호출 방식과 달리, G-API는 연산 간의 의존성을 명시적인 그래프(DAG)로 표현하여 최적화된 실행을 가능하게 합니다. 특히 임베디드 환경, 멀티코어 CPU, OpenVINO 기반 추론 환경에서 성능 향상과 코드 구조 개선이라는 장점을 제공합니다.

OpenCV Graph API의 핵심 개념과 특징

1. 연산 그래프 기반 처리
G-API는 이미지 처리 과정을 노드(Node)와 엣지(Edge)로 구성된 그래프로 표현합니다. 각 노드는 연산을 의미하며, 데이터 흐름이 명확하게 정의됩니다.

2. 지연 실행(Lazy Evaluation)
그래프는 즉시 실행되지 않고 compile 또는 apply 시점에 한 번에 최적화되어 실행됩니다. 이를 통해 불필요한 메모리 복사와 중복 연산을 줄일 수 있습니다.

3. 백엔드 독립성
동일한 그래프를 CPU, OpenCL, OpenVINO 등 다양한 백엔드에서 실행할 수 있어 확장성과 이식성이 뛰어납니다.

4. 파이프라인 최적화
프레임 단위가 아닌 스트리밍 기반 처리가 가능하여 실시간 영상 처리에 적합합니다.

OpenCV Graph API 기본 사용 예제(C/C++)

아래 예제는 입력 이미지를 그레이스케일로 변환한 뒤 캐니 엣지를 검출하는 간단한 G-API 파이프라인입니다.


#include <opencv2/gapi.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>

int main() {
    // 1. 입력 이미지 정의 (그래프 입력 노드)
    cv::GMat in;

    // 2. 그래프 연산 정의
    // 입력 이미지를 그레이스케일로 변환
    cv::GMat gray = cv::gapi::RGB2Gray(in);

    // 캐니 엣지 검출 수행
    cv::GMat edges = cv::gapi::Canny(gray, 50, 150);

    // 3. 그래프 컴파일 및 실행
    cv::Mat input = cv::imread("input.jpg");
    cv::Mat output;

    cv::GComputation graph(cv::GIn(in), cv::GOut(edges));
    graph.apply(cv::gin(input), cv::gout(output));

    // 4. 결과 출력
    cv::imshow("Edges", output);
    cv::waitKey(0);
    return 0;
}


GMat은 실제 데이터가 아닌 그래프 상의 데이터 노드이며, 모든 연산은 그래프에 등록된 뒤 한 번에 실행됩니다. 이 방식은 복잡한 영상 처리 파이프라인에서도 가독성과 유지보수성을 크게 향상시킵니다.

OpenCV Graph API 활용 사례

실시간 영상 스트리밍 처리, OpenVINO 기반 추론 파이프라인, 멀티코어 CPU 최적화, 임베디드 및 저전력 디바이스 환경에서 Graph API는 매우 효과적으로 활용될 수 있습니다. OpenCV Graph API는 고성능 영상 처리 프레임워크로 OpenCV를 확장해주는 핵심 기술입니다.

728x90

+ Recent posts