화인스텍 로고

지식정보

제품사용 매뉴얼

EURESYS_LIBRARY_Open eVision 프로그래밍 가이드

2022-10-26

 

1. 소개

 

Open eVision은 이미지 처리와 분석을 위한 Software Tool이며, 이미지 획득을 위한 3’rd party device를 지원합니다.

Host memory에서 이미지 처리 수행됩니다.

사용자의 Application에 통합할 수 있게 설계되어 있습니다.

Libraries(DLLs), .NET classes

개발 환경에 대해 광범위하게 지원

 

Libraries 구성

32/64bit libraries : C++ / .NET

 

참고 문서

사용자가 사용하기 쉽게 HTML Documentation 형태로 제공합니다.

C++ / .NET 예제 제공

Open eVision 22.04: https://documentation.euresys.com/Products/OPEN_EVISION/OPEN_EVISION_22_04/ko-kr/Content/00_Home/home.htm

튜토리얼

HTML Documentation에서 알고리즘 별 Step by Step 교육 자료를 제공합니다.

Open eVision 의 주요 기능에 대해 중요한 설명이 포함되어 있습니다.

테스트를 위한 샘플 이미지도 제공합니다.

 

Visual C++ MFC MBCS Library for Visual Studio 2013이 반드시 설치되어 있어야 합니다.

MSVC와 같은 C++ 컴파일러가 반드시 설치되어 있어야 합니다.

가상 시스템에 제품을 설치할 수 없습니다.

 

2. 기초 설명

 

이미지 구조

이미지 구조화 각 용어의 설명

Pointer: 메모리상에 존재하는 이미지 버퍼의 시작 주소.

Width: 이미지의 가로 크기.

Height: 이미지의 세로 크기.

Padding Data: 4byte 정렬을 맞추기 위한 데이터.

Buffer Pitch: 패딩(Padding) 데이터를 포함한 전체 가로 크기.

이미지 관심 영역 (Region Of Interrest)

ROI

이미지의 관심 영역을 직사각형으로 제공합니다.

다음과 같은 상속 관계입니다.

ROI를 이미지에 붙여 (Attach) 사용합니다.

Region

이미지의 관심 영역을 임의의 모양으로 제공합니다.

여러 개의 Region을 연산하여 새로운 Region을 생성할 수 있습니다.

해당 기능을 Open eVision Studio에서 제공하지 않습니다. 코드에서만 사용가능합니다.

 

서브 픽셀 (Sub-Pixel)

다음의 라이브러리에서 1/10 수준으로 제공합니다.

EasyMatch

EasyFind

EasyGauge

EasyObject

 

EasyMatch만 서브 픽셀 선택이 가능합니다.

그 외의 모든 라이브러리는 사용자가 선택할 수 없습니다.

멀티 코어 처리

기본적으로 병렬 처리는 비활성화 되어 있습니다.

시스템에서 사용 가능한 물리적 CPU 코어 수를 확인하고, 설정할 수 있습니다. (하이퍼 스레딩 제외)

Thread-Safe 클래스

Open eVision은 멀티 스레드에 의한 동시 실행은 지원하지만, 데이터는 한번에 하나의 스레드에서만 접근이 가능합니다.

3. SDK 사용 방법

 

예제 코드

Open eVision 리소스의 기본 경로는 다음과 같습니다.Open eVision 리소스의 기본 경로는 다음과 같습니다.

예제 코드: C:\Users\Public\Documents\Euresys\Open eVision XX.YY\Sample Programs

예제 이미지: C:\Users\Public\Documents\Euresys\Open eVision XX.YY\Sample Images

딥 러닝, 3D 관련 자료는 홈페이지에서 다운받아야 합니다.

https://www.euresys.com/ko/Support/Download-area?Series=9de20c1e-c26c-470c-a5ae-93a48539b4e0

 

편집하며 계속하기

Open eVision은 ‘편집하며 계속하기‘ 기능을 지원하지 않습니다.

편집하며 계속하기는 메모리를 저장, 재컴파일 그리고 메모리 교체가 발생합니다.

메모리가 단순한 상태가 아닐 때 실패할 가능성이 있으며, Open eVision을 이용한 메모리 매핑은 간단하지 않습니다.

편집하며 계속하기 기능으로 라이선스 프로세스가 다시 시작되어, 오랜 시간이 걸릴 수 있습니다.

 

라이브러리 참조 방법

C++

‘프로젝트 속성 > C/C++ > 일반 > 추가 포함 디렉터리’에 라이브러리 include 경로를 추가합니다.

기본 경로: C:\Program Files (x86)\Euresys\Open eVision XX.YY\Include

‘프로젝트 속성 > C/C++ > 명령줄’에 -Zm256과 /bigobj 옵션을 추가합니다.

다음의 헤더 파일을 추가합니다.

C#

솔루션 플랫폼을 x86 또는 x64 중 하나만 사용합니다(Any CPU는 지원하지 않습니다.).

플랫폼에 맞는 ‘프로젝트 > 참조’에 Open_eVision_NetApi_XX_YY.dll 파일을 추가합니다.

기본 경로: C:\Program Files (x86)\Euresys\Open eVision XX.YY\Bin32 또는 Bin64

다음의 네임스페이스를 추가합니다.

라이선스 모델 지정

라이선스 초기화 과정에서 생기는 지연을 방지하기 위해, 사용하는 모델만 설정하여 지연 시간을 최소화 합니다.

어떠한 Open eVision Library API를 호출하기 전에, 반드시 최초로 호출합니다.

라이선스 모델은 다음과 같이 열거형으로 정의되어 있습니다.

여러 개의 라이선스 모델을 사용한다면, 다음과 같이 호출합니다.

초기화

어떠한 Open eVision Library API를 호출하기 전에, 반드시 최초로 호출합니다.

앞에서 설명한 Preconfiguration 이후에 호출합니다.

해제

더 이상 Open eVision Library API를 사용하지 않는다면, 가장 마지막에 호출합니다.

예외 처리

Open eVision Library는 에러가 발생하면 예외를 던집니다.

사용자는 반드시 try-catch를 사용하여 예외를 처리해야 합니다.

예외를 처리하지 않으면, 예외 발생 시 프로그램이 비정상 종료될 수 있습니다.

.NET 객체 관리

객체 관리

.NET에서 Open eVision Library를 사용할 때, 더 이상 사용되지 않는 객체는 Dispose()를 호출할 것을 적극 권장합니다.

Garbage Collector가 .NET객체를 적절하게 해제하는 반면, Open eVision Library 객체는 그렇지 못하기 때문입니다.

연관된 객체 관리

일부 객체는 내부에 다른 객체가 연관되어 있습니다.

연관된 객체에 접근한 후 순서대로 적절하게 해제해야 합니다.

C++ dll에서 사용하기 -dll 내부에서만 객체 사용하기

주의 사항

Preconfiguration을 제외한 Open eVision API 호출 전에, 반드시 Easy::Initialize()를 먼저 호출합니다.

더이상 Open eVision API를 사용하지 않는다면, Easy::Terminate()를 호출합니다.

Open eVision 객체를 전역(Global object)으로 사용하지 않습니다.

C++ dll에서 사용하기 - dll 외부에서 dll 내부로 객체 넘기기

주의 사항

Preconfiguration을 제외한 Open eVision API 호출 전에, 반드시 Easy::Initialize()를 먼저 호출합니다.

더이상 Open eVision API를 사용하지 않는다면, Easy::Terminate()를 호출합니다.

Open eVision 객체를 전역(Global object)으로 사용하지 않습니다.

동일한 버전의 Open eVision Library를 dll 내부, 외부에서 사용합니다.

C++ dll에서 사용하기 - dll 외부에서 dll 내부로 포인터 넘기기

주의 사항

Preconfiguration을 제외한 Open eVision API 호출 전에, 반드시 Easy::Initialize()를 먼저 호출합니다.

더이상 Open eVision API를 사용하지 않는다면, Easy::Terminate()를 호출합니다.

Open eVision 객체를 전역(Global object)으로 사용하지 않습니다.

동일한 버전의 Open eVision Library를 dll 내부, 외부에서 사용합니다.

3'rd party 버퍼 연동하기

버퍼 연결

이미지 컨테이너 객체에 버퍼(예: 카메라)를 연결하기 위해 SetImagePtr()를 사용합니다.

width : 이미지의가로크기(픽셀 단위).

height : 이미지의세로크기(픽셀 단위).

imagePointer : 4byte 정렬된 버퍼의 시작 주소.

bitsPerRow : 패딩 데이터가 포함된, 행의 전체 비트 수. 이 값이 0 또는 없다면, 4byte(32bit) 배수에 맞춰 가능한 가장 작은 값이 계산됨.

 

주의 사항

해당 함수는 깊은 복사가 아닙니다. imagePointer가 삭제되거나 내용이 달라지면 이미지 컨테이너 객체도 영향을 받습니다.

 

기본적으로, Open eVision은 이미지 버퍼가 4byte(32bit) 정렬이 되어있다고 가정합니다. 이는 이미지의 모든 행의 시작 주소가 4의 배수임을 의미합니다.

또한, 이미지의 가로 크기가 4의 배수라면 문제가 없지만, 4의 배수가 아니라면 이미지 정렬에 문제가 생깁니다.

이미지가 4의 배수가 아니라면, bitsPerRow 인자에 값을 넣어야 합니다.

이미지 버퍼의 버퍼 피치를 취득하여 bit로 변환하여 인자를 넘깁니다.

즉, 8bit 기준으로 buffer pitch * 8 을 인자로 넘겨야 하며, 이 값은 32배수여야 합니다.

만약, SDK에서 버퍼 피치를 얻을 수 없고, 이미지 정렬에 문제가 생긴다면 카메라의 가로 크기를 4의 배수로 맞춰야 합니다.

 

코드 예시

4의 배수인 경우

4의 배수가 아닌 경우

첨부파일